fopen 操作文件
[編輯] [转简体] (简体译文)概要
使用 fopen 操作文件
正文
一 打开文件或创建文件
如何创建(打开)一个txt文档?
注意:添加stdio.h
首先创建一个变量*fp用于操作:
FILE *fp;
然后用fopen创建文件,如果文件已有,则打开该文件:
fp=fopen("d:\\test.txt","wb");
其中wb是其中一种模式,还有很多种:
PS:参数介绍来自https://blog.csdn.net/sdujava2011/article/details/68065592
r 打开只读文件,该文件必须存在
r+ 打开可读写的文件,该文件必须存在。
rb+ 读写打开一个二进制文件,只允许读写数据。
rt+ 读写打开一个文本文件,允许读和写。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
wb 只写打开或新建一个二进制文件;,若文件存在则文件长度清为零,即该文件内容会消失;只允许写数据。
wb+ 读写打开或建立一个二进制文件,,若文件存在则文件长度清为零,即该文件内容会消失;允许读和写。
wt+ 读写打开或着建立一个文本文件;,若文件存在则文件长度清为零,即该文件内容会消失;允许读写。
at+ 读写打开一个文本文件,允许读或在文本末追加数据。
ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。
上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。不过在POSIX系统,包含Linux都会忽略该字符。由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask
值。
有些C编译系统可能不完全提供所有这些功能,有的C版本不用"r+",“w+”,“a+”,而用"rw",“wr”,"ar"等,读者注意所用系统的规定。
可以按照自己的需要使用参数。
如果打开文件失败,fopen将返回0!
if((fp=fopen("c:\\hzk16","rb"))==NULL) //如果打开失败 return 0;
注意!!使用fopen创建文件时,若文件路径中包含文件夹,则文件夹必须是已经创建好的,因为fopen不会替你创建文件夹,一旦文件路径中的文件夹不存在,则会创建失败。
要想创建文件夹,可以先包含头文件stdlib.h,然后使用
system("md d:\\mydir");
就可以了。
二 写入信息
写入信息,使用fputs:
fputs("Great!",fp);//往文件 中输入“Great!”。
这样就好了,运行程序后可以在D盘找到文件。
如果程序在此处就结束的话,记得加上代码:
fclose(fp);//关闭文件
因为用fopen打开了文件,那也要关掉。
写入数据还有另一个函数fwrite,其用法和fread很相似(fread下面有讲):
char TXT[20];//将要写入的信息存储在变量TXT中 sprintf(TXT,"HELLO WORLD");//给TXT赋值 fwrite(TXT,sizeof(TXT),1,fp); /* 参数中: TXT:将要写入的数据在TXT这个变量里 sizeof(TXT):写入sizeof(TXT)字节的数据 1:写入1次 fp:写入fp所指向的文件中 */
三 读入信息
读入信息需要使用fread函数:
char TXT[20];//TXT是用于接收读入信息的变量 fread(TXT,sizeof(TXT),1,fp); /* 参数中: TXT:将读入的数据保存在TXT这个变量里 sizeof(TXT):从这个文件中读入sizeof(TXT)字节的数据 1:读入1次 fp:要从fp所指向的文件中读取 */
使用fread函数需要注意两点:
· 第三个参数表示读入几次。假如第二个参数是2,表示每次读入两个字节,第三个参数是3,表示读入三次,那么一共会读入该文件的2*3=6个字节。如果要读多次,那么第一次读完之后,第二次从刚才读到的字节的后一个字节开始读。
· 从文件里读入指定字节的数据,从哪里开始读呢?fread第一次运行时,从文件开头读取,第n次运行时,接着上一次读取的位置继续往后读取,也就是一直往后读,不会每一次都从头开始。
四 设置读取位置
第三点所讲述的fread函数的两个注意事项中第二点提到:fread第一次运行时,从文件开头读取,第n次运行时,接着上一次读取的位置继续往后读取。
那么当我们需要从文件的指定位置开始读取时,需要使用fseek函数:
fseek(fp,2,SEEK_SET); //设置为从fp所指向的文件的第二个字节开始读取 /* 参数中: fp:要读取fp所指向的文件 2:从某个方向数的第二个字节开始读 SEEK_SET:模式为从头开始 */
上面这个代码的意思就是:
下一次再读fp所指向的这个文件的时候,从从头开始的第二个字节的地方开始读取。
fseek函数的第三个参数表示模式,有三种模式供你选择:
1 SEEK_SET 从头开始
2 SEEK_CUR 从当前所读到的位置开始
3 SEEK_END 从末尾往头数
那么:
fseek(fp,2,SEEK_SET); //下一次从第二个字节开始读 fseek(fp,2,SEEK_CUR); //假设现在读到了该文件的第五个字节,下一次从第七个字节开始读 fseek(fp,2,SEEK_END); //假设该文件有10个字节,下一次从第八个字节开始读
注意:fseek所设置的位置既是将要读入的位置,也是将要写入的位置。
记得,用完文件时:
fclose(fp);//关闭文件