有关C语言从文件读取字符串存入到数组中,急求解答!!!

maspacious 2013-10-25 04:12:25

#include <stdio.h>
#include <stdlib.h>
#define ROW 3312
#define COL 2
void main()
{
struct node
{
int count;
char name[50];
}bench[ROW][COL];
FILE *file;
file = fopen("data.txt" , "r");
if(file == NULL)
{
printf("该文件不存在!");
}
else
{
for(int i = 0; i < ROW ; ++i)
for(int j = 0; j < COL ; ++j)
{
fscanf(file, "%d%s", &bench[i][j].count, bench[i][j].name);
}
fclose(file);
}
for(int i = 0 ; i < ROW ; ++i)
for(int j = 0; j < COL ; ++j)
{
printf("%d %s \n",bench[i][j].count, bench[i][j].name);
}
system("pause");
}

文件可以正常读入和输出显示,但是当到文件末尾之后仍然一直输出乱码,如图显示:

哪里出了问题求解答
...全文
997 27 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
绿皮蛙 2013-10-28
  • 打赏
  • 举报
回复
楼主 你用16进制看一下你的文件最后是什么数据
绿皮蛙 2013-10-28
  • 打赏
  • 举报
回复
用0初始化 准确的说 应该是最后一个char name[50]没有用\0来结束 就把之后的0XCC都输出了
schlafenhamster 2013-10-28
  • 打赏
  • 举报
回复
其实: while(2==fscanf(file, "%d%s", &bench[i][j].count, bench[i][j].name)) { 。。。 } 就完了。
赵4老师 2013-10-28
  • 打赏
  • 举报
回复
请判断fscanf函数的返回值!
fei474241558 2013-10-28
  • 打赏
  • 举报
回复
你用的那个嵌套循环把次数翻了一倍,再往后读就越界了。 试试这样看看。
	if(file == NULL)
	{
		printf("该文件不存在!");
	}
	else
	{
		for(int i = 0; i < ROW ; ++i)  
			fscanf(file, "%d%s", &bench[i].count, bench[i].name);
		fclose(file);
	}
	for(int i = 0 ; i < ROW ; ++i)
		printf("%d    %s \n",bench[i].count, bench[i].name);
	system("pause");
yulitingfeng 2013-10-28
  • 打赏
  • 举报
回复
引用 20 楼 schlafenhamster 的回复:
if(2==fscanf(file, "%d%s", &bench[i][j].count, bench[i][j].name)) { }
判断下数据是否成功读入。 你的数组是固定的长度,而文件里是否有足够的数据来填充数组呢? 如果读入中途出错或者数据已经结束,读入是否应该终止? 打印时应该以读入后的数组大小来做边界。如果数组并没有那么多数据呢?数组打印的值后面肯定是不正确的吗?
zmkkobe 2013-10-27
  • 打赏
  • 举报
回复
memset(bench,0,sizeof(bench)); 可以处理掉后面的烫字
schlafenhamster 2013-10-26
  • 打赏
  • 举报
回复
if(2==fscanf(file, "%d%s", &bench[i][j].count, bench[i][j].name)) { }
gz_qmc 2013-10-25
  • 打赏
  • 举报
回复
没有初始化造成的 打开文件之前加一句 memset(bench,0,sizeof(bench)); 便可解决问题
scgywx 2013-10-25
  • 打赏
  • 举报
回复
很明显是读文件读出错了! fscanf(file, "%d%s", &bench[i][j].count, bench[i][j].name); 上面加两句 bench[i][j].count = 0; bench[i][j].name[0] = '\0';
zhao 2013-10-25
  • 打赏
  • 举报
回复
引用 3 楼 wangdahu888 的回复:
很明显访问了栈访问越界了。栈的内容通常以0CCCCCCCCh来初始化,就那个 烫 字
三楼神人啊,这都被你发现了,应该得分!
做或不做 2013-10-25
  • 打赏
  • 举报
回复
注意,fscanf函数在遇到文件EOF时会返回-1;因此可以将程序的原fscanf行改成: int res = fscanf(file, "%d%s", &bench[i][j].count, bench[i][j].name); if(res == -1) { break; } 搞定了的话 把分给我
maspacious 2013-10-25
  • 打赏
  • 举报
