读书人

C语言读取txt资料每行前三个数

发布时间: 2013-06-25 23:45:41 作者: rapoo

C语言读取txt文件每行前三个数
我在论坛里找到这个方法,自己改了一下,结果“0xC0000005: 读取位置 0x00000000 时发生访问冲突”

求帮忙改一下,谢谢。
文件格式如:
1 1 1 1 1 1 1
2 2 2 2 2 2 2
3 -8 0.9 0 0 0
……
请问有没有更好的方法?(文件数据量很大!)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int *val[3];
int GetData( int *cnt)
{
FILE *fp=fopen("D:\\2.txt","rt");
if(fp)
{
char *buf, *ptr, *pt, *dat,*dat2;
unsigned int len, cnt=0, cn;
fseek(fp,0,2); len=ftell(fp);
fseek(fp,0,0);
buf=(char*)malloc(len+2);
fread(buf,len,1,fp);
pt=buf; buf[len]=0;
while( (ptr=strchr(pt,'\n')) )
{
pt=ptr+1; cnt++;
}
if(strlen(pt)>0)cnt++;
val[0]=(int *)malloc( cnt*sizeof(int) );
val[1]=(int *)malloc( cnt*sizeof(int) );
val[2]=(int *)malloc( cnt*sizeof(int) );
for(cn=0, pt=buf; cn<cnt; cn++)
{
if( (ptr=strchr(pt,'\n')) )*ptr=0;
dat=strchr(pt,' ');
if(dat){ *dat++=0; sscanf(dat,"%ld",val[1]+cn);}
else {val[1][cn]=0;val[2][cn]=0;}
dat2=strchr(dat,' ');
if(dat2){*dat2++=0;sscanf(dat2,"%ld",val[2]+cn);}
else {val[2][cn]=0;}
sscanf(pt,"%d", val[0]+cn);
pt=ptr+1;
}
free(buf);
fclose(fp);
return cnt;
}
return -1;
}

int main(int n,char **pm)
{
int i, cnt;
char buf[200];

//if(n<2){ printf("Input file:"); scanf("%s", buf); pm[1]=buf; }
if( (cnt=GetData( &cnt))>-1 )
for(i=0;i<cnt;i++)printf("%d %d %d\n", val[0][i],val[1][i],val[2][i]);
else printf("Can't open %s\n", pm[1]);
} C 读取文件
[解决办法]
没实际编译链接调试,仅供参考

#include <stdio.h>
#include <string.h>
#define MAXLEN 1000
char ln[MAXLEN];
FILE *f;
int n,L;
double d1,d2,d3;
int main() {
f=fopen("D:\\2.txt","r");
if (NULL==f) {
printf("Can not open file [D:\\2.txt]!\n");
return 2;
}
n=0;
while (1) {
if (NULL==fgets(ln,MAXLEN,f)) break;
L=strlen(ln);


if ('\n'==ln[L-1]) {
n++;
if (3!=sscanf(ln,"%lf%lf%lf",&d1,&d2,&d3)) {
printf("line %d:[%s] can not read 3 double numbers!\n",n,ln);
break;
} else {
//use d1,d2,d3 of line n
//...
}
}
}
fclose(f);
return 0;
}

读书人网 >C语言

热点推荐