2011-12-07 25 views
5
int source = open("hi", O_CREAT | O_RDONLY); 
int dest = open("resultfile", O_CREAT | O_RDWR | O_TRUNC); 

FILE* source1 = fdopen(source, "r"); 
FILE* dest1 = fdopen(dest, "w+"); 

// outside of a testcase I would write something into 'resultfile' here 

close(source); 
close(dest); 
fclose(source1); 
fclose(dest1); 

int sourcef = open("resultfile", O_RDONLY); 
printf(strerror(errno)); // <--- Bad file descriptor 

Tôi không hiểu tại sao? Làm thế nào tôi có thể kết hợp thành công luồng dựa trên IO với open()?Trộn fdopen() và mở() -> mô tả tệp sai

Thư viện mà tôi đang làm việc chỉ chấp nhận số nguyên fd (và thư viện chịu trách nhiệm nội bộ để đóng, có lẽ là gần()), nhưng tôi vẫn cần làm việc với tệp và tôi không xem như thế nào là đúng có thể mà không có các cuộc gọi f() như (fread(), ftell() vv)

Trả lời

13

fclose gọi close cho bạn. Nếu bạn muốn giữ fd xung quanh sau khi gọi fclose, dup fd trước.

int fd = open(...); 
int fd2 = dup(fd); 
FILE *fp = fdopen(fd2); 
fclose(fp); 
// fd is still valid. 

Thông báo lỗi mô tả tệp sai trong ví dụ của bạn đang kéo dài từ cuộc gọi fclose(dest1).

+0

Cảm ơn bạn! Tôi đã không đọc manpage một cách cẩn thận vì fdopen() manpage được trộn lẫn với freopen() và fopen(): / – Blub

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