求解c语言文件问题

JOKERCDD 2020-03-03 05:44:15
如图,信息保存到文件后,想要再将文件提取出来,结果不行。
...全文
772 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
你结构体下面 mess *head 要用malloc 生成 不能直接这样
wgh233223 2020-03-05
  • 打赏
  • 举报
回复
厉害啊 我的哥0 0
专心做一条鱼 2020-03-05
  • 打赏
  • 举报
回复
和我一样 都在写成绩管理系统 我在文件的时候困了老半天
qq_34579174 2020-03-05
  • 打赏
  • 举报
回复
看了好几遍也没发现无误
寻开心 2020-03-05
  • 打赏
  • 举报
回复
fprintf(fp,"%ld\t%s\t%s\t%d%d\t %s\t%s\t%s\t\r\n",
p->number,p->name,p->sex,p->year,p->month,p->add,
p->phone,p->mail);
p=p->next;

愁死个人, 这样写,两个数字都挨在一起了。 一个2一个3, 你这样写输出的是23, 回头fscanf能分出来才见鬼了呢
就一个输出整那么多没有的干嘛呢
这种数据文件你还讲究个什么排版啊, 老老实实的去写:
fprintf(fp,"%ld %s %s %d %d %s %s %s\n", \
p->number, \
p->name, p->sex, \
p->year, p->month, \
p->add, p->phone, p->mail);
luj_1768 2020-03-05
  • 打赏
  • 举报
回复
是不是突破了64k文件长度限制?有多少数据项?通常c语言文件长度不大于64k,否则会出错。需要使用长文件时,需要使用专用的头文件。
Bululublue 2020-03-04
  • 打赏
  • 举报
回复
用二进制读写,调整一下输出的指针的起始位置
Bululublue 2020-03-04
  • 打赏
  • 举报
回复
用二进制读写
JOKERCDD 2020-03-03
  • 打赏
  • 举报
回复
引用 20 楼 m0_46108109的回复:
void save()
{
mess* p = head;
fp = fopen("d:\\stu.txt", "ab+"); //<<--
system("cls");
if (head == NULL) //<<--
{
printf("保存失败,信息为空。");
system("pause");
system("cls");
return;
}
while (p != NULL)
{
fprintf(fp, "%ld\t%s\t%s\t%d\t%d\t%s\t%s\t%s\t\r\n",
p->number, p->name, p->sex, p->year, p->month, p->add,
p->phone, p->mail);
p = p->next;
}
fclose(fp);
printf("保存成功。\n");
system("pause");
system("cls");
return;
}
你数据没有保存对
这里修改了哪里
JOKERCDD 2020-03-03
  • 打赏
  • 举报
回复
我有点晕了。现在是数据储存位置错了,提取没有问题
JOKERCDD 2020-03-03
  • 打赏
  • 举报
回复
引用 22 楼 寻开心的回复:
draw函数启动的时候,屏幕输出什么了?

Start reading data from file ......
1 陈
------Finish--------

还是什么也木有
屏幕输出的就是你说的这个
寻开心 2020-03-03
  • 打赏
  • 举报
回复
while中间, 在scanf之后,还有一个printf呢,那个有没有输出内容?

如果这里都可以正常输出,那么错误也没有发生在draw函数里面啊
你的那个异常,是执行到哪儿出现的
寻开心 2020-03-03
  • 打赏
  • 举报
回复
draw函数启动的时候,屏幕输出什么了?

Start reading data from file ......
1 陈
------Finish--------

还是什么也木有
JOKERCDD 2020-03-03
  • 打赏
  • 举报
回复
引用 13 楼 寻开心 的回复:
head一开始是NULL,但是你的录入操作等,折腾后就不是NULL了
还有那个n,表示有多少个, 这个要和head一样初始化为0
draw读取到时候,也要对n进行同步,才能计数

