c语言中,再对文件的操作模式中,a和a+、w和w+、r和r+有啥区别?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言中,再对文件的操作模式中,a和a+、w和w+、r和r+有啥区别?相关的知识,希望对你有一定的参考价值。

这是文件操作中的mode应用问题。
fopen(打开文件)
相关函数 open,fclose
表头文件 #include<stdio.h>
定义函数 FILE * fopen(const char * path,const char * mode);
函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。
mode有下列几种形态字符串:
r 打开只读文件,该文件必须存在。
r+ 打开可读写的文件,该文件必须存在。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。不过在POSIX系统,包含Linux都会忽略该字符。由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask值。
返回值 文件顺利打开后,指向该流的文件指针就会被返回。若果文件打开失败则返回NULL,并把错误代码存在errno 中。
附加说明 一般而言,开文件后会作一些文件读取或写入的动作,若开文件失败,接下来的读写动作也无法顺利进行,所以在fopen()后请作错误判断及处理。
范例
#include<stdio.h>
main()

FILE * fp;
fp=fopen(“noexist”,”a+”);
if(fp= =NULL) return;
fclose(fp);


希望可以帮到你!
参考技术A

    r 打开只读文件,该文件必须存在。r+ 打开可读写的文件,该文件必须存在。

    w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。

    a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。

补充:

a和a+、w和w+、r和r+是mode几种形态字符串。

参考技术B a和a+如果指定的文件不存在,会出错,而不会创建新文件 参考技术C 物理科学巨人霍金去世,您身体受困于轮椅,思想却能遨游宇宙,希望您在那边能身体和思想都能真正自由翱翔,让时间永留简史吧,让黑洞发出“声响”吧。

r:以只读的方式打开文本文件,文件必须存在;

w:以只写的方式打开文本文件,文件若存在则清空文件内容从文件头部开始写,若不存在则根据文件名创建新文件并只写打开;

a:以只写的方式打开文本文件,文件若存在则从文件尾部以追加的方式开始写,文件原来存在的内容不会清除(除了文件尾标志EOF),若不存在则根据文件名创建新文件并只写打开;

r+:以可读写的方式打开文本文件,文件必须存在;

w+:以可读写的方式打开文本文件,其他与w一样;

a+:以可读写的方式打开文本文件,其他与a一样;

若打开二进制文件,可在后面加个b注明,其他一样,如rb,r+b(或rb+)。

再次缅怀霍金。
参考技术D 士兵不分入伍前身份户籍,也不看军衔等级,符合条件才能安置。
《退役士兵安置条例》,自2011年11月1日起施行。
第二十九条 退役士兵符合下列条件之一的,由人民政府安排工作:
(一)士官服现役满12年的;
(二)服现役期间平时荣获二等功以上奖励或者战时荣获三等功以上奖励的;
(三)因战致残被评定为5级至8级残疾等级的;
(四)是烈士子女的。
符合前款规定条件的退役士兵在艰苦地区和特殊岗位服现役的,优先安排工作;因精神障碍基本丧失工作能力的,予以妥善安置。

文件操作的常用方法和使用

文件操作的常用方法

1、打开文件

1.os.mknod("test.txt") #创建空文件
2.f = open("test.txt",w) #直接打开一个文件,如果文件不存在则创建文件
3.关于open 模式:

w:以写方式打开,
a:以追加模式打开 (从 EOF 开始, 必要时创建新文件)
r+:以读写模式打开
w+:以读写模式打开 (参见 w )
a+:以读写模式打开 (参见 a )
rb:以二进制读模式打开
wb:以二进制写模式打开 (参见 w )
ab:以二进制追加模式打开 (参见 a )
rb+:以二进制读写模式打开 (参见 r+ )
wb+:以二进制读写模式打开 (参见 w+ )
ab+:以二进制读写模式打开 (参见 a+ )

2、读

read        读取整个文件

