2010-03-23 41 views
6

Các đầu ra mã sau "bất hợp pháp tìm kiếm":ftell (stdin) gây ra bất hợp pháp tìm kiếm lỗi

#include <stdio.h> 
#include <errno.h> 
#include <string.h> 

int main() { 
    errno = 0; 
    getchar(); 
    getchar(); 
    getchar(); 
    ftell(stdin); 
    printf("%s\n", strerror(errno)); 
} 

này xảy ra khi tôi chạy "mèo script | ./a.out" cũng như khi tôi chỉ cần chạy " ./a.out ". Vấn đề là với ftell, tất nhiên. Câu hỏi của tôi là: tại sao điều này xảy ra? Tôi nghĩ stdin có thể tìm kiếm được. fseek cũng gây ra lỗi tương tự. Nếu stdin không phải là tìm kiếm được, có cách nào tôi có thể làm điều tương tự?

Cảm ơn bạn đã trả lời.

+1

Bạn đang cố gắng giải quyết vấn đề gì với fseek? –

Trả lời

12

Số năm không thể tìm kiếm được. Họ chỉ đơn giản là một bộ đệm. Khi dữ liệu đã được read() từ bộ đệm nămo, dữ liệu đó sẽ không bao giờ được truy xuất.

Lưu ý rằng nếu bạn chạy chương trình của bạn:

./a.out < script 

đầu vào sau đó tiêu chuẩn sẽ là một tập tin và không phải là một fifo, vì vậy ftell() sau đó sẽ làm những gì bạn mong đợi.

+2

+1 cho một ví dụ cho thấy sự khác biệt giữa 'tệp cat |./A.out' và' ./a.out

+0

@R .. Sự khác biệt là gì? – Calmarius

+0

@Calmarius: cat f | x sử dụng một quy trình riêng biệt (và có thể là một cpu riêng biệt) để sao chép tệp vào nămo. FIFO đang được đọc bởi quá trình x. nếu x thực hiện những thứ khác với read(), điều này có thể nhanh hơn nếu nó đọc chính tệp đó. x geocar

Các vấn đề liên quan