用C语言读取ASCII文件的数据并输出到另一个文件
我的数据文件是一个ASCII文件,是个很大的文件,大小能有三四个G,里面的一些数据格式如图所示。POSITION8.0998-0.0001-1.21860.00483.8...
我的数据文件是一个ASCII文件,是个很大的文件,大小能有三四个G,里面的一些数据格式如图所示。
POSITION 8.0998 -0.0001 -1.2186 0.0048 3.8209 0.0015
VELOCITY 0.0670 0.0001 0.3056 0.0109 -1.4838 0.0006
ACCELERATION 0.0483 -0.0001 -0.2876 -0.0159 -6.6385 -0.0008
在这个数据文件里,我想把图中VELOCITY那行的第五个数据提出来,然后后面还有很多这样的数据,这个数据文件有好几十万上百万行。想把每个VELOCITY这行的那个数据给提取出来,利用C语言把想要的数据读出来,再把读出的数据另存到一个txt的文件中。
请问这个问题用C语言怎么实现,谢谢大神们 展开
POSITION 8.0998 -0.0001 -1.2186 0.0048 3.8209 0.0015
VELOCITY 0.0670 0.0001 0.3056 0.0109 -1.4838 0.0006
ACCELERATION 0.0483 -0.0001 -0.2876 -0.0159 -6.6385 -0.0008
在这个数据文件里,我想把图中VELOCITY那行的第五个数据提出来,然后后面还有很多这样的数据,这个数据文件有好几十万上百万行。想把每个VELOCITY这行的那个数据给提取出来,利用C语言把想要的数据读出来,再把读出的数据另存到一个txt的文件中。
请问这个问题用C语言怎么实现,谢谢大神们 展开
5个回答
展开全部
利用库函数fscanf读取数据的选择功能,每次读取一行中的第一个数据(字符串)和指定位置的数据分别赋给cahr型数组和double型变量,其余的“跳过”。检测读取的字符串是否为特定行首,若是则将读取的double数据写入输出文件。设数据文件在当前目录下,名为1234.txt,举例代码如下:
//#include "stdafx.h"//If the vc++6.0, with this line.
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
int main(void){
FILE *fpin,*fpout;
char str[50];//存放从文件中读取的关键字
double x;//存放读取的指定位置的数据
fpin=fopen("1234.txt","r");
fpout=fopen("1234out.txt","w");
if(fpin==NULL || fpout==NULL){
printf("Open the files failure...\n");
exit(0);
}
while(fscanf(fpin,"%s%*lf%*lf%*lf%*lf%lf%*lf",str,&x)==2)//%*lf表示"跳过"
if(strcmp(str,"VELOCITY")==0)//检测关键字
fprintf(fpout,"%g\n",x);//符合要求则写入另一文件
fclose(fpin);
fclose(fpout);
return 0;
}
展开全部
#include <stdio.h>
#include <string.h>
int main() {
FILE *inf,*outf;
char infilename[] = "indata.txt";
char outfilename[] = "outdata.txt";
char name[30];
int cnt = 0;
double a,b,c,d,e,f;
inf = fopen(infilename,"rt");
outf = fopen(outfilename,"wt");
if(inf == NULL || outf == NULL) {
printf("打开文件失败!\n");
return 1;
}
while(fscanf(inf,"%s%lf%lf%lf%lf%lf%lf%lf",name,&a,&b,&c,&d,&e,&f) == 7) {
if(strcmp(name,"VELOCITY") == 0) {
fprintf(outf,"%lf\n",e);
++cnt;
}
}
printf("共 %d 个数据。\n",cnt);
fclose(inf);
fclose(outf);
return 0;
}
追问
我的数据文件不是txt格式的,而是一个ASCII文件。需要提取的是VELOCITY那行的第五个数据,这个数据文件在前面一些数据可能不要,想从某个固定位置开始提取数据。后面还有很多VELOCITY的数据,提取VELOCITY行的那个,最后提取出来的数据可能有好几万个。这段程序也可以用吗?
追答
ASCII文件就是.txt文件,是用系统的《笔记本》可以直接浏览的文件。
你把代码中的文件名改为实际文件名试一下就知道是否可行了。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
看你提供的例子 第一列不一定是字符串啊 还有个8907 1的一行
试试我这个吧
好用的话给个采纳 不好用就算啦
#include <stdio.h>
#include <string.h>
#define in_file "in.txt"
#define out_file "out.txt"
int main()
{
FILE * in, *out;
double k[5];
char buf[1024], *s;
in = fopen(in_file, "r");
if(in == NULL)
{
printf("can not read file %s\n", in_file);
return -1;
}
out = fopen(out_file, "w");
while(fgets(buf, sizeof(buf), in) != NULL)
{
s = strstr(buf, "VELOCITY");
if(s == NULL) continue;
sscanf(s + 9, "%lf%lf%lf%lf%lf", &k[0], &k[1], &k[2], &k[3], &k[4]);
fprintf(out, "%lf\n", k[4]);
}
fclose(in);
fclose(out);
return 0;
}
追问
我的数据文件不是txt格式的,而是一个ASCII文件。你所看到的8907意思是在8907秒的时候所得到的数据,时间是连续的,一直往下都还有。我想从某个时间出开始提取,然后最后得到的在一段连续时间内的VELOCITY那行的第五个数据,这样最后得到的可能有几万个。这个程序也能用吗?
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include<stdio.h>
void main()
{ FILE *fp,*tp;
float data[6];
char buffer[256],title[40];
if ( fp=fopen("data.txt","r") )
{ if ( tp=fopen("mdata.txt","w+") )
{ while ( !feof(fp) )
{ fgets(buffer,255,fp);
sscanf(buffer,"%s%f%f%f%f%f%f",title,&data[0],&data[1],&data[2],&data[3],
&data[4],&data[5]);
sprintf(buffer,"%s %.4f\n",title,data[4]);
fputs(buffer,fp);
}
fclose(tp);
} else printf("无法建立输出文件。\n");
fclose(fp);
} else printf("无法打开源数据文件读取。\n");
}
void main()
{ FILE *fp,*tp;
float data[6];
char buffer[256],title[40];
if ( fp=fopen("data.txt","r") )
{ if ( tp=fopen("mdata.txt","w+") )
{ while ( !feof(fp) )
{ fgets(buffer,255,fp);
sscanf(buffer,"%s%f%f%f%f%f%f",title,&data[0],&data[1],&data[2],&data[3],
&data[4],&data[5]);
sprintf(buffer,"%s %.4f\n",title,data[4]);
fputs(buffer,fp);
}
fclose(tp);
} else printf("无法建立输出文件。\n");
fclose(fp);
} else printf("无法打开源数据文件读取。\n");
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询