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;
}
}
为什么我输入文件名时老是循环说文件打不开?如图
第一个问题:
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;
}
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;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答 2011-06-19
读的时候 路径不对。。还有就是写入的文件是以字符的形式写入的。所以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:读出来的时候也要考虑下,把他转为整形
具体如下
#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:读出来的时候也要考虑下,把他转为整形
第2个回答 2011-06-19
然后输入的时候就有错了貌似写入文件不足结构体长度的部分就用乱码被替代了printf(
第3个回答 2011-06-19
// if(fwrite(head,sizeof(struct classdata),1,text)!=1);
// printf("数据写入失败\n");
//if语句后面多了分号, 所以printf算作单独的一句了,每次循环都会执行
if(fwrite(head,sizeof(struct classdata),1,text)!=1)
printf("数据写入失败\n");
// printf("数据写入失败\n");
//if语句后面多了分号, 所以printf算作单独的一句了,每次循环都会执行
if(fwrite(head,sizeof(struct classdata),1,text)!=1)
printf("数据写入失败\n");