2

私は大学のオペレーティングシステムコースでファイルシステムに関するプロジェクトを行っています。私のCプログラムは、人間が読めるファイルの単純なファイルシステムをシミュレートする必要があるため、ファイルは行に基づいている必要があり、行は「セクター」になります。上書きするには行が同じ長さでなければならないことを知ったので、行の終わりまでASCIIゼロでパディングし、後で埋めることができるASCIIゼロの行を一定量残します。

今、私はテストプログラムを作成して、希望どおりに機能するかどうかを確認していますが、そうではありません。私のコードの重要な部分:

file = fopen("irasproba_tesztfajl.txt", "r+"); //it is previously loaded with 10 copies of the line I'll print later in reverse order  

  /* this finds the 3rd line */
 int count = 0; //how much have we gone yet?
 char c;

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

 fflush(file);

 fprintf(file, "- . , M N B V C X Y Í Ű Á É L K J H G F D S A Ú Ő 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);

今は何もしません。ファイルは同じままです。何が問題なのですか?

ありがとうございました。

4

1 に答える 1

7

ここから、

「+」オプションを指定してファイルを開くと、ファイルの読み取りと書き込みの両方が可能になります。ただし、入力操作の直後に出力操作を実行することはできません。間に「巻き戻し」または「fseek」を実行する必要があります。同様に、出力操作の直後に入力操作を実行することはできません。間に「巻き戻し」または「fseek」を実行する必要があります。

でそれを達成しましたfflushが、目的の場所に書き込むにはfseek戻る必要があります。これは私がそれを実装した方法です-私が推測するより良いかもしれません:

 /* this finds the 3rd line */
 int count = 0; //how much have we gone yet?
 char c;
 int position_in_file;

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

 // Store the position
 position_in_file = ftell(file);
 // Reposition it
 fseek(file,position_in_file,SEEK_SET); // Or fseek(file,ftell(file),SEEK_SET);

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

また、コメントされているように、ファイルが正常に開かれたかどうかを確認する必要があります。つまり、に読み書きする前にfile、次を確認してください。

file = fopen("irasproba_tesztfajl.txt", "r+");
if(file == NULL)
{
  printf("Unable to open file!");
  exit(1);
}
于 2010-03-24T19:19:38.010 に答える