c语言读取文件的时候,读出来的文本不一样

可乐小雪碧 2017-06-08 09:29:24
#include<stdio.h>
#include<string.h>
#define SIZE 100
//定义路由表信息的结构体
struct routing_information
{
char routing_name[5];
char net_name[10];
int distance;
char next_routing[10];
int length;
}stud[SIZE],newStud[SIZE];
//将路由表信息存储为文件的函数
void save()
{
FILE *fp;
int i;
if((fp=fopen("F:\\Microsoft Visual Studio\\MyProjects\\rip\\routing.txt","wb"))==NULL)
{
printf("cannot open file\n");
return;
}
for(i=0;i<3;i++)
if(fwrite(&stud[i],sizeof(struct routing_information),1,fp)!=1)
printf("file write error\n");
fclose(fp);
}
//从文件中读出路由表信息的函数
void load()
{
FILE *fp;
int i;
if((fp=fopen("F:\\Microsoft Visual Studio\\MyProjects\\rip\\routing.txt","rb"))==NULL)
{
printf("cannot open the file");
return;
}
fread(&stud[0],sizeof(struct routing_information),1,fp);
printf("%s %d %s\n",stud[0].net_name,stud[0].distance,stud[0].next_routing);
for(i=1;i<stud[0].length;i++)
{
fread(&stud[i],sizeof(struct routing_information),1,fp);
if(i==0)
printf("路由器%s的路由表信息如下:\n",stud[0].routing_name);
printf("%s %d %s\n",stud[i].net_name,stud[i].distance,stud[i].next_routing);
}
fclose(fp);
}
//判断字符串是否相同的子函数
int charEquals(char a[],char b[])
{
int m=0;
while(a[m]!='\0')
{
if(a[m]==b[m])
{
m++;
}
else break;
}
if((m==strlen(a))&&(m==strlen(b)))
return(1);
else
return(0);
}
void update(char s[])
{ int i,j,c=3;
int flag[SIZE];
for(i=0;i<newStud[0].length;i++)
{
strcpy(newStud[i].next_routing,s);
flag[i]=0;
}
for(i=0;i<stud[0].length;i++)
{
for(j=0;j<newStud[0].length;j++)
{
if(charEquals(stud[i].net_name,newStud[j].net_name)==1)
{
flag[j]=1;
if(charEquals(stud[i].next_routing,newStud[j].next_routing)==1)
stud[i].distance=newStud[j].distance;
else
if(stud[i].distance>newStud[j].distance)
{
strcpy(stud[i].next_routing,newStud[j].next_routing);
stud[i].distance=newStud[j].distance;
}
}
}
}
for(i=0;i<newStud[0].length;i++)
{
if(flag[i]==0)
{
strcpy(stud[stud[0].length].routing_name,newStud[i].routing_name);
strcpy(stud[stud[0].length].net_name,newStud[i].net_name);
stud[stud[0].length].distance=newStud[i].distance;
strcpy(stud[stud[0].length].next_routing,newStud[i].next_routing);
stud[0].length++;
}
}
}
void main()
{
int i;
char routingName[5];//用于存储路由器名字
load();
printf("请输入发来rip报文的路由器名字和共有几条记录\n");
scanf("%s %d",&routingName,&newStud[0].length);
printf("请按照“目的网络 距离 下一跳路由器”的格式输入%s路由器发来的更新信息 \n",routingName);
for(i=0;i<3;i++)
{
strcpy(newStud[i].routing_name,routingName);
scanf("%s%d%s",&newStud[i].net_name,&newStud[i].distance,&newStud[i].next_routing);
}
update(routingName);
printf("路由器%s的路由表信息如下:\n",stud[0].routing_name);
for(i=0;i<stud[0].length;i++)
{
if(stud[i].distance<15)
printf("%s %d %s\n",stud[i].net_name,stud[i].distance,stud[i].next_routing);
else
printf("%s %d %s\n",stud[i].net_name,stud[i].distance,stud[i].next_routing);
}
save();
}

求高人指点!!!
...全文
689 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yi19861209 2017-06-14
  • 打赏
  • 举报
回复
「已注销」 2017-06-14
  • 打赏
  • 举报
回复
关于c语言的文件读写函数用法详解,可参考一下这个资料 http://blog.csdn.net/libing403
yi19861209 2017-06-13
  • 打赏
  • 举报
回复
yi19861209 2017-06-13
  • 打赏
  • 举报
回复
赵4老师 2017-06-09
  • 打赏
  • 举报
回复
作为一个C程序员,对 scanf,sscanf,fscanf printf,sprintf,fprintf 这类函数的用法,还是要做到“拳不离手,曲不离口”的。
zhujinqiang 2017-06-09
  • 打赏
  • 举报
回复
c的库函数中有一个现成的可以解析有规律的文件的函数,就是fscanf()函数。 不需要自己写作无用功 可以参考: http://blog.csdn.net/liangxanhai/article/details/8026496
自信男孩 2017-06-08
  • 打赏
  • 举报
回复
对于这样有格式的文本文件,建议使用fscanf/fprintf对文件进行读写;
fscanf(fp, "%s %d %s\n", newStud[i].net_name,&newStud[i].distance, newStud[i].next_routing) 
另外,scanf的参数net_name,和next_routing本身就是数组名,即地址。不需要前面在加&

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