2 Stimmen

Überschreiben von Zeilen in einer Datei in C

Ich mache ein Projekt über Dateisysteme in einem Betriebssystemkurs an der Universität, mein C-Programm sollte ein einfaches Dateisystem in einer menschenlesbaren Datei simulieren, daher sollte die Datei auf Zeilen basieren, eine Zeile wird ein "Sektor" sein. Ich habe gelernt, dass Zeilen die gleiche Länge haben müssen, um überschrieben zu werden, also werde ich sie mit ASCII-Nullen bis zum Ende der Zeile auffüllen und eine bestimmte Anzahl von Zeilen mit ASCII-Nullen frei lassen, die später gefüllt werden können.

Jetzt erstelle ich ein Testprogramm, um zu sehen, ob es funktioniert, wie ich es möchte, aber das tut es nicht. Der kritische Teil meines Codes:

file = fopen("irasproba_tesztfajl.txt", "r+"); //vorher mit 10 Kopien der Zeile geladen, die ich später in umgekehrter Reihenfolge ausgeben werde

  /* das sucht die 3. Zeile */
 int count = 0; //wie weit sind wir schon?
 char c;

 while(count != 2) {
  if((c = fgetc(file)) == '\n') count++;
 }

 fflush(file);

 fprintf(file, "- . , M N B V C X Y Í U Á É L K J H G F D S A Ú O P O I U Z T R E W Q Ó Ü Ö 9 8 7 6 5 4 3 2 1 0\n");

 fflush(file);

 fclose(file);

Jetzt passiert nichts, die Datei bleibt unverändert. Was könnte das Problem sein?

Vielen Dank.

7voto

Jacob Punkte 33625

Von hier,

Wenn eine Datei mit der Option "+" geöffnet wird, können Sie sowohl lesen als auch schreiben. Allerdings können Sie unmittelbar nach einer Eingabeoperation keine Ausgabeoperation durchführen; Sie müssen eine Zwischen"rewind" oder "fseek" durchführen. Ebenso können Sie unmittelbar nach einer Ausgabeoperation keine Eingabeoperation durchführen; Sie müssen eine Zwischen"rewind" oder "fseek" durchführen.

Das haben Sie also mit fflush erreicht, aber um an die gewünschte Stelle zu schreiben, müssen Sie mit fseek zurückkehren. So habe ich es implementiert - es könnte besser sein, denke ich:

 /* dies findet die 3. Zeile */
 int count = 0; //wie weit sind wir schon?
 char c;
 int position_in_file;

 while(count != 2) {
  if((c = fgetc(file)) == '\n') count++;
 }

 // Position speichern
 position_in_file = ftell(file);
 // Neupositionieren
 fseek(file,position_in_file,SEEK_SET); // Oder fseek(file,ftell(file),SEEK_SET);

 fprintf(file, "- . , M N B V C X Y Í U Á É L K J H G F D S A Ú O P O I U Z T R E W Q Ó Ü Ö 9 8 7 6 5 4 3 2 1 0\n");  
 fclose(file);

Wie bereits kommentiert wurde, sollten Sie auch überprüfen, ob Ihre Datei erfolgreich geöffnet wurde, d.h. bevor Sie in file lesen/schreiben, überprüfen Sie:

file = fopen("irasproba_tesztfajl.txt", "r+");
if(file == NULL)
{
  printf("Datei kann nicht geöffnet werden!");
  exit(1);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X