fscanf 读取大文件的一个问题,编译通过,执行错误.文件行数较少时也能通过,但15000行就出错了,错在什么地方?

tianyongtao 2007-12-11 11:10:04
文本文件的格式如下,共有23040行,15列:
1 1 318 179 232 187 1680 -207.00 -15.96 否 1 1 7 1 1
2 1 338 179 232 188 1680 -207.00 -16.86 否 1 1 7 1 2
3 0 334 615 224 177 1482 -207.00 -24.96 否 1 1 1 1 1
4 1 342 179 232 188 1680 -207.00 -24.96 否 2 1 7 1 1
5 0 312 616 224 176 1482 -207.00 -25.86 否 1 1 1 1 2
6 1 338 179 232 187 1680 -207.00 -25.86 否 2 1 7 1 2
7 0 323 616 224 175 1482 -207.00 -33.96 否 2 1 1 1 1
...
...

c++代码如下:
FILE* fp=fopen(m_filename,"r");//打开文本文件
int *a1=(int*)malloc(40000*sizeof(int)),*a2=(int*)malloc(40000*sizeof(int)),*a3=(int*)malloc(40000*sizeof(int));
int *a4=(int*)malloc(40000*sizeof(int)),*a5=(int*)malloc(40000*sizeof(int)),*a6=(int*)malloc(40000*sizeof(int));
int *a7=(int*)malloc(40000*sizeof(int));//为前7列数据开辟空间,并返回指针
double *a8=(double *)malloc(40000*sizeof(double));double *a9=(double *)malloc(40000*sizeof(double));
char a10[256]={" "};//为第10列数据开辟空间,并返回指针
int *a11=(int*)malloc(40000*sizeof(int)),*a12=(int*)malloc(40000*sizeof(int)),*a13=(int*)malloc(40000*sizeof(int));
int *a14=(int*)malloc(40000*sizeof(int)),*a15=(int*)malloc(40000*sizeof(int));//为11~15列数据开辟空间,并返回指针
int num=0;

while (!feof(fp))
{

fscanf(fp,"%d%d%d%d%d%d%d%f%f%s%d%d%d%d%d\n",(a1+num*sizeof(int)),(a2+num*sizeof(int)),(a3+num*sizeof(int)),
(a4+num*sizeof(int)),(a5+num*sizeof(int)),(a6+num*sizeof(int)),(a7+num*sizeof(int)),(a8+num*sizeof(double)),
(a9+num*sizeof(double)),a10,(a11+num*sizeof(int)),(a12+num*sizeof(int)),(a13+num*sizeof(int)),(a14+num*sizeof(int)),
(a15+num*sizeof(int)));
num++;

}

free((void*)(a1));
free((void*)(a2));free((void*)(a3));free((void*)a4);
free((void*)(a5));free((void*)(a6));free((void*)(a7));free((void*)(a8));
free((void*)(a9));free((void*)(a11));free((void*)(a12));free((void*)(a13));
free((void*)(a14));free((void*)(a15));
fclose(fp);/**/

当文本文件的行数较少时,譬如1000行,程序执行没有问题,但如果2万多行就出错了。错在什么地方?请高手解决
...全文
196 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2012-06-25
  • 打赏
  • 举报
回复
请检查fscanf的返回值。
ftell函数返回当前文件读/写位置。
其实应该这样
static char ln[10000];
n=0;
while (1) {
if (NULL==fgets(ln,10000,f)) break;
n++;
if (15==sscanf(ln,"%d%d%d%d%d%d%d%f%f%s%d%d%d%d%d",...)) {
//...
} else {
printf("line %d format error:%s",n,ln);
}
}
自溟 2012-06-25
  • 打赏
  • 举报
回复
还有一个问题要请教的是:fscanf();在执行循环时候它能够记忆读到哪了吗?这是什么原因啊?
喜洋洋呵呵 2012-06-25
  • 打赏
  • 举报
回复
恩,是内存超了,你当做字符串处理不应该*4的
hongwenjun 2012-06-25
  • 打赏
  • 举报
回复
#include <iostream>
#include <sstream>
#include <fstream>

using namespace std;

stringstream& load_sstream(stringstream& oss, fstream& infile) // 加载文件到sstream
{
oss << infile.rdbuf();
return oss;
}


int main()
{
fstream inFile("main.cpp" , fstream::in);

stringstream oss;
load_sstream(oss, inFile);

string str;

while (oss >> str) {
cout << str << endl;

}
return 0;
}


可以把整个文件 加载到内存 sstream流中
然后 就相当于和你 控制台 cin 输入差不多了
tianyongtao 2008-01-27
  • 打赏
  • 举报
回复
8楼的答案可以结帖。谢谢
zsyddl2 2007-12-13
  • 打赏
  • 举报
回复
对 ,就是 8楼 说的原因。 楼主 指针 没有学好
andy_cai 2007-12-12
  • 打赏
  • 举报
回复
fscan的a1+num*sizeof(int)那些类似的全部改为a1+num
其余类似
你这样子是超过1w行就出错,访问无效内存
飞哥 2007-12-12
  • 打赏
  • 举报
回复
好家伙,有这么干的嘛
tanlijun37 2007-12-12
  • 打赏
  • 举报
回复
不会是内存不足吧,你的文件有多大?
tianyongtao 2007-12-12
  • 打赏
  • 举报
回复
每一行的格式都一模一样的呀,我怎么把我的txt文本给贴上去呢,帮我看看
starwalker 2007-12-11
  • 打赏
  • 举报
回复
不是说程序是哪一行,是你读的那个文件。
读到哪一行出错的,看那一行有什么特别的。
tianyongtao 2007-12-11
  • 打赏
  • 举报
回复
出错的就是fscanf那句,如果注释掉该句,即使20000多行也没有问题。
tianyongtao 2007-12-11
  • 打赏
  • 举报
回复
上面的显示不对,文件的格式如下:
1 1 318 179 232 187 1680 -207.00 -15.96 否 1 1 7 1 1
2 1 338 179 232 188 1680 -207.00 -16.86 否 1 1 7 1 2
3 0 334 615 224 177 1482 -207.00 -24.96 否 1 1 1 1 1
4 1 342 179 232 188 1680 -207.00 -24.96 否 2 1 7 1 1
5 0 312 616 224 176 1482 -207.00 -25.86 否 1 1 1 1 2
6 1 338 179 232 187 1680 -207.00 -25.86 否 2 1 7 1 2
7 0 323 616 224 175 1482 -207.00 -33.96 否 2 1 1 1 1
...
...
starwalker 2007-12-11
  • 打赏
  • 举报
回复
看出错的那行有什么特别的

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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