Làm cách nào để lấy con trỏ FILE từ bộ mô tả tệp?


85

Tôi đang chơi với mkstemp(), cung cấp một bộ mô tả tệp, nhưng tôi muốn tạo đầu ra được định dạng thông qua fprintf(). Có cách nào dễ dàng để chuyển đổi bộ mô tả tệp được cung cấp mkstemp()thành một FILE *cấu trúc phù hợp để sử dụng fprintf()không?


Câu trả lời:


101

Sử dụng fdopen():

FILE* fp = fdopen(fd, "w");

34
Và để có được những mô tả tập tin từ một sử dụng FILE * fileno(): linux.die.net/man/3/fileno
Lee Netherton

2
nếu fdđược mở với một số cờ (như O_NONBLOCK) - điều gì sẽ xảy ra với chúng sau khi fdopenmở nó với các cờ mới? Chúng sẽ được xor-ed cùng nhau hay thay thế?
xealits

5
@jww: Bộ mô tả tệp không phải là ANSI C để bắt đầu.
Rufflewind

2
gọi fdopennhiều lần có hại theo cách nào không? (giả sử nó xảy ra bên trong một số hàm được gọi đi gọi lại)
phil294

2
@xealits Các tùy chọn cho FILE * phải nằm trong phạm vi của bộ mô tả tệp đã mở. Vì vậy, nếu bạn đã mở fd với chỉ đọc và FILE * với chỉ ghi, nó sẽ đưa ra một ngoại lệ. Để biết thêm thông tin, hãy tham khảo ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/…
Tjad Clark

28

FILE* f = fdopen(d, "w");

man fdopen đầu ra:

TÓM TẮC

#include <stdio.h>

FILE *
fdopen(int fildes, const char *mode);

Các fdopen()chức năng liên kết một dòng với mô tả tập tin hiện có, fildes. Chế độ của luồng phải tương thích với chế độ của bộ mô tả tệp. Khi luồng được đóng qua fclose(3), fildescũng bị đóng.


1
Không có sẵn trong ANSI C.
jww


-8

Không có cách tiêu chuẩn nào để làm điều này (hoặc ngược lại) vì Tiêu chuẩn C không có gì để nói về bộ mô tả tệp. Nền tảng cụ thể của bạn có thể cung cấp hoặc không thể cung cấp cơ chế như vậy.


17
Phụ thuộc vào những gì bạn có nghĩa là "tiêu chuẩn". POSIX là một tiêu chuẩn.
Richard Pennington

12
Câu hỏi là về bộ mô tả tệp. ;-)
Richard Pennington

11
@Neil> câu hỏi được gắn thẻ là C không có nghĩa là "hãy cho tôi biết sự thật về tiêu chuẩn C" mà là "Tôi đang viết mã bằng C, tôi thất bại trong việc này, vui lòng cho tôi biết liệu nó có khả thi không và làm thế nào? "
Gregory Pakosz

8
Tôi đồng ý rằng không có cách tiêu chuẩn nào để làm điều này, nhưng việc OP đề cập đến mkstempngụ ý rằng các giải pháp không tiêu chuẩn có thể chấp nhận được trong trường hợp cụ thể này. Tuy nhiên, trong trường hợp đó, anh ta nên thêm posixthẻ (mà tôi thấy đã được thêm vào).
Emerick Rogul 21/12/09

9
@Neil, và mục đích của Mạng và ý nghĩa của cuộc sống. Bạn sẽ có ý nghĩa hơn nếu bạn nói rằng bạn có quan điểm khác. Tôi cũng nghi ngờ SO là tất cả về việc cắt tóc theo tiêu chuẩn. Và nó không phải rất thực tế dựa vào kỹ năng của một người nào đó gắn thẻ với SO-kinh nghiệm tương ứng với danh tiếng của 23.
Michael Krelin - tin tặc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.