#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)这样的用法,问题应该就出在这里!
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就可以。
你要是读文件开始的第一个字节的话应该是,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)这样的用法,问题应该就出在这里!
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就可以。
你要是读文件开始的第一个字节的话应该是,fseek(fp,0,SEEK_SET),然后fread就可以。
#4
呵呵,你说的不对,我修改好了!