求救,求救!怎么用纯C处理文本文件里面的数据啊,急急急

rantwo 2010-03-23 09:32:45
领导让处理一批实验数据 是.dat或者.log格式的,里面都是浮点数,大概格式示意如下
1.00 2.00 3.00 4.00 5.00 6.00....
2.00 3.00 4.00 5.00 6.00 7.00....
1.00 2.00 3.00 4.00 5.00 6.00....
2.00 3.00 4.00 5.00 6.00 7.00....
1.00 2.00 3.00 4.00 5.00 6.00....
2.00 3.00 4.00 5.00 6.00 7.00....
1.00 2.00 3.00 4.00 5.00 6.00....
2.00 3.00 4.00 5.00 6.00 7.00....
..........................................
................................................
..............................................
..........................................
以上数据只是示意,现在要处理的有两类,A、B
A情况是:以第五列的数据为标志,开始时全都为0,当某一行的此列变成12000时,即把当前这行至最后一行的所有的列数据记录,当前行以上的数据不予记录
B情况类似:以第16列的数据为标志,但是从数据最后一行开始读,开始时全都为0.08,当某一行的此列变成10.2时,即把当前这行至第一行的所有的列数据记录,当前行以下的数据不予记录
然后再对两个新生成文件里面相对应的数据进行进一步处理:譬如说A-new里面第3列与B-new里面的第10列(所有行)数据相减再存到一个新的文本文件中。。。。
本来我已经用matlab实现了,但是领导的要求是用纯C,可是我能力有限,实在是不会,所以上论坛求救。感激不尽。
...全文
115 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2010-03-24
  • 打赏
  • 举报
回复
关于倒着读可能就要用fseek函数了
cattycat 2010-03-24
  • 打赏
  • 举报
回复
fscanf可以格式化读取数据,这个是c的IO操作的函数,fopen,不是很难的。
yuzl32 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 rantwo 的回复:]
问题是不会用C语言写。。现学也来不及 愁死人 哦对了 行数是不固定的只是列数固定
[/Quote]
可以学习一下基本语法,再看看帮助把fopen,fclose,fread,fwrite,fcanf,fprintf等函数搞清楚就可以应付这个问题。否则,即便别人帮你完成了,再遇到困难怎么办?
fx397993401 2010-03-24
  • 打赏
  • 举报
回复
试着去看下 fscanf 和 fprintf 函数
rantwo 2010-03-24
  • 打赏
  • 举报
回复
问题是不会用C语言写。。现学也来不及 愁死人 哦对了 行数是不固定的只是列数固定
rantwo 2010-03-24
  • 打赏
  • 举报
回复
表头是一些汉字格式说明,所以要去掉
rantwo 2010-03-24
  • 打赏
  • 举报
回复
今天翻书看了几个函数和语法,写了个程序,编译通过,无警告无错误,但是新生成的文件是空的!!!真是打击人。另外一个生成的文件是用来记录原文件行数的,以便查看读行数是否成功。想各位帮我看看问题在哪里。还有就是想请教:fscanf()函数是不是读一行然后文件指针就到了下一行的开始处?
以下是我的代码,请大家看看

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>

#define temp 25

main()
{
FILE *fp,*fp1; //fp1指向记录行数的文件
FILE *fp_new; //指向新生成的文件
char array_0[temp];
double array_1[temp]; //俩个数组用于临时存放读的数据,循环读取,比较
double array_2[temp];
int i=1;
int k;
double t=0.0000000;
char mid,nav_file_name[10],new_nav_file_name[10];


printf("Input the nav_file_name :!\n");
scanf("%s",nav_file_name);
printf("Input the new_nav_file_name :!\n");
scanf("%s",new_nav_file_name);
//*************************行数统计完成,往下写时记得去表头,此时行数-1;
if((fp=fopen(nav_file_name,"r"))==NULL)
{
printf("Can not open the file!\n");
exit (0);
}
if((fp1=fopen("stdout.txt","w+"))==NULL)
{
printf("Can not open the file!\n");
exit (0);
}
while(!feof(fp))
{
mid=fgetc(fp);
if(mid=='\n')
fprintf(fp1,"%d ",i++);
}
fclose(fp);
fclose(fp1);
//********************************************************开始处理没用的数据

//去表头,指针会不会停在下一行文件开始处?
fscanf(fp,"%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s\n ",
&array_0[0],&array_0[1],&array_0[2],&array_0[3],\
&array_0[4],&array_0[5],&array_0[6],&array_0[7],\
&array_0[8],&array_0[9],&array_0[10],&array_0[11],\
&array_0[12],&array_0[13],&array_0[14],&array_0[15],\
&array_0[16],&array_0[17],&array_0[18],&array_0[19],\
&array_0[20],&array_0[21],&array_0[22],&array_0[23],\
&array_0[24]);
//先读去掉表头的后第一行
fscanf(fp,"%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf \
%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf \
%lf %lf\n ",
&array_1[0],&array_1[1],&array_1[2],&array_1[3],\
&array_1[4],&array_1[5],&array_1[6],&array_1[7],\
&array_1[8],&array_1[9],&array_1[10],&array_1[11],\
&array_1[12],&array_1[13],&array_1[14],&array_1[15],\
&array_1[16],&array_1[17],&array_1[18],&array_1[19],\
&array_1[20],&array_1[21],&array_1[22],&array_1[23],\
&array_1[24]);

if((fp=fopen(nav_file_name,"r"))==NULL)
{
printf("Can not open the file!\n");
exit (0);
}
if((fp_new=fopen(new_nav_file_name,"w+"))==NULL)
{
printf("Can not open the file!\n");
exit (0);
}
for(k=1;k<=i-2;k++)
{
fscanf(fp,"%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf \
%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf \
%lf %lf\n ",
&array_2[0],&array_2[1],&array_2[2],&array_2[3],\
&array_2[4],&array_2[5],&array_2[6],&array_2[7],\
&array_2[8],&array_2[9],&array_2[10],&array_2[11],\
&array_2[12],&array_2[13],&array_2[14],&array_2[15],\
&array_2[16],&array_2[17],&array_2[18],&array_2[19],\
&array_2[20],&array_2[21],&array_2[22],&array_2[23],\
&array_2[24]);
if(array_2[4]-array_1[4]<=t)//如果差值够小的话说明两个浮点数相等
{
array_1[temp] = array_2[temp];//将下一行读取的数存给数组1
memset( array_2, ' ', 100 ); //将数组2清空便于再次读取,浮点类型变量占用4个字节
}
else
fprintf(fp_new,"%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf \
%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf \
%lf %lf\n ",
array_2[0],array_2[1],array_2[2],array_2[3],\
array_2[4],array_2[5],array_2[6],array_2[7],\
array_2[8],array_2[9],array_2[10],array_2[11],\
array_2[12],array_2[13],array_2[14],array_2[15],\
array_2[16],array_2[17],array_2[18],array_2[19],\
array_2[20],array_2[21],array_2[22],array_2[23],\
array_2[24]
);

fclose(fp);
fclose(fp_new);
}

}
Tauren_Chieftan 2010-03-23
  • 打赏
  • 举报
回复
这个问题的关键在于处理读取文件,根据文件内容进行筛选。
rantwo 2010-03-23
  • 打赏
  • 举报
回复
数据一共30列 谢谢你的关注
huangbo0603 2010-03-23
  • 打赏
  • 举报
回复
帮顶一个!
dubiousway 2010-03-23
  • 打赏
  • 举报
回复
数据一共多少列? 固定吗?

70,037

社区成员

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

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