1.用fgets函数可以读取文件中某行的数据,某列数据就必须一个一个读入每行的第几个字符,再存入到一个字符串当中。
2.例程:
#include
#include
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维数组a[10][31];里)
程序原理:用fgets()读入一行,用 sscanf(buf,"%d %d",&y,&m); 读出年月,若年月满足需要,则
用 sscanf(buf 。。)读出10列数据,存入数组。
#include
#include
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
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];