Использование fseek с указателем файла, который указывает на 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;
}

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

Например:

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);
}
10
задан Tyler Treat 7 February 2011 в 03:22
поделиться