首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2013-06-25 
C语言读取txt文件每行前三个数我在论坛里找到这个方法,自己改了一下,结果“0xC0000005: 读取位置 0x0000000

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;
}

热点排行