Tùy thuộc vào các đối số dòng lệnh, tôi đang thiết lập một con trỏ tập tin trỏ tới một tệp được chỉ định hoặc stdin (cho mục đích đường ống). Sau đó, tôi chuyển con trỏ này đến một số hàm khác nhau để đọc từ tệp. Đây là chức năng nhận con trỏ của tệp:Sử dụng fseek với một con trỏ tập tin trỏ đến 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;
}
Khi trỏ đến stdin, fseek
dường như không hoạt động. Bằng cách đó, tôi có nghĩa là tôi sử dụng nó và sau đó sử dụng fgetc
và tôi nhận được kết quả bất ngờ. Đây có phải là hành vi được mong đợi hay không và nếu có, làm cách nào để di chuyển đến các vị trí khác nhau trong luồng?
Ví dụ:
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);
}
mã ví dụ của bạn có vẻ ổn cho tôi. (trừ khi tập tin không tồn tại, nhưng điều này không liên quan đến vấn đề của bạn) –
có vẻ phù hợp với tôi. trình biên dịch là gì? bạn có thể thử in, bên trong hàm bar() cả hai con trỏ (stdin và myFile) để kiểm tra chúng giống nhau. – leonbloy
@leonbloy: Tôi đã phát hiện ra rằng vấn đề là thực sự với 'fseek()'. Dường như nó không hoạt động khi con trỏ trỏ tới stdin? Bất kỳ suy nghĩ về điều này? (Cập nhật câu hỏi) –