在linux中编程,怎么判断打开一个文件是以读、写还是读写模式打开的?求c语言实现代码

如果当前进程要对一个文件进行操作肯定要先将文件大开,形成自己的struct file *file,现在已知这个file指针,怎么判断是以什么模式打开的?还有如果是读写模式打开的,怎么判断以后的操作到底是读还是写?我看struct file中有一个f_mode的参数,不知道这个参数与我的问题有什么关系
简单的说就是判断我当前文件是以什么模式打开的,还有判断当前的操作是在对这个文件读还是对这个文件写。怎么用c实现?

既然得到了这文件指针,你想怎么打开都行,无需知道以前是什么模式。
用open更新你想要的打开方式。

O_RDONLY 以只读方式打开文件
O_WRONLY 以只写方式打开文件
O_RDWR 以可读写方式打开文件。上述三种旗标是互斥的, 也就是不可同时使用, 但可与下列的旗标利用OR(|)运算符组合。
O_CREAT 若欲打开的文件不存在则自动建立该文件。
O_EXCL 如果O_CREAT 也被设置, 此指令会去检查文件是否存在。文件若不存在则建立该文件, 否则将导致打开文件错误。此外, 若O_CREAT与O_EXCL同时设置, 并且欲打开的文件为符号连接, 则会打开文件失败。
O_NOCTTY 如果欲打开的文件为终端机设备时, 则不会将该终端机当成进程控制终端机。
O_TRUNC 若文件存在并且以可写的方式打开时, 此旗标会令文件长度清为0, 而原来存于该文件的资料也会消失。
O_APPEND 当读写文件时会从文件尾开始移动, 也就是所写入的数据会以附加的方式加入到文件后面。
O_NONBLOCK 以不可阻断的方式打开文件, 也就是无论有无数据读取或等待, 都会立即返回进程之中。
O_NDELAY 同O_NONBLOCK。
O_SYNC 以同步的方式打开文件。
O_NOFOLLOW 如果参数pathname 所指的文件为一符号连接, 则会令打开文件失败。
O_DIRECTORY 如果参数pathname 所指的文件并非为一目录, 则会令打开文件失败。

这是你要的
r 打开只读文件, 该文件必须存在。
r+ 打开可读写的文件, 该文件必须存在。
w 打开只写文件, 若文件存在则文件长度清为0, 即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件, 若文件存在则文件长度清为零, 即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在, 则会建立该文件, 如果文件存在, 写入的数据会被加到文件尾, 即文件原先的内容会被保留。
a+ 以附加方式打开可读写的文件。若文件不存在, 则会建立该文件, 如果文件存在, 写入的数据会被加到文件尾后, 即文件原先的内容会被保留。追问

非常感谢您的回答。不过我现在的主要目的还是通过file指针来判断这个文件原本是以什么模式打开的,以及当前的操作是读操作还是写操作,这两点是最主要的。

追答

看代码,一个文件放在那里,只有用户权限而已,如果你是root/admin,它就只是一个文件,你想怎么处理都可以。你的思维出了问题,所以没人答你。

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-05-08
man __freading

int __freadable(FILE *stream);
int __fwritable(FILE *stream);
int __freading(FILE *stream);
int __fwriting(FILE *stream);

The __freadable() function returns a nonzero value if the stream allows
reading, and zero otherwise.

The __fwritable() function returns a nonzero value if the stream allows
writing, and zero otherwise.

The __freading() function returns a nonzero value if the stream is
read-only, or if the last operation on the stream was a read operation,
and zero otherwise.

The __fwriting() function returns a nonzero value if the stream is
write-only (or append-only), or if the last operation on the stream was
a write operation, and zero otherwise.
第2个回答  2012-05-14
access可以用来判定用什么样的模式打开文件

在linux中编程,怎么判断打开一个文件是以读、写还是读写模式打开的?求...
r 打开只读文件, 该文件必须存在。r+ 打开可读写的文件, 该文件必须存在。w 打开只写文件, 若文件存在则文件长度清为0, 即该文件内容会消失。若文件不存在则建立该文件。w+ 打开可读写文件, 若文件存在则文件长度清为零, 即该文件内容会消失。若文件不存在则建立该文件。a 以附加的方式打开只写...

