我必须捕捉以下模式:
"rb"
,"r+b"
和"wb"
。
我试图执行以下代码(编译):
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
FILE *file = fopen("data.bin", "r");
if (!file){
perror("");
return -1;
}
int fd = fileno(file);
if (fcntl(fd, F_GETFL) == O_RDONLY){
printf("read only\n");
}
// printf("%d\n", O_APPEND);
fclose(file);
return 0;
}
但是什么也没印出来。 fcntl()返回整数,例如32768,但是我需要来自库的宏,例如O_RDONLY。
答案 0 :(得分:3)
通常,使用可移植的C程序无法捕获FILE*
赋予的文件模式fopen
。
例如,您的FILE*
可以通过popen
,fmemopen
,open_memstream
,fdopen
等获得,并且只能是可写的或仅可读。它甚至可能没有fileno
给出的有效文件描述符。
您应该采用以及定义和文档约定 。
例如,在Linux上,套接字在OS级别上是可读写的,并且您可以在其上有两个不同的FILE*
句柄(使用fdopen
)以进行读取和写入双方。
当然,在FILE*
(或fclose
)之后,pclose
句柄不可用
因此,假设例程fprint_stuff(FILE*, struct stuff_st*)
应该记录第一个参数是可写文件句柄,并且只调用fwrite
和fprintf
,但应检查这些都没有失败。