我必须捕捉以下模式:
“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。
最佳答案
一般来说,在给定 FILE*
句柄的情况下,您无法使用可移植的 C 程序捕获 fopen
意义上的文件模式。
例如,您的FILE*
可能通过popen
、fmemopen
、open_memstream
、获得fdopen
等...并且可以是只写的或只读的。它甚至可能没有 fileno
给出的有效文件描述符。
您应该采用并定义和记录关于它们的约定。
例如,在 Linux 上,套接字可能在操作系统级别是可读和可写的,并且您可以在其上有两个不同的 FILE*
句柄(使用 fdopen
)对于读取和写入端。
当然,FILE*
句柄在 fclose
(或 pclose
)之后不可用
所以一个假设的例程 fprint_stuff(FILE*, struct stuff_st*)
应该记录第一个参数是一个可写文件句柄,并且只会调用 fwrite
和 fprintf
但应该检查它们是否失败。
关于c - 如何捕捉文件模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54421107/