f = open(doubi.txt, r+, encoding=utf-8)
data = f.read()
print(data)

#执行结果为:
peiqi.abc123.21.chengguan
alex.abc123.24.IT
gangniang.abc123.27.dachu

技术分享图片

f = open(doubi.txt,r)

for line in f:
    Print(line) 

也可以用readline和readlines

readline    只读一行,遇到 or 为止

f = open(doubi.txt, r+, encoding=utf-8)
data=f.readline()
data1=f.readline()
data2=f.readline()
print(data)
print(data1)
print(data2)

#结果为:                                 
peiqi.abc123.21.chengguan    

alex.abc123.24.IT

gangniang.abc123.27.dachu     

 

readlines   读取整个文件到一个迭代器以供我们遍历(读取到一个list中,以供使用,比较方便)

f = open(doubi.txt, r+, encoding=utf-8)
data=f.readlines()
print(data)
print(type(data))

#执行结果为:
[peiqi.abc123.21.chengguan
, alex.abc123.24.IT
, gangniang.abc123.27.dachu
]
<class list>

 

另外需要注意的是read是按字符读取,tell和seek是按照字节  切记否则是坑

 

tell
1. 作用:获取当前文件读取指针的位置

2. 语法格式: file.tell() 注: 此方法没有参数

seek
1. 作用:用于移动文件读写指针到指定的位置
2. 语法格式:file.seek(offset, whence=0):
--> offset: 偏移量,需要向前或者是向后移动的字节数
--> whence: 可选值,默认为0, 可选值为1或者2,表示从何处开始计算偏移,具体来说,
  --> 0表示从当前位置开始计算偏移
  --> 1表示从文件头位置开始计算偏移
  --> 2表示从文件尾开始计算偏移
f = open(doubi.txt, r+, encoding=utf-8)
f.seek(3)            #表示向前移动3个字节
data = f.tell()     #获取当前指针位置
print(data)
f.close()

#结果为
3


# f.seek(0,0)            #表示将文件指针移动到文件头处
# f.tell()
#
# f.seek(0,2)            #表示将文件读取指针移动到文件尾部
# f.tell()
 注意seek的长度是按字节算的, 字符编码存每个字符所占的字节长度不一样。
 如“你好啊” 用gbk存是2个字节一个字,用utf-8就是3个字节,因此以gbk打开时,seek(4) 就把光标切换到了“好”和“啊”两个字中间。
但如果是utf8,seek(4)会导致,拿到了飞这个字的一部分字节,打印的话会报错,因为处理剩下的文本时发现用utf8处理不了了,因为编码对不上了,少了一个字节。

3、写入

close 是关闭文件的时候才进行保存(将数据从内存中写入硬盘)

f = open(doubi.txt, r+, encoding=utf-8)
f.seek(9)
f.write()                       
f.close()                            

flush 把文件从内存buffer里强制刷新到硬盘,多用于循环。

 

 4、其他

 readable(self, *args, **kwargs): 
        判断是否可读
 seekable(self, *args, **kwargs)
        判断文件是否可进行seek操作
 writable(self, *args, **kwargs): 
        判断文件是否可写

 truncate(self, *args, **kwargs):
        按指定长度截断文件,类似于删除,从指定位置开始往后删除。
        *指定长度的话,就从文件开头开始截断指定长度,不指定长度的话,就从当前位置到文件尾部的内容全去掉。

    

 

 
 

 


















以上是关于c语言中,再对文件的操作模式中,a和a+、w和w+、r和r+有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

C语言中,再对文件的操作模式中,a和a+w和w+r和r+有什么区别?

C语言中文件打开模式(r/w/a/r+/w+/a+/rb/wb/ab/rb+/wb+/ab+)浅析

在C语言的文件中,像r,w,a,r+,w+,a+分别是啥意思,前面三者与后面三者有啥区别吗?

文件的操作方式

python文件操作:rwar+w+a+和b模式

C语言 文件的读写