C语言将数据写入文件,读取出现二次读取
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言将数据写入文件,读取出现二次读取相关的知识,希望对你有一定的参考价值。
出现的问题就在我画红线的地方。
*****以写的方式保存数据到文件的函数【原数据将被覆盖】*****/
int save(int n) //保存函数,保存n个记录
FILE *fp;
int i;
if((fp=fopen("zhouhao.txt","wb"))==NULL)//以二进制写的方式打开,在此前的记录被覆盖
printf("无法打开文件!\n任意键退出程序... ...\n");
getch(); //预防闪屏
return 0;
for(i=0;i<n;i++)
if(per[i].f_num!=0) //在后面的del()函数中通过将stu[i].ave=0来表示该记录被删除了
if(fwrite(&per[i],sizeof(struct person),1,fp)!=1)//开始写入文件
printf("文件写入发生错误\n");
fclose(fp);
return 0; // 注意下这个地方 ,我只是随便赋的值,只是为了消除一个警告
/***【加载记录或可以计算记录个数的函数】***/
int load()
FILE *fp;
int i;
if((fp=fopen("zhouhao.txt","rb"))==NULL) //以二进制读的方式打开
printf("无法打开文件!\n任意键退出程序... ...\n"); //显示不能打开文件的信息
getch(); //预防闪屏
return 0;
for(i=0;!feof(fp);i++)
fread(&per[i],sizeof(struct person),1,fp); //将文件数据读入学生结构体
fclose(fp);
return(i-1); //返回目前总的记录个数,注意是i-1
大神给点建议,是哪儿出现问题了,如果要源程序的话我也可以共享!
person结构体
typedef struct person
char number[4]; //序号
char ymd[10]; //来访日期
char v_name[10]; //来访人姓名
char cre_name[10]; //来访人证件名
char c_num[18]; //来访人证件编号
char bv_name[10]; //被访人姓名
double f_num; //被访人楼号
char hm_start[5]; //来访时间
char hm_leave[5]; //离开时间
char desc[20]; //备注
PER;
PER per[N]; //定义一个外部结构体变量
用fread的返回结果判断就行了,0就是没数据了
for(i=0;!feof(fp);i++)
fread(&per[i],sizeof(struct person),1,fp);
改成
i=0;
while (fread(&per[i],sizeof(struct person),1,fp))
i++;追问
还是不行哎。。大哥,改完以后还是输出这个结果。。。
追答return(i-1); //返回目前总的记录个数,注意是i-1
不用-1了,直接return i
大哥,不行的,
参考技术A 提供一下你的person结构体,估计变量定义有问题追问我把person结构体补充到上面了,这边写不下。。。麻烦您咯。。
追答char ymd[10]; //来访日期 你存储的数据如果是2014/07/02则说明有效数据是10个,而作为一个字符串,应该还要有一位结束符位('\0'),因此,应该改为char ymd[11]; //来访日期,比有效数据多一个才好!
其他地方的字符串也要注意这个问题。
祝进步
大哥还是不对啊,我都改了,依旧是原来的样子
追答重新保存你的数据文件,再重新读数据才可以!
追问谢谢咯,还是不行
追答共享完整代码,你这程序就这两个问题,一个是楼下说的多读了一行空数据,所以出现了2和NULL
另一个,就是你变量定义的问题,导致输出的日期后面有附加数据。
C#读取并写入XML文件
XML(可扩展标记语言)文件,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
XML与HTML的设计区别是:XML 被设计为传输和存储数据,其焦点是数据的内容。而HTML 被设计用来显示数据,其焦点是数据的外观。HTML 旨在显示信息,而 XML 旨在传输信息。
XML和HTML语法区别:HTML的标记不是所有的都需要成对出现,XML则要求所有的标记必须成对出现;HTML标记不区分大小写,XML则大小敏感,即区分大小写。
在Asp.Net中我们需要通过C#来对已有的XML文件进行读取并写入信息,代码如下:
//创建实例,读取XML XmlDocument xmldoc = new XmlDocument(); string path = HttpContext.Current.Server.MapPath( "../XMLFile/ChatInfor.xml" ); xmldoc.Load(path); //查找根节点 XmlNode chat = xmldoc.SelectSingleNode( "Chat" ); //创建节点 XmlElement infor = xmldoc.CreateElement( "infor" ); //设置属性 infor.SetAttribute( "id" , mid); XmlElement xuser = xmldoc.CreateElement( "userid" ); //插入文本 xuser.InnerText = uid; infor.AppendChild(xuser); XmlElement xdate = xmldoc.CreateElement( "date" ); xdate.InnerText = date; infor.AppendChild(xdate); XmlElement xmess = xmldoc.CreateElement( "content" ); xmess.InnerText = mess; infor.AppendChild(xmess); //存入根节点,保存文件 chat.AppendChild(infor); xmldoc.Save(path); |
PS:上段代码中的mid,uid,date,mess皆为传递的参数;
所存储的XML文件格式如下:
<? xml version="1.0" encoding="utf-8"?> < Chat > < infor id="71b6384d-0dad-62eb-c952-c718d33b3374"> < userid >2</ userid > < date >2013-03-13 12:30:01</ date > < content >大家好!</ content > </ infor > < infor id="a179c895-9521-150e-2548-1872cfd2fd93"> < userid >1</ userid > < date >2013-03-13 12:30:50</ date > < content >你好!</ content > </ infor > < infor id="2c0f2313-13af-f71b-f1a2-8b2e188d5536"> < userid >2</ userid > < date >2013-05-27 15:05:23</ date > < content >1235364564</ content > </ infor > < infor id="d508830e-658f-2adf-88f6-4ef6d9295a88"> < userid >1</ userid > < date >2013-05-27 15:05:30</ date > < content >啊啊啊啊</ content > </ infor > < infor id="37cf60ad-76a6-2983-4a82-bfea197201cd"> < userid >3</ userid > < date >2013-05-27 15:05:35</ date > < content >灌灌灌灌灌</ content > </ infor > </ Chat > |
以上是关于C语言将数据写入文件,读取出现二次读取的主要内容,如果未能解决你的问题,请参考以下文章