用C语言读写SGY格式的地震数据文件
时间:2025-02-24
时间:2025-02-24
本文介绍了如何读取微机格式sgy地震勘探数据文件,给出了读取文件头3200字节、400字节以及地震道的例子,供初学者入门参考。
用C语言读写SGY格式的地震数据
Yangwqcumt
百度专用,转载需授权
地震勘探野外采集的数据,以及经过资料处理获得的三维数据体,只要是放在计算机里,都是以二进制文件的形式存放的。这些文件的处理显示等工作,一般都可以用商业化的软件进行。但是作为一个从事地震勘探研究的技术人员,有时会有些想法,有某种灵感,但是原有的软件又不允许你去做某种试验以验证你的想法。这时候,自编个小程序显然有必要,而且弄好后你的成就感会很强烈。
1. SEGY格式地震数据文件
地震数据,是以各种格式存放的。所谓格式,指的是地震数据以及各种信息在文件内部的存放方式及顺序。
常见的地震数据格式,有segy格式、seg2格式、segd格式等。同样的格式,还有微机版、工作站版及其它版本。
本文仅是入门级材料,我们仅就微机版segy格式进行分析。 Segy格式的地震数据文件,属于典型的流式文件,它的信息和数据都是按字节顺序一个个地存放的,每个字节都有其特定的含义。
这种格式的文件,由文件头部的3600字节以及地震道组成。 文件头前部的3200字节共分为40行,每行80个字符,但这些字符不是ascii码,是一种称为ebcdic的编码。一般这部分都不去读,或者只能显示出来查看其中的内容。
接下来是400字节的二进制部分。这里面有长整型数和短整型数,其具体含义参见附录一。
本文介绍了如何读取微机格式sgy地震勘探数据文件,给出了读取文件头3200字节、400字节以及地震道的例子,供初学者入门参考。
每个地震道由道头240字节(参见附录一)和地震数据组成。地震数据的个数和类型(指它是浮点数整数还是什么)文件头中有定义。此处我们假定所有的数据都是微机的四字节浮点数。
2. 文件头部3200字节特殊编码部分的读取。
该部分共分为40行,每行80个字符,但这些字符不是ascii码,是一种称为ebcdic的编码。转换成ascii码可以采用查表的方法进行。一般处理地震数据不用读这部分的内容。
#include "stdio.h"
#include "stdlib.h"
void main()
{
unsigned char E2A[256]={
0, 1, 2, 3,156, 9,134,127,151,141,142, 11, 12, 13, 14, 15, 16, 17, 18, 19,157,133, 8,135, 24, 25,146,143, 28, 29, 30, 31, 128,129,130,131,132,10,23,
27,136,137,138,139,140, 5, 6, 7, 144,145, 22,147,148,149,150, 4,152,153,154,155, 20, 21,158, 26, 32,160,161,162,163,164,165,166,167,168, 91, 46, 60, 40, 43, 33, 38,169,170,171,172,173,174,175,176,177, 93, 36, 42, 41, 59, 94, 45,
47,178,179,180,181,182,183,184,185,124, 44, 37, 95, 62, 63,
186,187,188,189,190,191,192,193,194, 96, 58, 35, 64, 39, 61, 34, 195, 97, 98, 99,100,101,102,103,104,105,196,197,198,199,200,201,
202,106,107,108,109,110,111,112,113,114,203,204,205,206,207,
208,209,126,115,116,117,118,119,120,121,122,210,211,212,213,214,215,
216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231, 123, 65, 66, 67, 68, 69, 70,71, 72, 73,232,233,234,235,236,237, 125, 74, 75, 76,
77,78,79,80,81,82,238,239,240,241,242,243, 92,159, 83, 84, 85, 86, 87, 88, 89, 90,244,245,246,247,248,249, 48,49, 50, 51, 52, 53, 54, 55, 56,
57,250,251,252,253,254,255};
int i,j;
unsigned char f3200[3200]; FILE *f1; char s1[200];
printf("Input Sgy File Name:\n"); scanf("%s",s1); //输入文件名
f1=fopen(s1,"rb"); fread(f3200,3200,1,f1);
fclose(f1);
for(i=0;i<40;i++)
{ for(j=0;j<80;j++) printf("%c",E2A[f3200[i*80+j]]);
printf("\n");
}
}
本文介绍了如何读取微机格式sgy地震勘探数据文件,给出了读取文件头3200字节、400字节以及地震道的例子,供初学者入门参考。
3. 文件头400字节二进制部分的读取
可以把400字节作为若干个长整型及短整型数据读入:
#include "stdio.h"
#include "stdlib.h"
void main()
{
fread(f3200,3200,1,f1); //读入前面的字节 fread(s1,400,1,f1); //读入接着的字节,作为长整型数 fseek(f1,3200,0); //退回去, fread(s2,400,1,f1); //再以短整型数读入那些个字节 for(i=0;i<3;i++) printf("[%d]:%d \n",i+1,s1[i]); //显示文件头格式说明中的二进制部分的前三项 for(i=3;i<15;i++) //显示4-1,4-2,。。。,15-1,15-2 { } printf("[%d-1]:%d \n",i+1,s2[2*i]); printf("[%d-2]:%d \n",i+1,s2[2*i+1]); FILE *f1; int i,l; int traces; unsigned char f3200[3200]; char FileName[200]; long int s1[100]; short int s2[200]; printf("输入地震文件名[*.sgy]:"); scanf("%s",FileName); f1=fopen(FileName,"rb"); if(f1==NULL) //文件打开不成就显示错误信息,然后退出。 { printf("File Open error!\n"); exit(0); } //////////////////////////////////
//////////////////////////////////
/*
在文件头中,最重要的是下面几项: 5-1:这个文件的地震道的时间采样间隔,单位是微秒; 6-1:每个地震道的样点数; 7-1:数据的格式。现在一般都是四字节的浮点数,格式取. */ printf("时间采样间隔[微秒]:%d\n",s2[8]); printf("地震道的样点数:%d\n",s2[10]); printf("数据格式代码:%d\n",s2[12]); /* 有了这些信息,这个文件含有的地震道数是多少呢?