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