Datei Zeilenweise einlesen



  • Hallo,

    ich stehe gerade ein wenig auf dem Schlauch und weiß nicht wie ich die Sache angehen soll. Ich bastel gerade eine Funktion nach, die mir eine Datei Zeilenweise einliest und dann alle Zeilen zurück geben soll.
    So sieht der Code schon mal aus:

    char** ReadLineFromFile(const char* filename)
    {
    	HANDLE hFile = CreateFile(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    	if (hFile == INVALID_HANDLE_VALUE)
    	{
    		return 0; //Muss geändert werden
    	}
    
    	LARGE_INTEGER filesize;
    	if(GetFileSizeEx(hFile, &filesize) == 0)
    	{
    		return 0; //Muss geändert werden
    	}
    
    	char *content = new char[filesize.QuadPart + 1];
    	ZeroMemory(content, filesize.QuadPart + 1); 
    
    	DWORD dwBytesRead;
    	ReadFile(hFile, content, filesize.QuadPart, &dwBytesRead, NULL); //Muss geändert werden wegen Rückgabe
    	CloseHandle(hFile);
    
    	int sätze = 0;
    	for (int i = 0; i <= filesize.QuadPart; i++)
    	{
    		if(content[i] == '\n')
    		{
    			sätze++;
    		}
    	}
    
    	return 0;
    }
    

    Jetzt mein eigentliches Problem wofür ich irgendwie keine Lösung habe... Wie lese ich jede Zeile aus und gebe alle in einem Array aus?


  • Mod

    Warum benutzt Du nicht die STL, bzw. die CRT (jopen, fgets)?



  • Weil ich darauf verzichten möchte. Ich brauche eine kleine und kompakte, eigenständige Anwendung.


  • Mod

    secondsun schrieb:

    Weil ich darauf verzichten möchte. Ich brauche eine kleine und kompakte, eigenständige Anwendung.

    Was hat das verwenden der CRT mit nicht klein und nicht eigenständig zu tun?
    Verwende statisches linken und gut ists. Ansonsen programmiere halt das fopen/fgets nach und arbeite mit einem eigenen Puffer nd Lese-pointer.



  • Hi,

    du könntest in der Schleife, in der du die Sätze zählst, parallel die maximale Länge der Satzes zählen. Dann solltest du ein char-Array-Array erstellen können und darin den Text zeichenweise übernehmen.

    max_satz_laenge=0;
    for(i=0, satz_laenge=0; i<datei_anzahl_zeichen; i++){
      if(content[i]=='\n'){
        sätze++;
        if(satz_laenge>satz_laenge_max){
          satz_laenge_max=satz_laenge;
        }
        satz_laenge=0;
      }else{
        satz_laenge++;
      }
    }
    
    char ausgabe[sätze][max_satz_laenge];
    
    for(i=0, satz_index=0, satz_zeichen_index=0; i<datei_anzahl_zeichen; i++){
      if(content[i]=='\n'){
        ausgabe[satz_index++][satz_zeichen_index]='\0';
        satz_zeichen_index=0;
      }else{
        ausgabe[satz_index][satz_zeichen_index++]=content[i];
      }
    }
    

    Mein Beispiel ist in C und auch ungetestet *hüstel*. Wenn du in C++ die Möglichkeit hast, dein Ausgabearray dynamisch zu erweitern, dann solltest du auch allein mit der zweiten Schleife auskommen.

    Gruß, Balder


Anmelden zum Antworten