首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于fseek语句,麻烦帮小弟我看下小弟我的理解对不对

2012-05-20 
关于fseek语句,麻烦帮我看下我的理解对不对?文件里的数据是一行一行的,每行三个数据,用空格分隔。当时文件

关于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);} 

热点排行