Использование fseek с указателем файла, указывающим на stdin

В зависимости от аргументов командной строки я устанавливаю указатель файла, указывающий либо на указанный файл, либо на stdin (для целей конвейера). Затем я передаю этот указатель множеству различных функций для чтения из файла. Вот функция для получения указателя файла:

FILE *getFile(int argc, char *argv[]) { FILE *myFile = NULL; if (argc == 2) { myFile = fopen(argv[1], "r"); if (myFile == NULL) fprintf(stderr, "File \"%s\" not found\n", argv[1]); } else myFile = stdin; return myFile; } 

Когда он указывает на stdin, fseek , похоже, не работает. Под этим я подразумеваю, что я использую его, а затем использую fgetc и получаю неожиданные результаты. Является ли это ожидаемым поведением, и если да, то как мне перемещаться в разные места в streamе?

Например:

 int main(int argc, char *argv[]) { FILE *myFile = getFile(argc, argv); // assume pointer is set to stdin int x = fgetc(myFile); // expected result int y = fgetc(myFile); // expected result int z = fgetc(myFile); // expected result int foo = bar(myFile); // unexpected result return 0; } int bar(FILE *myFile) { fseek(myFile, 4, 0); return fgetc(myFile); } 

Да, совершенно нормально, что fseek не будет работать на stdin – он будет нормально работать только с файлом на диске или с чем-то достаточно похожим.

Хотя это действительно POSIX, вы обычно можете использовать if (isatty(fileno(myFile))) чтобы получить хотя бы довольно хорошее представление о том, будет ли поиск работать в определенном файле. В некоторых случаях isatty и / или fileno будут иметь лидирующий символ подчеркивания (например, IIRC версии, предоставленные компиляторами Microsoft).

Fseek () основан на lseek (), а на странице lseek man обсуждаются возможные ошибки, в том числе:

  [ESPIPE] Fildes is associated with a pipe, socket, or FIFO. 

Если stdin подключен к псевдо-tty, я считаю, что он будет иметь поведение сокетов.

  • Прочитайте файл / URL-адрес по строке в Swift
  • .NET. Как проверить, является ли путь файлом, а не каталогом?
  • Преобразование dta-файла в csv без программного обеспечения Stata
  • Как сортировать очень большие файлы
  • Как получить фактические (локализованные) имена папок?
  • Программирование на Android: с чего начать создавать простой браузер файлов?
  • Как открыть предпочтительный редактор системы пользователей для данного файла?
  • Чтение UTF-8 - маркер спецификации
  • Java - поиск файлов в каталоге
  • для IE дает полный путь, требуется только имя файла
  • Смешивание файлов и циклов
  • Давайте будем гением компьютера.