语言读取文件到内存 描述的不清楚的话 有意的朋友请和我联系lfylms@163.com 不胜感激!
2008-10-9 22:33
提问者:ldecit |悬赏分:100|浏览次数:1174次
文件描述:
sgy格式:假设*为数据 数据存储为下面的格式
********(左边为3600字节道头,不用读取)****(240字节说明)******(float数据)****(240字节说明)******(float数据)****>>重复
要求将其中的float数据读到二维数组中,一段数据的个数作列,总的段数作行。
跳过3600字节的道头不管,跳过240字节数据说明,读取N个float型的数据,再跳过240字节数据说明,再读取N个数据。这里的“240字节数据说明”的个数和“N个float型的数据”的个数是一样的 他们是交替出现的。N为已知,共有M个数据说明(因此也是M个float数据段(每段N个数)) 读入到二维数组data[M][N]中
可以发邮件给我获取数据,如果能直接写代码也好
附c++的读取代码:
#include
#include
using namespace std;
int main()
{
int i,j,ns,ntr;
float data;
ifstream infile;
infile.open("test.sgy",ios::binary);
ntr = 32; //float数据的段数
ns = 64; //每段float数据的个数
infile.seekg(3600,ios::beg); //跳过3600字节的卷头
for(i=0;i方法,该指针如何递加
3:不考虑文件格式问题,从一般的二进制文件中读取数据到内存如何实现,要求能移动指针实现定位读,而不是整个儿读入。二进制数据存储方式为已知。
由于sgy数据中前3600字节中数据格式有多种 后面的240道说明也包含好几种格式 所以估计将文件全部读入到数组a中 然后再用指针从a中选取需要读出来的float数据部分读入到b 这种方式可能不能实现。
问题补充:
问题1中是“能否定位到3896”不是3606
2008-10-9 23:21
最佳答案
1. 首先fopen时mode参数用"rb"进行二进制打开, fseek才能有效起作用。其次,fseek移动是以字节为单位的,而不是以数为单位的,要把数据大小计算入其中。最的fread这句是对的,无所谓指针类型,你只是读几个字节而已。
2. 二维数组初始化方法,以float类型为例:
静态:float arr2d[M][N] = { 0 };
动态:float **arr2d;
arr2d = (float **)malloc(M * sizeof(float *));
for (int i = 0; i < M; i++)
{
arr2d[i] = (float *)malloc(N * sizeof(float));
memset(arr2d[i], 0, N * sizeof(float);
}
访问某个成员方法两者相同:arr2d[x][y],如果想得到某个成员的指针,可以用&arr2d[x][y]。
3.fseek可以很好的实现定位,fread读取数据之后,文件指针为自动移动,不需要手动定位。
我帮你在源程序上逐句改了,你看一下:
#include
int main()
{
int i,j,ns,ntr;
float data;
FILE *infile;
infile = fopen("test.sgy", "rb");
ntr = 32; //float数据的段数
ns = 64; //每段float数据的个数
fseek(infile, 3600, SEEK_SET); //跳过3600字节的卷头
for(i=0;i