web-dev-qa-db-ja.com

ファイルの先頭へのポインターのリセット

コマンドライン入力またはファイルの開始へのポインターをリセットするにはどうすればよいですか。たとえば、私の関数はファイルから行を読み取り、getchar()を使用して出力します

    while((c=getchar())!=EOF)
    {
        key[i++]=c;
        if(c == '\n' )
        {
            key[i-1] = '\0'
            printf("%s",key);
        }       
    }

これを実行した後、ポインタはEOF imと仮定しますか?ファイルの先頭を再度指すようにするにはどうすればよいですか?

(./function <inputs.txt)として入力する

16
Kyuu

stdin以外のFILE*がある場合は、次を使用できます。

rewind(fptr);

または

fseek(fptr, 0, SEEK_SET);

ポインタをファイルの先頭にリセットします。

stdinに対してはできません。

ポインターをリセットできるようにする必要がある場合は、ファイルをプログラムに引数として渡し、fopenを使用してファイルを開き、その内容を読み取ります。

int main(int argc, char** argv)
{
   int c;
   FILE* fptr;

   if ( argc < 2 )
   {
      fprintf(stderr, "Usage: program filename\n");
      return EXIT_FAILURE;
   }

   fptr = fopen(argv[1], "r");
   if ( fptr == NULL )
   {
      fprintf(stderr, "Unable to open file %s\n", argv[1]);
      return EXIT_FAILURE;
   }

    while((c=fgetc(fptr))!=EOF)
    {
       // Process the input
       // ....
    }

    // Move the file pointer to the start.
    fseek(fptr, 0, SEEK_SET);

    // Read the contents of the file again.
    // ...

    fclose(fptr);

    return EXIT_SUCCESS;
}
29
R Sahu

パイプ/リダイレクトされた入力はそのようには機能しません。オプションは次のとおりです。

  • 入力を内部バッファに読み込みます(すでに実行しているようです)。または
  • 代わりにコマンドライン引数としてファイル名を渡し、好きなように処理してください。
4
paddy