问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C语言 文件操作问题

发布网友 发布时间:2022-04-27 09:08

我来回答

3个回答

热心网友 时间:2023-09-16 20:07

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,则自动转换为换行符。
而以二进制方式打开文件时,不会进行这样的处理。
还有如果以文本方式打开文件时,若读取到ASCII码为26(^Z)的字符,则停止对文件的读取,会默认为文件已结束,而以二进制方式读取时不会发生这样的情况。由于正常情况下我们手动编辑完成的文件是不可能出现ASCII码为26的字符,所以可以用feof函数去检测文件是否结束。以上所述的两点区别只在windows下存在,在unix下没有区别。
注意:1)在以追加方式打开文件时,位置指针指向文件的首部。
在这里区分一下位置指针和文件指针:
文件指针:指向存储文件信息的一个结构体的指针
位置指针:对文件进行读写操作时移动的指针
在头文件<stdio.h>中存在一个结构体_iobuf,在VC6.0中选中FILE,然后F12,则可以看到_iobuf的具体定义:
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
比如用FILE *fp定义了一个文件指针,并成功打开一个文件之后,fp只是指向该结构体,而在对文件进行读写操作时,fp的值并不会改变,改变的是结构体中_ptr的值,这个_ptr就是位置指针。
2)以追加方式打开时,若进行写操作,则rewind函数和fseek函数不会起到作用,因为以追加方式打开时进行写操作的话,系统会自动将位置指针移动到末尾。
3)当文件打开用于更新时,可以通过文件指针对文件进行读写操作,但是如果没有给出fseek或者rewind的话,读操作后面不能直接跟写操作,否则会是无效的写操作(位置指针会移动,但是需要写入文件的内容不会被写入到文件当中),但是写操作后可以直接跟读操作。
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'进行了转换,而二进制方式读取时却没有进行这样的转换(要注意,windows和linux下的换行符是不一样的,在windows下换行符是\r\n,即0X0D、0X0A,而在linux下换行符是\n,即0X0A。
3.测试程序
/*测试读操作后能否直接跟写操作 2011.10.5*/

#include<stdio.h>
#include<stdlib.h>

int main(void)
{
int ch;
int n;
FILE *fp;
if((fp=fopen("test.txt","r+"))==NULL)
{
printf("can not open file\n");
exit(0);
}
fseek(fp,1L,0); //将fp移动到距文件首1字节的位置
ch=fgetc(fp);
printf("%c\n",ch);
//rewind(fp);
fseek(fp,1L,0);
fputs("test",fp);
ch=fgetc(fp);
printf("%c\n",ch);
fclose(fp);
return 0;
}
假设工程已经存在文件test.txt,文件中含有字符串"ABCDEFGH"。
则上述程序执行结果为:
B
F
请按任意键继续. . .文件中内容为"AtestFGH"。
与预想结果相同,因此读取到字符'B'后,再将位置指针置到距文件首1字节处,即字符'B'处,写入"test"后,会覆盖掉"BCDE",写完后位置指针指向字符'F',因此此时进行读操作,得到的结果是'F'。
但是如果将fseek(fp,1L,0);这句注释掉,则执行结果为:
B
G
请按任意键继续. . .
文件中的内容为"ABCDEFGH"。
注释掉fseek一句后,读取完字符'B'后,位置指针指向字符'C',再进行写操作,位置指针会向后移动4个字节的位置,指向字符'G',因此第二次读取的输出结果为'G'。但是文件中的内容没有被改写,相当于这次写操作是无效操作。

热心网友 时间:2023-09-16 20:07

fwrite,fread并不会自己转成ascii。
如果你希望能直接打开文件的话,就用"w+"打开,fprintf写。
fwrite(s1,sizeof(struct test),2,fp);
变成fprintf(s1,"%s\n%d %d\n%s\n%d %d",s1[0].name,s1[0].size,s1[0].score,s1[1].name,s1[1].size,s1[1].score);
fread(s2,sizeof(struct test),2,fp);
变成fscanf(s1,"%s%d%d%s%d%d",&s2[0].name,&s2[0].size,&s2[0].score,&s2[1].name,&s2[1].size,&s2[1].score);

热心网友 时间:2023-09-16 20:07

wb+是写入二进制的意思,要想人能看懂就去掉b追问去掉一样的,虽然是二进制写入但是系统显示时会帮你转的

追答好好念书吧,你打开那文件干嘛,你想多了,火候不到不要想当然,书上教的能记住就不错了,c是巨人的语言

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
交通工程好考公务员吗 交通工程类考公时包括哪些专业 交通工程专业的能报考什么样的公务员 交通工程专业往哪些方向考公务员 交通工程可以考公务员有哪些岗位 我专业交通工程。能考什么类型的公务员 支付宝怎么关联另一个账号 支付宝怎么关联另一个支付宝 支付宝关联账号在哪里?怎么添加? 京东买手机发票可以开别人名字吗 注会的题库推荐有哪些? C语言 文件初学 C语言文件。帮忙解下。 注册会计师考试题型有哪些? C语言文件知识 C语言文\r\n区别 C语言 文件 触控屏就能用手写笔吗? 手机的触屏笔去哪买? 能否用马克笔笔头做触屏笔? 平板触屏笔放在哪 如何取下触屏笔笔盖头, 软文撰写的7种形式 电脑自带的windows照片查看器突然不能用了是为什么? 常见的SEO标题类型有哪些,有哪些好的例子 请我们装windows系统时出现照片的问题怎么解决? 软文三段式标题有哪些例子 请问阿卢c01浮漂怎么调好用,我一般野钓请大师们指教。谢谢 阿卢浮漂公司简介 怎样知道阿卢浮漂是哪款型号 电脑管家文件包安装在哪个文件夹 注会会计大题考哪些 腾讯电脑管家安装文件在什么位置 电脑管家下载的安装包在哪里? 温室种植草莓想要提高产量,都有哪些技巧? CPA考试全国试题都是一样的吗 在电脑上安装文件时出现提示先退出电脑管家,请问怎么操作? 注册会计师考试是什么题 什么是“至爱品牌”? 盛世长城的管理层 温室草莓花果期如何管理可以增产、增效? 至爱终生的品牌故事 贴身至爱品牌内衣的创始人是哪个呢? 电脑管家怎么找安装包 有了解挚爱珠宝品牌的吗?这个品牌靠谱吗? 温室大棚种植草莓要提质增效,如何绿色防控? 美津植秀产品效果好吗?淘宝店铺正品包邮是真的吗? 温室促成栽培草莓怎样进行栽植? 至爱十字绣品牌怎么样啊?用它秀的红楼梦里的金陵十二钗大概价值多少啊? qq电脑管家官方的默认下载路径是什么?