回复
引用 14 楼 u011779875 的回复:
[quote=引用 12 楼 maspacious 的回复:] [quote=引用 11 楼 u011779875 的回复:] [quote=引用 10 楼 maspacious 的回复:] [quote=引用 9 楼 u011779875 的回复:] 文件 有问题 txt 里面有非法字符可能 你删除出错那行 把前面的复制到下面 继续调试
没有出错的行啊。3312全部输出了都正确 只是后面多余了[/quote] #define ROW 3312 你看我的帖子了吗 你文件就3312行 你定义的是3312 我开始你就和你说了 你输出的时候 还是输出的3312 for(int i = 0 ; i < ROW ; ++i) for(int j = 0; j < COL ; ++j) 你有那么多吗 读到那么多了吗 就输出[/quote] 你看我程序了么 是 二维的 3312行2列。正常输出不就是这样么[/quote] fscanf(file, "%d%s", &bench[i][j].count, bench[i][j].name); 这个函数读取文本的时候开始的时候都是没一行有1个\n 但是读取到最后一行的时候直接就是-1了 所以 你要在读最后一行做一个处理[/quote] 问题已经解决了。不是这个问题。 我只需要一个一维数组 里面包含两个内容。二我申请了一个二维的。
做或不做 2013-10-25
  • 打赏
  • 举报
回复
引用 12 楼 maspacious 的回复:
[quote=引用 11 楼 u011779875 的回复:] [quote=引用 10 楼 maspacious 的回复:] [quote=引用 9 楼 u011779875 的回复:] 文件 有问题 txt 里面有非法字符可能 你删除出错那行 把前面的复制到下面 继续调试
没有出错的行啊。3312全部输出了都正确 只是后面多余了[/quote] #define ROW 3312 你看我的帖子了吗 你文件就3312行 你定义的是3312 我开始你就和你说了 你输出的时候 还是输出的3312 for(int i = 0 ; i < ROW ; ++i) for(int j = 0; j < COL ; ++j) 你有那么多吗 读到那么多了吗 就输出[/quote] 你看我程序了么 是 二维的 3312行2列。正常输出不就是这样么[/quote] fscanf(file, "%d%s", &bench[i][j].count, bench[i][j].name); 这个函数读取文本的时候开始的时候都是没一行有1个\n 但是读取到最后一行的时候直接就是-1了 所以 你要在读最后一行做一个处理
做或不做 2013-10-25
  • 打赏
  • 举报
回复
最后一次读 没有/0 你要做特殊的处理 】我才看出问题所在
maspacious 2013-10-25
  • 打赏
  • 举报
回复
引用 11 楼 u011779875 的回复:
[quote=引用 10 楼 maspacious 的回复:] [quote=引用 9 楼 u011779875 的回复:] 文件 有问题 txt 里面有非法字符可能 你删除出错那行 把前面的复制到下面 继续调试
没有出错的行啊。3312全部输出了都正确 只是后面多余了[/quote] #define ROW 3312 你看我的帖子了吗 你文件就3312行 你定义的是3312 我开始你就和你说了 你输出的时候 还是输出的3312 for(int i = 0 ; i < ROW ; ++i) for(int j = 0; j < COL ; ++j) 你有那么多吗 读到那么多了吗 就输出[/quote] 你看我程序了么 是 二维的 3312行2列。正常输出不就是这样么
做或不做 2013-10-25
  • 打赏
  • 举报
回复
引用 10 楼 maspacious 的回复:
[quote=引用 9 楼 u011779875 的回复:] 文件 有问题 txt 里面有非法字符可能 你删除出错那行 把前面的复制到下面 继续调试
没有出错的行啊。3312全部输出了都正确 只是后面多余了[/quote] #define ROW 3312 你看我的帖子了吗 你文件就3312行 你定义的是3312 我开始你就和你说了 你输出的时候 还是输出的3312 for(int i = 0 ; i < ROW ; ++i) for(int j = 0; j < COL ; ++j) 你有那么多吗 读到那么多了吗 就输出
maspacious 2013-10-25
  • 打赏
  • 举报
回复
引用 9 楼 u011779875 的回复:
文件 有问题 txt 里面有非法字符可能 你删除出错那行 把前面的复制到下面 继续调试
没有出错的行啊。3312全部输出了都正确 只是后面多余了
做或不做 2013-10-25
  • 打赏
  • 举报
回复
文件 有问题 txt 里面有非法字符可能 你删除出错那行 把前面的复制到下面 继续调试
做或不做 2013-10-25
  • 打赏
  • 举报
回复
引用 7 楼 maspacious 的回复:
[quote=引用 6 楼 wangdahu888 的回复:] [quote=引用 3 楼 wangdahu888 的回复:] 很明显访问了栈访问越界了。栈的内容通常以0CCCCCCCCh来初始化,就那个 烫 字
我说错了,应该是访问了未被写入内容的栈空间,栈的内容通常以0CCCCCCCCh来初始化,就那个 烫 字[/quote] 如何修改。。。。找不到地方啊[/quote] 我以前真的遇到过这个问题 只是脑袋忘记了 是哪了
加载更多回复(7)

70,020

社区成员

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

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