关于fseek语句,麻烦帮我看下我的理解对不对?
文件里的数据是一行一行的,每行三个数据,用空格分隔。当时文件输出格式为:"%u %u %E\n"。最后几行的数据为:
1023 1023 4.000000E+000
1023 1024 -7.107438E-001
1024 992 -1.000000E+000
1024 1023 -1.293848E+000
1024 1024 4.000000E+000
现在我想从最后一行开始读数据,一直读到第一行,但是行内数据顺序保持不变。
我写的程序如下:
- C/C++ code
#include <iostream>#include <cstdio>#include "my.h"using namespace std;int main(){ int a=0,b=0; long double c=0; FILE *fp=fopen("e:\\F2DA.txt","r"); fseek(fp,-2*sizeof(long double)-6*sizeof(unsigned int)-4*sizeof(" ")-2*sizeof("\n"),SEEK_END); fscanf(fp,"%u %u %lf",&a,&b,&c); cout<<a<<" "<<b<<" "<<c<<endl; fseek(fp,-2*sizeof(long double)-6*sizeof(unsigned int)-4*sizeof(" ")-2*sizeof("\n"),SEEK_CUR); fscanf(fp,"%u %u %lf",&a,&b,&c); cout<<a<<" "<<b<<" "<<c<<endl; fclose(fp); system("pause"); return 0;}出来的结果是:
1024 1023 -1.29385
1 1024 992
我的问题是:
1.seek(fp,0,SEEK_END)后,指针移到了哪里?根据我的程序调试情况,它移到了文件末尾再加一个"\n"?那相应的每读完一个数据,指针是移动到所读数据及之后的一个空格/空行后?
2.我期待第一行出现的数据是1024 1023 -1.293848,但是程序给出的结果少了一位,怎么样改进呢?
3.第二行数据我期望得到1024 992 -1.000000E+000,这是哪里错了啊?把第二个scanf改成fseek(fp,-2*sizeof(long double)-6*sizeof(unsigned int)-4*sizeof(" ")-sizeof("\n"),SEEK_CUR);就对了。做完第一个fscanf后指针指到哪里了呢?谢谢!
4.根据程序,是只有文件最后一行需要多加一个"\n"么?
[解决办法]
- C/C++ code
#include <stdio.h>FILE *f;int ch;long offset;char ln[100];int a,b;double c;void main() { f=fopen("a.txt","rb");//必须用b方式打开,否则文件当前读位置会受\x0d \x0a \x1a等字符的干扰 fseek(f,-1,SEEK_END);//倒数最后一个字节之前 while (1) { ch=fgetc(f); if ('\n'==ch) { offset=ftell(f);//记住当前位置,即刚读字符后面 fgets(ln,100,f); sscanf(ln,"%d%d%lf",&a,&b,&c); printf("%u %u %E\n",a,b,c); fseek(f,offset-2,SEEK_SET);//回到刚才读位置之前一个位置,即c所在位置之前一个位置 } else if (fseek(f,-2,SEEK_CUR)) {//回到刚才读位置之前一个位置,即c所在位置之前一个位置失败,说明已读到文件开头 fseek(f,0,SEEK_SET); fgets(ln,100,f);//读文件第一行内容 sscanf(ln,"%d%d%lf",&a,&b,&c); printf("%u %u %E\n",a,b,c); break; } } fclose(f);}