你的这个数据文件,你打开看了没有,里面都是什么样子的数据,确定正确吗?
很是怀疑呢, 前面的input都是错的, 后面的save怎么可能正确执行下来的
如果save执行的不对, 比如,写入的name的长度超长,超过了数组的大小, 读取进来必然会把mess变量撑死
现在是严重的怀疑你的数据文件就不对


还有就是你怎么确定的问题是出在draw函数里面的呢?
你可以在draw函数上做一点改造:

printf("\nStart reading data from file ......\n")
while(!feof(fp))
{
p=(mess*)malloc(sizeof(mess));
fscanf(fp,"%ld %s %s %d %d %s %s %s\r\n",
&p->number,p->name,p->sex,&p->year,&p->month,p->add,
p->phone,p->mail);
printf("%d %s\n", p->num, p->name);
p->next=head;
head=p;
}
printf("\n------Finish--------\n");

看看屏幕输出了什么


数据错了
院里有座山 2020-03-03
  • 打赏
  • 举报
回复
void save()
{
mess* p = head;
fp = fopen("d:\\stu.txt", "ab+"); //<<--
system("cls");
if (head == NULL) //<<--
{
printf("保存失败,信息为空。");
system("pause");
system("cls");
return;
}
while (p != NULL)
{
fprintf(fp, "%ld\t%s\t%s\t%d\t%d\t%s\t%s\t%s\t\r\n",
p->number, p->name, p->sex, p->year, p->month, p->add,
p->phone, p->mail);
p = p->next;
}
fclose(fp);
printf("保存成功。\n");
system("pause");
system("cls");
return;
}
你数据没有保存对
院里有座山 2020-03-03
  • 打赏
  • 举报
回复
fprintf(fp, "%ld\t%s\t%s\t%d\t%d\t%s\t%s\t%s\t\r\n",
这里错了。
JOKERCDD 2020-03-03
  • 打赏
  • 举报
回复
引用 13 楼 寻开心的回复:
head一开始是NULL,但是你的录入操作等,折腾后就不是NULL了
还有那个n,表示有多少个, 这个要和head一样初始化为0
draw读取到时候,也要对n进行同步,才能计数

你的这个数据文件,你打开看了没有,里面都是什么样子的数据,确定正确吗?
很是怀疑呢, 前面的input都是错的, 后面的save怎么可能正确执行下来的
如果save执行的不对, 比如,写入的name的长度超长,超过了数组的大小, 读取进来必然会把mess变量撑死
现在是严重的怀疑你的数据文件就不对


还有就是你怎么确定的问题是出在draw函数里面的呢?
你可以在draw函数上做一点改造:

printf("\nStart reading data from file ......\n")
while(!feof(fp))
{
p=(mess*)malloc(sizeof(mess));
fscanf(fp,"%ld %s %s %d %d %s %s %s\r\n",
&p->number,p->name,p->sex,&p->year,&p->month,p->add,
p->phone,p->mail);
printf("%d %s\n", p->num, p->name);
p->next=head;
head=p;
}
printf("\n------Finish--------\n");

看看屏幕输出了什么
输出了打印的那两句英文
JOKERCDD 2020-03-03
  • 打赏
  • 举报
回复
引用 15 楼 m0_46108109的回复:
void save()
{
mess *p=head;
fp=fopen("d:\\stu.txt","ab+");
前面保存的就不对。
难道用二进制打开,可以用文本方式读写吗?
文件里是我输入的内容
院里有座山 2020-03-03
  • 打赏
  • 举报
回复
哦哦,我想起来了,这个问题我曾经问过。在linux下只有一种文件格式。
at等同于ab,这个源码应该是linux上的所以没问题。
院里有座山 2020-03-03
  • 打赏
  • 举报
回复
void save()
{
mess *p=head;
fp=fopen("d:\\stu.txt","ab+");
前面保存的就不对。
难道用二进制打开,可以用文本方式读写吗?
加载更多回复(13)

69,369

社区成员

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

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