2012-11-11 21 views
6

tôi phải lặp lại một FILE* trong C trên Mac OS X (sử dụng POSIX int tập tin mô tả tất cả các cách là tiếc ra khỏi câu hỏi), vì vậy tôi đã đưa ra các chức năng sau:Tôi có thể nhận được chế độ truy cập của `FILE *` không?

static FILE* fdup(FILE* fp, const char* mode) 
{ 
    int fd = fileno(fp); 
    int duplicated = dup(fd); 
    return fdopen(duplicated, mode); 
} 

Nó hoạt động rất tốt , ngoại trừ nó có phần xấu xí nhỏ mà tôi yêu cầu chế độ tập tin một lần nữa, bởi vì fdopen dường như không thể tự xác định được.

Vấn đề này không quan trọng, vì về cơ bản, tôi chỉ sử dụng nó cho stdin, stdoutstderr (và rõ ràng là tôi biết chế độ truy cập của cả ba). Tuy nhiên, nó sẽ thanh lịch hơn nếu tôi không phải tự biết; và điều này có thể xảy ra vì cuộc gọi dup không cần đến.

Làm cách nào để xác định chế độ truy cập của luồng FILE*?

Trả lời

7

Bạn có thể không, nhưng bạn có thể xác định các chế độ cho các bộ mô tả tập tin cơ bản:

int fd = fileno(f); 
int accmode = fcntl(fd, F_GETFL) & O_ACCMODE; 

Sau đó bạn có thể chọn một chế độ thích hợp để vượt qua để fdopen dựa trên việc accmodeO_RDONLY, O_WRONLY, hoặc O_RDWR .

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