# Datei auslesen



## Flo1980Ma (4. Dezember 2006)

Hallo, hab ein kleines Problem  

Ich möchte eine Datei die ungefähr so aussieht  "Modelle.txt"

15|3.0|4.5| ...
34|9,1|6.4| ...

```
in Arrays einlesen, wobei jeder Wert zu einem bestimmten Objekt gehört.
z.B.   "int PosNr.[i]|double xKoord[i]|yKoord[i]| ..."
```

Das "|" ist jeweils das Trennzeichen zwischen den einlenen Werten.

Vielleicht kann mir jemand weiterhelfen, wie man die Anzahl der Zeilen ermittelt und die Werte dann in die richtigen Felder einliest.

Vorab schon mal Danke


----------



## deepthroat (4. Dezember 2006)

Hi.

Lies doch einfach zeilenweise ein, untersuche jede Zeile und trenne die Werte die da drin stehen. Dann kannst du sie in die entsprechenden Elemente eintragen.

Gruß


----------



## Supa (5. Dezember 2006)

Hy, ich hatte mir mal ne Funktion zum Zeilenweise einlesen geschrieben.


```
vector<string> laden(String datei)
{
   vector<string> inhalt;

   if (FileExists(datei))
   {
      string buffer;
      ifstream file(datei.c_str());

      while (file.good()) {
         getline(file,buffer,'\n');
         inhalt.push_back(buffer);
      }

      file.close();
   }
   else
   {/*Datei extistiert nicht*/

   }
   return inhalt;
}
```

Danach hast du einen String-Vector dessen Elemente die Zeilen deiner Datei sind. Nun musst du die einzelnen Strings einfach nur noch z.B. in einer Schleife durchlaufen, jeweils nach deinen Trennzeichen suchen und die Werte in ein Array oder einen neuen Vector oder direkt in die Objekte (...whatever...) einlesen, Feritg.

mfg


----------



## deepthroat (5. Dezember 2006)

Hi.

@Supa: Erstmal hat Flo1980Ma leider nicht verraten ob er überhaupt C++ benutzt - du hast also mit 50% Wahrscheinlichkeit das Thema verfehlt.

Dann ist dein Code leider nicht korrekt. Das Standardidiom um in C++ von einem Stream zeilenweise einzulesen sieht so aus:

```
string line;
istream str;

while (getline(str, line)) {
  ...
}
```
Wenn man es unbedingt anders machen will, sollte man einen guten Grund haben und wissen was man tut.

Gruß


----------



## Supa (5. Dezember 2006)

Hab ich etwa geschrieben, das er diese Funktion benutzen MUSS? Ich glaube nicht! Sollte nur ein Vorschlag zur schnellen Hilfe sein, kein Grund dem Post direkt in der Luft zu zerreisen!

"Standardidiom" hin oder her, ich hab sie so geschrieben, setze sie so ein und sie erfüllt ihren Zweck bei mir tadellos.

Desweiteren war dein Beitrag im Grude auch trivial. "Zweilenweise einlesen, und trennen", ich könnt mir vorstellen, das er soweit auch schon gedacht hat!

Naja, lassen wir die Spekulationen und konzentrieren uns auf sein Probelm...

bis dahin

mfg


----------



## deepthroat (5. Dezember 2006)

Supa hat gesagt.:


> "Standardidiom" hin oder her, ich hab sie so geschrieben, setze sie so ein und sie erfüllt ihren Zweck bei mir tadellos.


Naja, Ignoranz ist Glückseligkeit.  



Supa hat gesagt.:


> Desweiteren war dein Beitrag im Grude auch trivial. "Zweilenweise einlesen, und trennen", ich könnt mir vorstellen, das er soweit auch schon gedacht hat!


Nein, ich denke nicht. Sonst hätte er nicht gefragt wie man die Anzahl der Zeilen ermitteln könnte - was wenn man sukzessive Zeile für Zeile vorgeht nicht von Belang ist.

Ich finde viel mehr dein Beitrag war trivial, denn wie man zeilenweise einliest ist hier schon hundertmal (besser) im Forum gepostet worden. Man muss nur die Suchfunktion benutzen und ich gehe (optimistischerweise) davon aus, das Flo1980Ma dies auch geschafft hätte.

Gruß


----------



## Flo1980Ma (5. Dezember 2006)

