C语言文件操作解析(二)
C语言中对文件进行操作必须首先打开文件,打开文件主要涉及到fopen函数。fopen函数的原型为
FILE* fopen(const char *path,const char *mode)
其中path为文件路径,mode为打开方式
1)对于文件路径,只需注意若未明确给出绝对路径,则默认该文件在工程的目录下。若需给出绝对路径,则注意转义字符'\',比如有文件test.txt存放在C盘根目录下,则文件路径参数值应为C:\\test.txt。
2)对于mode,主要由r,w,a,+,b,t六个字符组合而成。
r:只读方式,文件必须存在
w:只写方式,若文件存在,则原有内容会被清除;若文件不存在,则会建立文件
a:追加方式打开只写文件,只允许进行写操作,若文件存在,则添加的内容放在文件末尾;若不存在,则建立文件
+:可读可写
b:以二进制方式打开文件
t:以文本方式打开文件(默认方式下以文本方式打开文件)
下面是常见的组合:
r: 以只读的方式打开文件,只允许读,此文件必须存在,否则返回NULL,打开成功返回的指针指向文件头部
r+: 以可读可写的方式打开文件,允许读写,此文件必须存在,否则返回NULL,打开成功返回的指针指向文件头部
rb+: 以可读可写、二进制方式打开文件,允许读写,此文件必须存在,否则返回NULL,打开成功返回的指针指向文件头部
rt+: 以可读可写、二进制方式打开文件,允许读写,此文件必须存在,否则返回NULL,打开成功返回的指针指向文件头部
w: 以只写的方式打开文件,只允许写,若文件存在,文件中原有内容会被清除;若文件不存在,则创建文件,打开成功返回的指针 指向文件头部
w+: 以读写的方式打开文件,允许读写,若文件存在,文件中原有内容会被清除;若文件不存在,则创建文件,打开成功返回的指针 指向文件头部
a: 以追加、只写的方式打开文件,只允许写。若文件存在,则追加的内容添加在文件末尾,若文件不存在,则创建文件。打开成功返回的指针指向文件头部(注意很多书上或资料上讲述追加方式打开成功后指针指向文件末尾是错误的)
a+: 以追加、可读写的方式打开文件,允许读写。若进行读操作,则从头开始读;若进行写操作,则将内容添加在末尾。若文件不存在,则创建文件。打开成功返回的指针指向文件头部
其他方式类似。
下面讨论一下以二进制方式和文本方式打开文件有什么区别。
其实这两种方式打开文件并没有太大的区别,仅仅只有一点区别就是在处理某些特殊字符的时候。
以文本方式打开文件,若将数据写入文件,如果遇到换行符'\n'(ASII 值为10,0A),则会转换为回车—换行'\r\n'(ASII值为13,10,0D0A)存入到文件中,同样读取的时候,若遇到回车—换行,即连续的ASII值13,10,则自动转换为换行符。
而以二进制方式打开文件时,不会进行这样的处理。以上所述只在windows下存在,在unix下没有区别。
1.测试程序—检测以追加的方式打开文件时,指针的初始位置
假设工程目录下已存在文件test.txt,文件中含有的字符串为"ABC"
/*测试fopen函数以追加方式打开文件时初始指针的位置 2011.10.5*/ #include<stdio.h> #include<stdlib.h> int main(void) { int n; FILE *fp; if((fp=fopen("test.txt","a"))==NULL) { printf("can not open file\n"); exit(0); } n=ftell(fp); //得到此时fp所处位置距文件首的偏移字节数 printf("%d\n",n); fputs("test",fp); n=ftell(fp); printf("%d\n",n); fclose(fp); return 0; }
输出结果为:
0
7
Press any key to continue
由输出结果可知,初始打开文件后,指针是位于文件首部,只是在往文件中添加内容时,才将文件指针移动到文件末尾。
2.测试程序—检测以二进制方式和文本方式打开文件的区别
/*测试以二进制方式和文本方式打开文件的区别 2011.10.5*/ #include<stdio.h> #include<stdlib.h> int main(void) { char ch; int i; char s[]={'A','B','\n','C'}; FILE *fp1,*fp2; if((fp1=fopen("test1.txt","wt"))==NULL) { printf("can not open file\n"); exit(0); } if((fp2=fopen("test2.txt","wb"))==NULL) { printf("can not open file\n"); exit(0); } for(i=0;i<4;i++) { fputc(s[i],fp1); //以文本方式向文件中写入数据 fputc(s[i],fp2); //以二进制方式向文件中写入数据 } fclose(fp1); fclose(fp2); if((fp1=fopen("test1.txt","rt"))==NULL) { printf("can not open file\n"); exit(0); } if((fp2=fopen("test1.txt","rb"))==NULL) { printf("can not open file\n"); exit(0); } ch=fgetc(fp1); while(!feof(fp1)) //以文本方式从文件中读取数据 { printf("%02X",ch); ch=fgetc(fp1); } printf("\n"); ch=fgetc(fp2); while(!feof(fp2)) //以二进制方式从文件中读取数据 { printf("%02X",ch); ch=fgetc(fp2); } printf("\n"); fclose(fp1); fclose(fp2); return 0; }
在向文件中写完数据后,用UltraEdit以二进制方式打开test1.txt和test2.txt,看到的结果如下:
根据得到的结果可知,以文本方式写入时,多写入了一个字符0D,即'\r'。
程序输出结果:
41420A43
41420D0A43
请按任意键继续. . .
分别以文本方式和二进制方式读取test1.txt时,输出的内容不同。
可知在以文本方式读取时,对'\r\n'进行了转换,而二进制方式读取时却没有进行这样的转换
作者 海子
补充:软件开发 , C语言 ,