Сброс указателя на начало файла

Как бы я мог reset указатель на начало ввода или файла командной строки. Например, моя функция читает строку из файла и выводит ее с помощью getchar()

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

После запуска указатель указывает на EOF im, предполагающий? Как я могу заставить его указать на начало файла снова/или даже перечитать входной файл

im вводит его как (./function < inputs.txt)

Ответ 1

Если у вас есть FILE* кроме stdin, вы можете использовать:

rewind(fptr);

или

fseek(fptr, 0, SEEK_SET);

to reset указатель на начало файла.

Вы не можете сделать это для stdin.

Если вам нужно reset указатель, передать файл в качестве аргумента в программу и использовать 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;
}

Ответ 2

Канальный/перенаправленный ввод не работает так. Ваши варианты:

  • Прочитайте ввод во внутренний буфер (что вы, похоже, уже делаете); или же
  • Вместо этого передайте имя файла в качестве аргумента командной строки и делайте это по своему усмотрению.