字符的读取及写入
fopen按照具体操作,按照对应的格式打开文件,具体格式有"r","w","r+","a+"等,有的如果文件夹不存在,可自动创建文件夹,而有的格式则要求文件必须已经存在,如"r+"等。具体含义可以百度。
fopen();
fread();
fgets(fp);读取一行。
fgetc(fp);读取一个字符。
fwrite();
fprintf();按照一系列格式写入字符串到文件中。跟sprintf一样好用。
读取和写入遇到的坑:
某次业务操作,要替换文本中的字符串,以“r+”的格式打开的文本文件。最开始的思路是fgetc()挨个读取字符,读到需要修改部分调用fwrite()写入,且先不说覆盖的问题。使用时发现,调用fgetc()或者fgets()之后,fwrite始终无法写入。开始百度,答案时这样的:
当指定"r+“、"w+”或"a+“访问类型时,将启用读写功能(该文件据说为”update“打开)。但是,当您从读到写时,输入操作必须遇到EOF标记。如果没有EOF,则必须使用对文件定位函数的中间调用。文件定位功能有fseek,fsetpos、rewind和rewind等。当您从写入切换到读取时,必须使用对fflush或对文件定位函数的中间调用。
它不能工作,因为C标准( fopen函数第7段中的C11草案n1570 7.21.5.3;以及所有以前的版本)都表示它不必工作。虽然以"r+"格式打开文件,可以对关联的流执行输入和输出。但是,在没有对fflush
函数或文件定位函数( fseek
、fsetpos
或rewind
)进行中间调用的情况下,输出不应直接跟随输入,而在没有对文件定位函数进行中间调用的情况下,输入不应直接跟随输出,除非输入操作遇到EOF结尾。
所以答案:即使是以"r+"及其他的可读可写的模式打开文件,但是不能一会输出一会输入,就是不能一会读取一会写入,中间需要一些操作进行间隔。读到一半想写两句,先调用fseek等,例如可就调用fseek(fp, 0, SEEK_CUR),不做操作就刷新一下fp,后面就可以写入了。如果写查出不多了想读呢,加入fflush(fp),就可以接着读了。
C语言字符串替换
据说用python写字符串替换比较简单,但是python用的不熟,电脑也没配python环境。所以还是c语言吧。
百度了一下,大家的思路大致都为,两个文件。一个是旧的要更新字符串的文件,用来读取内容,一个新的专门用来写,用来存储字符串替换了之后的文件。
只读模式打开读取待替换字符串的文件,读取到待替换的内容之前,将读取到的内容拷贝到写入文件中,要替换的地方,直接写入新字符串。在读取文件中跳过待替换字符串位置,然后接着往后读,接着拷贝。总之,读取原本文件内容,没到要替换的串之前就通通拷贝到写入文件中,碰到要替换的串了,在写入文件中写入新串,在读取文件中跳过要替换的串接着统统拷贝,直到遇见下一次要被替换的串。
代码可参考链接:https://blog.csdn.net/weixin_41695564/article/details/80613157
为什么要开两个文件,因为就算用来fseek,fflush实现了边读取边写入,但是如果替换的字符串比原字符串要长的话,则会覆盖掉原串后面的内容,这个不好处理。所以重新写入比较方便。