【发布时间】:2013-02-27 11:13:06
【问题描述】:
我想要一个FILE* 类型来使用fprintf。
我需要使用fdopen 来获取FILE* 而不是返回int 的open。
但是我们可以对fdopen 和open 做同样的事情吗? (我没用过fdopen)
我想做一个fdopen,它与:
open("my_file", 0_CREAT | O_RDWR | O_TRUNC, 0644);
【问题讨论】:
我想要一个FILE* 类型来使用fprintf。
我需要使用fdopen 来获取FILE* 而不是返回int 的open。
但是我们可以对fdopen 和open 做同样的事情吗? (我没用过fdopen)
我想做一个fdopen,它与:
open("my_file", 0_CREAT | O_RDWR | O_TRUNC, 0644);
【问题讨论】:
fdopen 采用以前可能由open 返回的文件描述符,所以这不是问题。
只需 open 你的文件获取描述符,然后 fdopen 那个描述符。
fdopen 只是创建一个用户空间缓冲流,采用支持read 和write 操作的任何类型的描述符。
【讨论】:
fdopen 的模式必须与文件描述符的模式兼容。
fdopen()使用文件描述符指向文件指针:fdopen() 函数将流与文件描述符相关联。文件描述符从open()、dup()、creat() 或pipe() 获得,它们打开文件但不返回指向FILE 结构流的指针。流是几乎所有 stdio 库例程的必要输入。
FILE* fp = fdopen(fd, "w");
此示例代码可能会在您想使用fprintf()时为您提供更多帮助:
int main(){
int fd;
FILE *fp;
fd = open("my_file",O_WRONLY | O_CREAT | O_TRUNC);
if(fd<0){
printf("open call fail");
return -1;
}
fp=fdopen(fd,"w");
fprintf(fp,"we got file pointer fp bu using File descriptor fd");
fclose(fp);
return 0;
}
注意:
fclose() 关闭时,fd 也会关闭。
参考:The fclose() function performs a close() on the file descriptor that is associated with the stream pointed to by stream. 【讨论】:
fdopen然后fclose之后关闭文件描述符。 fd 没有被复制,调用 fclose 将关闭它。
The file descriptor is not dup'ed, and will be closed when the stream created by fdopen() is closed. 另见stackoverflow.com/questions/8417123/…
如果您之前没有为您的文件获取文件描述符,请使用fopen。
FILE* file = fopen("pathtoyourfile", "w+");
请考虑,fopen 使用的是标准库调用而不是系统调用(打开)。所以你没有那么多选择(比如指定访问控制值)。
请参阅man-page。
【讨论】: