fgets liest daten nicht aus



  • Also Ich habe da ein Phänomen auf das Ich mir keinen Reim machen kann.

    Ich habe eine txt. Datei mit Datensätzen. Ich will verschiedene Zeilen davon auslesen. Die Datei beinhaltet folgendes:

    el celular                    ,das Handy                     ,10
    la impresora                  ,der Drucker                   ,20
    

    Hier im Code soll folgendes getan werden. Zunächst wird
    Zeile 1 der .txt ausgelesen mit fgets und in low gespeichert. Kein Problem wird so über printf ausgegeben.

    Danach Positioniere ich mit fseek() auf die Zeile 2, Rufe Ich nun fgets() einmal auf so steht nichts in high drin.

    Das komische ist: Rufe ich fgets() ein zweites mal auf wird dies korrekt eingelesen.

    Warum geht es beim ersten mal nicht?

    #include <stdio.h>
    #include <stdlib.h>
    
    #define SIZE_OF_ROW 65 // Size of one Row in the file
    
    int main ()
    {
    	int low_row;
    	int high_row;
    
    	char low[SIZE_OF_ROW+1];
    	char high[SIZE_OF_ROW+1];
    
    	FILE *fptr;	
    	fptr = fopen("test.txt","r+");
    
    	low_row = 1;
    
    	fseek(fptr, (SIZE_OF_ROW* (low_row-1)),SEEK_SET);  //Go to line 1
    	fgets(low, SIZE_OF_ROW,fptr);
    
    	printf("low  %s", low);            //line 1
    
    	high_row= 2;
    
    	fseek(fptr, (SIZE_OF_ROW* (high_row-1)),SEEK_SET);  //Go to line 2
    	fgets(high, SIZE_OF_ROW,fptr);                
    //	fgets(high, SIZE_OF_ROW,fptr);        //Einkommentieren damit es tut
    
    	printf("\nhigh %s", high);       //line 2
    
    	getchar();
    	fclose(fptr);
    	return 0;
    }
    


  • Was soll der Nonsens mit dem fseek-Rumgerechne?
    Du setzt voraus, dass jede Zeile inkl. '\n' genau SIZE_OF_ROW Zeichen enthält.
    Das ist Unfug, du schaffst unnötige Abhängigkeiten.
    Du fragst keinerlei Rückgabewerte/Fehlercodes ab, auch das ist Unfug.
    Für Lesen ist r+ overdesigned.

    Nimm eine Schleife mit fgets und ausreichend großem Puffer und fertig.



  • Wutz schrieb:

    Was soll der Nonsens mit dem fseek-Rumgerechne?
    Du setzt voraus, dass jede Zeile inkl. '\n' genau SIZE_OF_ROW Zeichen enthält.
    Das ist Unfug, du schaffst unnötige Abhängigkeiten.
    Du fragst keinerlei Rückgabewerte/Fehlercodes ab, auch das ist Unfug.
    Für Lesen ist r+ overdesigned.

    Nimm eine Schleife mit fgets und ausreichend großem Puffer und fertig.

    Ich habe das Beispiel vereinfacht. Ich plane auch in die Datei zu schreiben.

    Das Jede Zeile SIZE_OF_ROW Groß ist stelle Ich anderweitig sicher.

    Das beantwortet leider nicht meine Frage warum nach dem 2ten fseek das erste fgets nichts tut.



  • Du gehst also davon aus, dass ein '\n' in deiner Datei aus genau einem Zeichen (Byte) besteht?

    Du öffnest die Datei im Text-Mode (nicht Binary-Mode) da wird das '\n' durch das/die jeweiligen Zeichen für Zeilenende vom Betriebssystem ersetzt.

    Bei Windows sind das CR und LF.



  • DirkB schrieb:

    Du gehst also davon aus, dass ein '\n' in deiner Datei aus genau einem Zeichen (Byte) besteht?

    Du öffnest die Datei im Text-Mode (nicht Binary-Mode) da wird das '\n' durch das/die jeweiligen Zeichen für Zeilenende vom Betriebssystem ersetzt.

    Bei Windows sind das CR und LF.

    Also würde es sinn machen zur reinen Speicherung auf bin umzusteigen damit man sicher die Zeichenlänge ermitteln kann?



  • sandro4912 schrieb:

    Also würde es sinn machen zur reinen Speicherung auf bin umzusteigen damit man sicher die Zeichenlänge ermitteln kann?

    Nicht nur beim speichern.
    Die Übersetzung erfolgt beim lesen und schreiben.



  • Vielen Dank. Umstieg auf bin files hat alle meine schreib / lese Probleme gelöst.

    Eine Frage hätte ich noch. Um teile aus der bin datei zu löschen öffne ich im moment eine zweite und kopiere die Parts rein die ich behalten möchte.

    Gibt es eine andere Möglichkeit mit nur einer Datei. Hinten teile abschneiden würde schon reichen. 😕


  • Mod

    sandro4912 schrieb:

    Gibt es eine andere Möglichkeit mit nur einer Datei. Hinten teile abschneiden würde schon reichen. 😕

    Da gibt's normalerweise Betriebssystemfunktionen für, pures Standard-C kennt nur deine Methode. Es ist sehr empfehlenswert, in diesem Fall systemabhängigen Code zu schreiben, weil dieser dann doch viel effizienter ist.


Anmelden zum Antworten