C或C++编程从TXT文件中读取特定行并存入数组
有一个约10000行的txt文件,部分行数据示意如下(前三列为日期,按递增顺序排列):196212037684-0.0548950.2293050.02730770.00...
有一个约10000行的txt文件,部分行数据示意如下(前三列为日期,按递增顺序排列):
1962 1 20 37684 -0.054895 0.229305 0.0273077 0.0006810 0.000000 0.000000
1962 1 21 37685 -0.055995 0.229905 0.0277506 0.0006780 0.000000 0.000000
1962 1 22 37686 -0.057094 0.230506 0.0281834 0.0007210 0.000000 0.000000
1962 1 23 37687 -0.057994 0.231006 0.0285533 0.0007900 0.000000 0.000000
要求找出给定日期(例如1962 1 21)所在月份的所有数据并将这些数据按列存为10个数组,或者找出给定日期的前后10天的所有数据并将这些数据按列存为10个数组。C或者C++编程都可以,本人C++初学者,最好程序简单易懂点。多谢各位大侠!~ 展开
1962 1 20 37684 -0.054895 0.229305 0.0273077 0.0006810 0.000000 0.000000
1962 1 21 37685 -0.055995 0.229905 0.0277506 0.0006780 0.000000 0.000000
1962 1 22 37686 -0.057094 0.230506 0.0281834 0.0007210 0.000000 0.000000
1962 1 23 37687 -0.057994 0.231006 0.0285533 0.0007900 0.000000 0.000000
要求找出给定日期(例如1962 1 21)所在月份的所有数据并将这些数据按列存为10个数组,或者找出给定日期的前后10天的所有数据并将这些数据按列存为10个数组。C或者C++编程都可以,本人C++初学者,最好程序简单易懂点。多谢各位大侠!~ 展开
4个回答
展开全部
1.用fgets函数可以读取文件中某行的数据,某列数据就必须一个一个读入每行的第几个字符,再存入到一个字符串当中。
2.例程:
#include<stdio.h>
#include<string.h>
void main()
{
char a[100],b[100],c[100];
int i=3,j=4,k=0; //第三行,第四列
FILE *fp = fopen("data.txt","r");
while(fgets(c,100,fp)){ //读入每行数据
i--;
if(i==0) strcpy(a,c); //读到第三行数据
b[k++]=c[j-1]; //把每行的那列字符拷到b中
}
b[k]=0;
printf("第%d行数据:%s\n",i,a);
printf("第%d列数据:%s\n",j,b);
fclose(fp);
}
展开全部
1)如果每行长度一致;只读开始的日期 (只需要年份和月份);采用精确的二分查找。
2)如果长度大致一致,并且按照日期顺序存放,可以大致计算一个位置,使用非精确的二分查找。
(读字符直到回车换行)
3)否则 必须 每次读取一行数据。逐一查找。
4)不论长度一致还是大概一致,都可以,只读少量数据,就获得每行的长度。
a)每行长度一致,只读一行就可以精确知道,每行的精确长度。
b)每行长度大致一致,读3到5 行求平均长度,就可以大概知道,每行的长度,不过需要像盲人摸象,那样获取所读行的精确位置。
文件位置(文件指针)相关的函数
C:
文件代号: seek, telll,
FILE *; fseek,ftell;
C++:
ifstream::seekg;ifstream::tellg;
ofstream::seekp;ofstream::tellg;
Windows API:
SetFilePointer;GetFilePointer;
MFC CFile::Seek;CFile::SeekToBengin;CFile::SeekToEnd;
2)如果长度大致一致,并且按照日期顺序存放,可以大致计算一个位置,使用非精确的二分查找。
(读字符直到回车换行)
3)否则 必须 每次读取一行数据。逐一查找。
4)不论长度一致还是大概一致,都可以,只读少量数据,就获得每行的长度。
a)每行长度一致,只读一行就可以精确知道,每行的精确长度。
b)每行长度大致一致,读3到5 行求平均长度,就可以大概知道,每行的长度,不过需要像盲人摸象,那样获取所读行的精确位置。
文件位置(文件指针)相关的函数
C:
文件代号: seek, telll,
FILE *; fseek,ftell;
C++:
ifstream::seekg;ifstream::tellg;
ofstream::seekp;ofstream::tellg;
Windows API:
SetFilePointer;GetFilePointer;
MFC CFile::Seek;CFile::SeekToBengin;CFile::SeekToEnd;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这是给定日期,输出同年同月数据(存放在2维数组a[10][31];里)
程序原理:用fgets()读入一行,用 sscanf(buf,"%d %d",&y,&m); 读出年月,若年月满足需要,则
用 sscanf(buf 。。)读出10列数据,存入数组。
#include <stdio.h>
#include <stdlib.h>
int main(){
FILE *fin;
char buf[200];
int year,month,day,y,m,d;
float a[10][31];
int i,j,n=0;
fin=fopen("abc.txt","r");
printf("input 1962 1 21\n");
scanf("%d %d %d",&year,&month,&day);
while(1){
if (fgets(buf,200,fin)==NULL) break;
sscanf(buf,"%d %d",&y,&m);
if (y==year && m==month){
sscanf(buf,"%f%f%f%f%f%f%f%f%f%f",&a[0][n],&a[1][n],
&a[2][n],&a[3][n],&a[4][n],&a[5][n],&a[6][n],&a[7][n],
&a[8][n],&a[9][n]);
n++;
};
};
fclose(fin);
for (j=0;j<n;j++){
for (i=0;i<10;i++) printf("%g ",a[i][j]);
printf("\n");
};
return 0;
}
如果要找前后10天数据,你可以先计算前后目标日期,
用 sscanf(buf,"%d %d &d",&y,&m,&d); 读得年月日,符合开始日期,没超过截止日期的行存起来就可以了。你可以模仿上面程序自己写。
程序原理:用fgets()读入一行,用 sscanf(buf,"%d %d",&y,&m); 读出年月,若年月满足需要,则
用 sscanf(buf 。。)读出10列数据,存入数组。
#include <stdio.h>
#include <stdlib.h>
int main(){
FILE *fin;
char buf[200];
int year,month,day,y,m,d;
float a[10][31];
int i,j,n=0;
fin=fopen("abc.txt","r");
printf("input 1962 1 21\n");
scanf("%d %d %d",&year,&month,&day);
while(1){
if (fgets(buf,200,fin)==NULL) break;
sscanf(buf,"%d %d",&y,&m);
if (y==year && m==month){
sscanf(buf,"%f%f%f%f%f%f%f%f%f%f",&a[0][n],&a[1][n],
&a[2][n],&a[3][n],&a[4][n],&a[5][n],&a[6][n],&a[7][n],
&a[8][n],&a[9][n]);
n++;
};
};
fclose(fin);
for (j=0;j<n;j++){
for (i=0;i<10;i++) printf("%g ",a[i][j]);
printf("\n");
};
return 0;
}
如果要找前后10天数据,你可以先计算前后目标日期,
用 sscanf(buf,"%d %d &d",&y,&m,&d); 读得年月日,符合开始日期,没超过截止日期的行存起来就可以了。你可以模仿上面程序自己写。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int a,b,c;
ifstream fin(“xx.txt”);
while(fin>>a&&fin>>b&&fin>>c)
if(a==1962&&b==1&&c==21)
break;
double d[10];
for(xxxxx)
fin>>d[i];
ifstream fin(“xx.txt”);
while(fin>>a&&fin>>b&&fin>>c)
if(a==1962&&b==1&&c==21)
break;
double d[10];
for(xxxxx)
fin>>d[i];
追问
好的我试试看
追答
fin相当于是一个输入指令吧。。。将读取到的内容输入给d~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询