请问linux下c语言中文件操作fopen的rb+模式与wb+有什么
在Linux下,讨论C语言中的文件操作函数fopen中的rb+模式与wb+有什么区别,首先要明白在实际操作中,"b"标志表示以二进制模式打开文件。对于"r+"模式,其含义是读写模式。当使用此模式打开文件时,程序能够读取文件内容并进行写入操作。如果文件不存在,会尝试创建它;如果存在,文件指针会被定位到文件开...

C语言如何判断文件是否可读写
这个需要对文件加锁才能,可以用fcntl函数实现 int lock(const char * filepath ){ int fd = 0;struct flock flock;memset( &flock, 0, sizeof(flock) );fd = open( filepath, O_RDWR,S_IRUSR|S_IWUSR );if ( fd < 0 ){ printf("open error!\\n");return ( -1 );} flock.l_...

linuxc读取文件,解析linuxc读取文件
C语言对文件进行读取之前需要先打开文件,然后再进行读写,读写完之后关闭文件。可以使用两组函数实现:一、C语言库函数打开文件:fopen读写(一般对应成对使用):fgetc---fputcfgets---fputsfread---fwrite关闭文件:fclose 二、Linux系统函数打开文件:open读写(一般对应成对使用):read---write关闭...

Linux系统下C语言read,write函数
在Linux系统中,C语言的read和write函数常用于实现文件操作,比如简单的文件复制。以下是一个基础示例,用于帮助理解这两个函数在实际应用中的用法。首先,理解main函数的参数至关重要。在Linux系统编程中,我们通常使用`int main(int argc, char *argv[])`,而不是仅`int main()`。参数`argc`代表...

...的方法。就是从已知的文件句柄fp来判断的,在linux和windows平台通用的...
自己找到答案了。开个小号来收走。文件结构体中有状态标识符,可以用来判断文件是的打开状态。windows下面是_flag,linux上面是flags,solaris上面的结构体变量中没有状态标识符。但是linux和solairs上面都可以用fileno来获得文件的描述符,然后用fcntl来获得文件的状态标识。fcntl(fd,F_GETFL),大概是这样写...

如何用C语言在linux上统计文件行数
代码如下:假定输入文件为in.txt,该文件存在且可读。include <stdio.h>int main(){ FILE * fp = NULL; \/\/文件指针。 int c, lc=0; \/\/c为文件当前字符,lc为上一个字符,供结尾判断用。 int line = 0; \/\/行数统计 fp = fopen("in.txt", "r");\/\/以只读方式打开文件。

在LINUX下C语言编程调用这个函数int open(argv[1],O_CREAT|O_RDWR,0755...
你好,O_CREAT表示在argv[1]中的文件存在时,第三个参数没用,并且以读写将其打开;argv[1]中的文件不存在时,则创建这个文件,并设置文件的权限为755,就是用chmod更改的文件权限,755表示对所有者可读可写可执行,对所属组可读可执行不可写,对其他用户可读可执行不可写。

linuxc读取文件内容linuxc读取文件
读数据的函数有:fgetc(),fgets(),fread(),fscanf()C语言中文件读写必须先打开文件,操作完后必须关闭文件。打开文件用:fopen()函数,关闭文件用fclose()函数就是用fopen或者open(Linux下)打开并使用一些文件流操作函数如fgets之类的对文件进行读取,读入内存。以前是从屏幕中读入数据现在换成了从文件...

学习如何用 C 语言来进行文件输入输出操作 | Linux 中国
编写cp命令时,首先打开源文件和目标文件,循环读取源文件的字符并写入目标文件,直至读取到EOF。此方法简单,但效率低下,尤其在处理大型文件或网络传输时。提高效率的方法是使用fread和fwrite函数读写数据块。通过一次读取多个字符至缓冲区,减少文件读取次数,显著提高性能。例如,可以使用一个字符数组作为...

相似回答
大家正在搜