Hallo, danke für eure schnelle antwort, das ganze findet in C++ statt, 

momentan hab ich eine Methode gebastelt die wie folgt aussieht, der Cmpiler spuckt mir aber immer noch 2 Fehler aus:

.h

```
const char datei[] = "Modelle.txt";
int Anzahl_Modelle = 500;
struct Modell
{
	int Pos_Nr;
	double Start_Vector_X[10];
	double End_Vector_X[10];
	double Start_Vector_Y[10];
	double End_Vector_Y[10];
};

class Modelle_Einlesen
{

public:

	
	Modell *modelle[]; 

	Modelle_Einlesen(void);
	
	bool readFile();

public:
	~Modelle_Einlesen(void);
};


.cpp

#include "Modelle_Einlesen.h"
#include <iostream>
#include <fstream>
#include <string>
using namespace std;



int main()
{

}

Modelle_Einlesen::Modelle_Einlesen(void)
{
}

Modelle_Einlesen::~Modelle_Einlesen(void)
{
}




bool Modelle_Einlesen::readFile()
{
    ifstream infile( datei, ios::in |ios::binary );

	if( infile.fail() )     
       return false;

	// Felder der Modelle füllen
	char zeichen;   // Zeichen lesen
	
	string buffer;
	while( infile.getline() )
	{	
		strcpy( buffer, infile.getline() ); 
		int Segment = 0;  // Segment des jeweiligen[i] Modells

		if ( buffer.get(zeichen)== "|"){Modell_Zuordnung += 1;}
		
		switch(Modell_Zuordnung)
		{
			case '0': 
				strcpy( modelle[i]->Pos_Nr, buffer.get(zeichen) );					
				break;
			case '1': 
				strcpy( modelle[i]->Start_Vector_X[Segment], infile.buffer(zeichen) );
				break;
				case '2':
					strcpy( modelle[i]->End_Vector_X[Segment], infile.buffer(zeichen) );
					break;
				case '3':
					strcpy( modelle[i]->Start_Vector_Y[Segment], infile.buffer(zeichen) );
					break;
				case '4':
					strcpy( modelle[i]->End_Vector_Y[Segment], infile.buffer(zeichen) );
					break;
				default: 
					Modell_Zuordnung = 1;
					Segment += 1;
					break;			
			}
	    
	
	}

     if( !infile.eof())
       return false;         
     else
       return true;
}


Compiler:

1>------ Erstellen gestartet: Projekt: Nesten, Konfiguration: Debug Win32 ------
1>Kompilieren...
1>Modelle_Einlesen.cpp
1>.\Modelle_Einlesen.cpp(36) : error C2661: 'std::basic_istream<_Elem,_Traits>::getline': Keine überladene Funktion akzeptiert 0 Argumente
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>.\Modelle_Einlesen.cpp(36) : fatal error C1903: Weiterverarbeitung nach vorherigem Fehler nicht möglich; Kompilierung wird abgebrochen.
1>Das Buildprotokoll wurde unter "file://d:\Diplom Arbeit\CProgrammierung\Nesten\Nesten\Nesten\Debug\BuildLog.htm" gespeichert.
1>Nesten - 2 Fehler, 0 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
```


----------



## deepthroat (6. Dezember 2006)

Hi.

Bitte verwende für Quellcode den du hier postest die entsprechenden Code-Tags ([c]...[/c] für C und [code=cpp]...[/code] für C++ usw.). Der Code ist dadurch weitaus besser lesbar. (Tip: Du kannst deinen Beitrag auch noch nachträglich bearbeiten!)

Dann müßtest du eigentlich sofort von selbst darauf kommen was du falsch gemacht hast wenn du mal deinen Code mit dem Codeschnipsel vergleichst den ich gepostet habe:





			
				Flo1980Ma hat gesagt.:
			
		

> ```
> ifstream infile( datei, ios::in |ios::binary );
> string buffer;
> 
> ...





			
				deepthroat hat gesagt.:
			
		

> ```
> string line;
> istream str;
> 
> ...


Frage: was ist da anders? (Tip vom Compiler: 'infile::getline': Keine überladene Funktion akzeptiert 0 Argumente)



			
				Flo1980Ma hat gesagt.:
			
		

> ```
> strcpy( buffer, infile.getline() );
> ```


Du mischt hier C mit C++. Du kannst einen std::string nicht mit strcpy verwenden.

Gruß


----------

