コマンドライン引数に応じて、指定されたファイルまたは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
予期しない結果が得られます。これは予想される動作ですか?もしそうなら、ストリーム内の別の場所に移動するにはどうすればよいですか?
例えば:
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);
}