Probleme beim ändern des Inhalts einer Textdatei



  • Tag zusammen,
    für mein derzeitiges Vorhaben ist es notwendig gewisse Verwaltungsdaten in einer Textdatei abzuspeichern, ggf. zu ändern und neue Daten eintragen zu können. Dies klappt im Grunde genommen auch, jedoch tritt ein mir nicht zu erklärender Fehler auf. Meine Textdatei hat eine feste erste Zeile und die restlichen Zeilen werden nach und nach angefügt, doch wenn ich meine Funktion mehrere Male aufrufe kommt es manchmal dazu, dass die ersten beiden Buchstaben der 2. Zeile verschwinden. Die geschieht obwohl ich eigentlich nur die erste Zeile einlese, abändere, wieder eintrage und anschließend an das Ende der Datei eine neue Zeile anhänge. Demnach mache ich ja garnichts mit der 2. Zeile was diese verändern könnte?
    Ich steh da gerade ein wenig aufm Schlauch, bin froh über jede Hilfe.
    Hier der relevante Teil meines Codes:

    char *c = (char*)malloc(30);
     fgets(c,30,verwaltung);			//erste Zeile auslesen
     blocksize = atoi(strtok(c,";"));
     int blockcount = atoi(strtok(NULL,";"));
     int usedBlocks = atoi(strtok(NULL,";"));
     int data = atoi(strtok(NULL,";"));
     fseek(verwaltung,0L,SEEK_SET);
     fprintf(verwaltung,"%d;%d;%d;%d;\n\0",blocksize,blockcount,(usedBlocks+blocks),data+1);	//erste Zeile erneuern
     fseek(verwaltung,0L,SEEK_END);
     fprintf(verwaltung,"%s;%lu;%d;",name,attribute.st_size,blocks);	//neue Zeile ans Ende anfügen
     strcat(source,".");
     char *endung = (char*)malloc(10);	
     strtok(source,".");
     endung = strtok(NULL,".");
     fprintf(verwaltung,"%s;",endung);
     int j;
     for(j=1;j<=blocks;j++){
        fprintf(verwaltung,"%d;",(usedBlocks+j));	
     }
     fprintf(verwaltung,"\n\0");
     free(c);
    

    Hier ein Beispiel des Inhalts der Textdatei nach mehrmaligen eintragen:

    40000;10000;3;3;
    test7;64;1;txt;1;
    test7;64;1;txt;2;
    test9;64;1;txt;3;

    Dann trage ich eine weitere Zeile ein mit größeren Inhalt, wobei das ja eigentlich nichts ändern sollte:

    40000;10000;80;4;
    est7;64;1;txt;1;
    test7;64;1;txt;2;
    test9;64;1;txt;3;
    bild4;3107487;77;jpg;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30;31;32;33;34;35;36;37;38;39;40;41;42;43;44;45;46;47;48;49;50;51;52;53;54;55;56;57;58;59;60;61;62;63;64;65;66;67;68;69;70;71;72;73;74;75;76;77;78;79;80;

    Und wie man sieht fehlt in der 2. Zeile komischerweise der erste Buchstabe...



  • Kann es sein, dass dein Problem auftritt, wenn die Variablen in Zeile 8 mehr Stellen benötigen? (z.B. von 9 auf 10 wechseln)

    Warum malloc für 30 oder 10 Byte? Ein Array ist da besser.

    Was soll das \0 im Formatstring in Zeile 8?

    Die Zeile mit dem fopen gehört auch noch zum relevanten Teil.

    Und das ist großer Mist:

    char *endung = (char*)malloc(10); // Was soll der cast?
     strtok(source,".");        // Wohin mit dem Ergebnis?
     endung = strtok(NULL,"."); // Hier geht dir der Zeiger auf den Speicher von malloc verloren.
    


  • DirkB schrieb:

    Kann es sein, dass dein Problem auftritt, wenn die Variablen in Zeile 8 mehr Stellen benötigen? (z.B. von 9 auf 10 wechseln)

    Da hast du meine Frage ja schon vorher beantwortet. 😃

    40000;10000;3;3; 
    40000;10000;80;4; 
                 ^
    

    Du kannst in einer Datei nur überschreiben. Einfügen geht nicht.



  • Ok, also liegt es daran, dass in der ersten Zeile die Zahl zweistellig wird? Geht das denn dann wenn ich es in einem Array speichere anstatt mit malloc speicher zu reservieren? Ich setze mir ja im Grunde genommen die erste Zeile neu zusammen und möchte diese auch komplett ersetzen.
    Gibt es denn eine Möglichkeit mein vorhaben relativ simpel zu realisieren?
    //Edit:
    Hab es glaube ich gelöst.

    fprintf(verwaltung,"%d;%d;%10d;%d;\n",blocksize,blockcount,(usedBlocks+blocks),data+1);
    

    Dadurch sichere ich mir ja in der Textdatei genug Platz für große Zahlen, und bislang klappt es auch so 🙂
    Ich danke dir vielmals 👍


Anmelden zum Antworten