我想有一个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()
函数将一个流与一个文件描述符关联起来。文件描述符从open()
、dup()
、creat()
或pipe()
中获得,它们打开文件,但不返回指向FILE
结构流的指针。流是几乎所有studio库例程的必要输入。
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也被关闭。ref:fclose()
函数对与流所指向的流相关联的文件描述符执行close()
操作。
如果您之前没有为您的文件获取一个文件描述符,不如使用fopen
。
FILE* file = fopen("pathtoyourfile", "w+");
考虑fopen
使用的是stand-library调用,而不是system-calls (open)。所以你没有那么多的选项(比如指定access-control-values)。
参见手册页。