求助关于fseek函数的偏移量问题,求解此代码运行结果不同的原因

时间:2022-03-14 19:09:07
此程序用于从sgy格式文件读取地震数据,里面用到了fseek函数
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include<conio.h>

union Data{float a; char dat[4];};
union SI{unsigned short a; char s[2];};
union SP{unsigned short i; char s[2];};
main()
{
   short Tn;
   int i,j;
   int k;
   char ch;
   float dat;
   union SI si;//采样点数
   union SP sp;//定义采样率
   union Data data;//定义数据
   FILE *fp, *fp1;
   fp = fopen("1 shot8-20.sgy","rb");//打开SEGY数据文件
   if(!fp)
   {
   printf("can't open fileseg!");
       exit(1);
   }
   fseek(fp,3220L,0);
   fread(si.s,2,1,fp);//读取采样点
   ch=si.s[0];
   si.s[0]=si.s[1];
   si.s[1]=ch;
   fseek(fp,3216L,0);//读取采样率
   fread(sp.s,2,1,fp);
   ch=sp.s[0];
   sp.s[0]=sp.s[1];
   sp.s[1]=ch;
   j=0;
   rewind(fp); 
   while(!feof(fp))
   {
      fread(&k,1,1,fp);
  j+=1;
   }
   Tn = (short)((j-1-3600)/(float)(si.a*4+240));   //计算道数 
   if(!(fp1=fopen("data.txt","w+")))   //新建文本文件存储数据
   {
   printf("can't open text file!");
       exit(1);  
   }
    fprintf(fp1,"si = %u, sp =%u, Tn =%d, j=%d\n",si.a, sp.i, Tn, j);
 
 
  for(j=1;j<=2;j++)
   {
  fprintf(fp1,"÷÷÷÷÷÷÷÷÷÷÷÷÷÷The %d trace:--------------\n", j);
for(i=1;i<=si.a;i++)
    {
      fseek(fp,3600L+j*240L+(j-1)*si.a*4L+(i-1)*4L,0);
  //fseek(fp,3600L+240L+i*4L,0);
  fread(data.dat,4,1,fp);
  ch=data.dat[0];
  data.dat[0]=data.dat[3];
  data.dat[3]=ch;
  ch=data.dat[1];
  data.dat[2]=data.dat[1];
  data.dat[1]=ch;  
  fprintf(fp1,"%f\n",data.a);
 // if((i+1)%10==0)
     //  fprintf(fp1,"\n");   
  if(fabs(data.a)>1e6)
  printf("error");
    }
fprintf(fp1,"\n");
   }

   fclose(fp1);
   fclose(fp);
}
为了验证我读取结果的正确性,我直接用此函数读取第一个数据fseek(fp,3840L,0);可是结果与整体读取后的第一个数据不同!!求解原因

4 个解决方案

#1


读第一个数据设置应该为
fseek(FILE* fp,0,SEEK_SET) 文件开始
fseek(FILE* fp,0,SEEK_END) 文件结束
fseek(FILE* fp,offset,SEEK_CUR) 文件当前位置的+偏移量offset

不建议fseek(fp,3840L,0)这样的用法,问题应该就出在这里!

#2


不关那个的事,我的0指的是SEEK_SET,我试了

#3


fseek(fp,3840L,0); 的意思是将文件的读写指针移到文件的3840L字节处,你要是读的话就是读第3840L个字节的内容,

你要是读文件开始的第一个字节的话应该是,fseek(fp,0,SEEK_SET),然后fread就可以。

#4


呵呵,你说的不对,我修改好了!

#1


读第一个数据设置应该为
fseek(FILE* fp,0,SEEK_SET) 文件开始
fseek(FILE* fp,0,SEEK_END) 文件结束
fseek(FILE* fp,offset,SEEK_CUR) 文件当前位置的+偏移量offset

不建议fseek(fp,3840L,0)这样的用法,问题应该就出在这里!

#2


不关那个的事,我的0指的是SEEK_SET,我试了

#3


fseek(fp,3840L,0); 的意思是将文件的读写指针移到文件的3840L字节处,你要是读的话就是读第3840L个字节的内容,

你要是读文件开始的第一个字节的话应该是,fseek(fp,0,SEEK_SET),然后fread就可以。

#4


呵呵,你说的不对,我修改好了!