C语言结构体的文件写入问题

voidsave(structclassdata*head){FILE*text;chardata[10];printf("请输入你要建立的文本名字:");scanf("... void save(struct classdata *head)
{FILE *text;
char data[10];
printf("请输入你要建立的文本名字:");
scanf("%s",data);
if((text=fopen(data,"wb+"))==NULL)
{printf("文件打开失败\n");

}
while(head!=NULL)
{

if(fwrite(head,sizeof(struct classdata),1,text)!=1);
printf("数据写入失败\n");
head=head->transverse;

}
}
为什么我输入文件名时老是循环说文件打不开?如图
展开
 我来答
zzyyxxaabbcc
2011-06-19 · TA获得超过3641个赞
知道大有可为答主
回答量:3542
采纳率:50%
帮助的人:3200万
展开全部
第一个问题:
void save(struct classdata *head)
函数的返回类型定义为void,建议修改为int或其他类型,总之应有返回值,因为函数的调用者是关心该函数的运行结果的。

第二个问题:
if((text=fopen(data,"wb+"))==NULL)
{printf("文件打开失败\n");
//通常这里需要返回,因为fopen操作已经失败了,后面的操作无法正确执行,应该向函数调用者返回一个错误值。不过你的这个函数声明为void类型,无法返回值,会影响到对程序的控制(因为函数的调用者不知道调用后函数的执行结果是正常结束的还是异常结束的)。
}

第三个问题:
while(head!=NULL)
{
if(fwrite(head,sizeof(struct classdata),1,text)!=1); //这一行最后的分号应删除
//这里;应该加一个左花括号
printf("数据写入失败\n");
// 这里应该加一个右花括号
head=head->transverse;
}
修改后
while(head!=NULL)
{
if(fwrite(head,sizeof(struct classdata),1,text)!=1)
{
printf("数据写入失败\n");
//注1:这里应返回一个错误值
}
head=head->transverse;
}

注1:这里有与问题二同样的情况,没有对可能出现的异常情况进行判断和处理,所以,即使发生异常,循环仍会继续进行直到最后一条记录(当fwrite出现一次异常,通常之后的操作也不会正常完成),如你的代码,就会反复输出"数据写入失败"字样。
对于你的应用程序来说,可能没有太多条记录(学生数再多也就是百或者千数量级的),所以表面上可能看不出来有什么影响。在实际的软件工程项目中,操作的如果是以百万或千万数量级的记录数(如数据库),效率上就会有很大的差别。建议养成良好的习惯,对可能出现的异常要进行判断和处理。
实际上,一个函数的代码中,真正完成函数功能的代码可能很少,但用于异常情况的判断和处理的代码可能会是实现函数功能代码的N多倍,这样才可以作出坚固、稳定的程序。

综上,个人给出建议的代码:
int save(struct classdata *head)
{
FILE *text;
char data[255]; //这里有改动,文件名字符串长度建议长一些
printf("请输入你要建立的文本名字:");
scanf("%s",data);
if((text=fopen(data,"wb+"))==NULL)
{
printf("文件打开失败\n");
return -1;
}
while(head!=NULL)
{
if(fwrite(head,sizeof(struct classdata),1,text)!=1)
{
printf("数据写入失败\n");
return -2;
}
head=head->transverse;
}
return 0;
}
鱼米草欲钩f
2011-06-19 · TA获得超过3050个赞
知道大有可为答主
回答量:4627
采纳率:55%
帮助的人:891万
展开全部
读的时候 路径不对。。还有就是写入的文件是以字符的形式写入的。所以int型要转一下。。
具体如下
#include"stdio.h"
#include"conio.h"
#include"stdlib.h"

struct node
{
int a;
char b[2];
};

main()
{
FILE *p;
char ch;
int i=0,len=sizeof(struct node);
struct node stu[2];
char temp[2];
for(i=0;i<2;i++)
{
printf("information:\n");
gets(temp);
stu[i].a=atoi(temp);
gets(stu[i].b);
}//输入结构体数组
for(i=0;i<2;i++)
{
printf("%d %s\n",stu[i].a,stu[i].b);
}//检查是否输入成功
if(stu[0].a>stu[0].a)
printf("A\n");
else printf("B\n");//判断大小,无关问题
if((p=fopen("d:\\tex.txt","w+"))==NULL)//打开文件
printf("ERROR\n");
else
{
for(i=0;i<2;i++)
{
itoa(stu[i].a, temp, 10); //转为字符写入
fwrite(temp,sizeof(temp),1,p);
fwrite(stu[i].b,sizeof(stu[i].b),1,p);
}
}//将结构体写入文件
fclose(p);

if((p=fopen("d:\\tex.txt","r"))==NULL)
printf("ERROR\n");
else
{
while((ch=fgetc(p))!=EOF)
putchar(ch);

fclose(p);
}//输出文件信息

}
ps:读出来的时候也要考虑下,把他转为整形
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
houcheng65
2011-06-19 · 超过33用户采纳过TA的回答
知道答主
回答量:416
采纳率:0%
帮助的人:0
展开全部
然后输入的时候就有错了貌似写入文件不足结构体长度的部分就用乱码被替代了printf(
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ssilspro
2011-06-19 · TA获得超过2625个赞
知道大有可为答主
回答量:1148
采纳率:0%
帮助的人:1719万
展开全部
// if(fwrite(head,sizeof(struct classdata),1,text)!=1);
// printf("数据写入失败\n");
//if语句后面多了分号, 所以printf算作单独的一句了,每次循环都会执行
if(fwrite(head,sizeof(struct classdata),1,text)!=1)
printf("数据写入失败\n");
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式