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]; //定义一个外部结构体变量

不要用feof在循环里判断,在读到文件最后一个字节时,feof(fp)还是为0值,再试图读文件时,feof(fp)才为非0值来报错,所以会多读一次
用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语言将数据写入文件,读取出现二次读取的主要内容,如果未能解决你的问题,请参考以下文章

c语言中怎样在文件写入时换行?

PHP如何把数据写入JSON文件并在另一PHP文件读取JSON数据?

求c语言读取写入文本文件的函数实现

c语言中如何修改储存在文件的结构体内容中。小文件

如何c语言中如何将print信息写入一个文件

c语言写入文件方法