0

テキストファイルの特定の行を削除するプログラムのコーディングを手伝ってもらえますか。

私は使用することを計画しています:

  1. fgetsはテキストファイルから行をキャプチャして配列に格納しますが、fgetsはどのように行を配列に格納するのか混乱しました(行をキャプチャして最初のインデックスに格納し、次に行をキャプチャするときにこれは次のインデックスに保存されますか、それとも配列の最初のインデックスを上書きしますか?)

  2. 行が異なるインデックスに格納されている場合は、ユーザーの入力をキャプチャされたfgetsの行と比較する条件があり、それが等しい場合は、行をスキップして、ファイルの終わりに達するまでルールを実行します。

  3. 次に、このfclose(stream)のようにテキストファイルを閉じ、「wt」として再度開いて、ファイルに書き込まれたすべてを上書きします。

私は正しいロジックを持っていますか...またはあなたはより良い解決策を提案することができます...fgetsがどのように行を配列に格納するかを理解するのを手伝ってくれることを願っています...

ところで、これは私がテストのために試しているコードです:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct studentinfo{
       char id[8];
       char name[30];
       char course[5];
}s1;
int main(void){
     FILE *stream = NULL;
     stream = fopen("studentinfo.txt", "rt");

     char arr[100];
     int i=0;

    while(!feof(stream)){  
     fgets(arr, 100, stream);
     printf("%s", arr);
     }
     fclose(stream);
/*planning to reopen the stream but will change "rt" to "wt"*/

     getch();
}
4

1 に答える 1

1

さて、ディスクスペースが許せば、私は次のことをします:

  • 読み取り用に入力ファイルを開く
  • 書き込み用に(同じディレクトリにある)一時ファイルを開きます
  • 入力ファイルの最後ではない場合:
    • 入力ファイルから行を読み取る
    • 探している行と一致しない場合は、出力ファイルに書き出します
  • 両方のファイルを閉じる
  • 入力ファイルを削除します
  • 一時ファイルの名前を変更して、入力ファイルの名前を付けます

これにより、(ほぼ)ファイル全体をメモリに保持する必要がなくなります。

また、ファイルの書き込み中にプログラムが停止(または強制終了)された場合、入力ファイルの一部が永久に失われる可能性があるという問題もありません。

于 2010-12-04T11:59:13.793 に答える