如何在 C++ 中读取未知形状的二进制文件?
How do I read a binary file of unknown shape in C++?
我有一个 3600 字节 header 的二进制文件,13483 条轨迹(列),每条 240 字节 header。我想跳过 header 并将数据值读入矩阵。
我可以从文件中获取一些值,但是 seismicDataNH[50][40] 到 seismicDataNH[50][54] 应该是 [13, 17, 12, 5, 19, 51, 29 , -118, -127, -127, -50, 126, 126, 126, -32] 这不是我得到的。
我不确定我是否正确理解了 fread(),它是将文件读取为一长行值还是多行?我假设一排很长,也许这就是它不起作用的原因。
这是我为读取文件而编写的代码:
#include <iostream>
using namespace std;
#define N_SAMP 1990
#define M_TR 13483
char tempArray [N_SAMP*M_TR];
char seismicData[1990][13483];
char seismicDataNH[1750][13483];
int main()
{
FILE*seismicFile;
seismicFile = fopen("NVGT-88-06.sgy","rb");
if (seismicFile!=NULL)
{
fseek(seismicFile, 3600*sizeof(char), SEEK_CUR);
fread(tempArray, sizeof(char), N_SAMP*M_TR, seismicFile);
puts("\n\nRead File successfully");
int c = 0;
for (int in=0; in<N_SAMP; in++)
{
for (int im=0; im<M_TR; im++)
{
seismicData[in][im] = tempArray[c];
c++;
}
}
puts("\nStored in matrix");
// Make matrix values without header values
for (int in=240; in < N_SAMP; in++)
{
for(int im=0; im < M_TR; im++)
{
seismicDataNH[in-240][im] = seismicData[in][im];
}
}
puts("Removed header");
puts("Test values: \n");
for (int it = 40; it<55; it++)
{
printf("%d\n", seismicDataNH[50][it]);
}
fclose(seismicFile);
}
return 0;
}
这里是数据文件 (.sgy),如果有人想看的话:
https://www.dropbox.com/s/y8aa99yqhfyacc8/NVGT-88-06.sgy?dl=0
根据你的描述,有13483个连续的1990字节的块(包括240个块头)。
这意味着您有错误的 for 循环嵌套和数组索引方式。
将数组定义更改为:
char seismicData[M_TR][N_SAMP];
char seismicDataNH[M_TR][N_SAMP-240];
并且两个嵌套的 for 循环为:
for (int im=0; im<M_TR; im++)
{
for (int in=0; in<N_SAMP; in++)
{
seismicData[im][in] = tempArray[c];
c++;
}
}
响应。 :
for(int im=0; im < M_TR; im++)
{
for (int in=240; in < N_SAMP; in++)
{
seismicDataNH[im][in-240] = seismicData[im][in];
}
}
保持最终的 for 循环(打印数据)不变。
这应该会给你预期的输出(对我来说是这样)。
我有一个 3600 字节 header 的二进制文件,13483 条轨迹(列),每条 240 字节 header。我想跳过 header 并将数据值读入矩阵。
我可以从文件中获取一些值,但是 seismicDataNH[50][40] 到 seismicDataNH[50][54] 应该是 [13, 17, 12, 5, 19, 51, 29 , -118, -127, -127, -50, 126, 126, 126, -32] 这不是我得到的。
我不确定我是否正确理解了 fread(),它是将文件读取为一长行值还是多行?我假设一排很长,也许这就是它不起作用的原因。
这是我为读取文件而编写的代码:
#include <iostream>
using namespace std;
#define N_SAMP 1990
#define M_TR 13483
char tempArray [N_SAMP*M_TR];
char seismicData[1990][13483];
char seismicDataNH[1750][13483];
int main()
{
FILE*seismicFile;
seismicFile = fopen("NVGT-88-06.sgy","rb");
if (seismicFile!=NULL)
{
fseek(seismicFile, 3600*sizeof(char), SEEK_CUR);
fread(tempArray, sizeof(char), N_SAMP*M_TR, seismicFile);
puts("\n\nRead File successfully");
int c = 0;
for (int in=0; in<N_SAMP; in++)
{
for (int im=0; im<M_TR; im++)
{
seismicData[in][im] = tempArray[c];
c++;
}
}
puts("\nStored in matrix");
// Make matrix values without header values
for (int in=240; in < N_SAMP; in++)
{
for(int im=0; im < M_TR; im++)
{
seismicDataNH[in-240][im] = seismicData[in][im];
}
}
puts("Removed header");
puts("Test values: \n");
for (int it = 40; it<55; it++)
{
printf("%d\n", seismicDataNH[50][it]);
}
fclose(seismicFile);
}
return 0;
}
这里是数据文件 (.sgy),如果有人想看的话: https://www.dropbox.com/s/y8aa99yqhfyacc8/NVGT-88-06.sgy?dl=0
根据你的描述,有13483个连续的1990字节的块(包括240个块头)。
这意味着您有错误的 for 循环嵌套和数组索引方式。
将数组定义更改为:
char seismicData[M_TR][N_SAMP];
char seismicDataNH[M_TR][N_SAMP-240];
并且两个嵌套的 for 循环为:
for (int im=0; im<M_TR; im++)
{
for (int in=0; in<N_SAMP; in++)
{
seismicData[im][in] = tempArray[c];
c++;
}
}
响应。 :
for(int im=0; im < M_TR; im++)
{
for (int in=240; in < N_SAMP; in++)
{
seismicDataNH[im][in-240] = seismicData[im][in];
}
}
保持最终的 for 循环(打印数据)不变。
这应该会给你预期的输出(对我来说是这样)。