C:fread没有读完整个块

时间:2015-03-11 20:14:25

标签: c fopen fread fseek uint16

到目前为止,这是我的代码:

#include <stdio.h>
#include <stdint.h>

#define N_DET 432
#define N_PROJ 500

int readSinogram(uint16_t mess[],char filename[], int sample){
    //init
    FILE *fp;
    int i;
    //open file
    fp=fopen(filename,"r");
    //read sinogram
    fseek(fp,sizeof(uint16_t)*N_DET*N_PROJ*sample*2,SEEK_SET); //move pointer
    fread(mess,sizeof(uint16_t),N_DET*N_PROJ,fp); //read sinogram
    return 0;
};


int main()
{
    uint16_t mess[N_DET*N_PROJ];
    char filename[]="C:\\Path\\MyFile.fxc";
    double curr;
    int i,DET,PROJ;

    readSinogram(mess,filename,0); //read the data

    printf("\nDET?"); //ask for input
    scanf("%u", &DET);
    printf("\nPROJ?");
    scanf("%u", &PROJ);

    curr=mess[DET+N_DET*PROJ]; //get the data
    printf("Data: %f",curr); //print the data

    return 0;
}

这会读取.fxc文件,该文件只是一个包含uint16_t格式化数字的二进制文件。 &#34; readSinogram&#34;读取一个包含N_DET * N_PROJ数字的数据集。 (指针移动了两倍的块大小,因为文件中有两个测量的交替块。) 阅读之后,可以输入DET和PROJ并在此时查看数据。

到目前为止,一切正常。数据对于某个数据范围是正确的,但是当要求太大的DET和/或PROJ时数据不正确。 我确实在Matlab中读取了相同的文件,并且可以确认其中的数据是正常的。

更确切地说:高于[DET + N_DET * PROJ]的每个指数&gt; 248835将返回52428而不是正确的值(范围从0到4088)。达到这些值的工作正常。因此,&#34;混乱&#34;会出现问题。我想这个数组高于该指数。

我做错了什么?提前谢谢!

1 个答案:

答案 0 :(得分:1)

您需要分配一个更大的数组才能获得大于248835的索引值 目前您有以下定义

#define N_DET 432
#define N_PROJ 500

导致数组大小为432*500 = 216000

现在,如果您将数组索引为值 248835 248835 > 216000,则会导致从阵列的已分配内存中访问内存,从而导致未定义的行为。你需要的是一个更大的阵列,可以容纳超过248835个条目。一个简单的#define N_DET 500会这样做,但你必须确保这是要求。基本的索引检查有助于避免超出范围问题

#define MAX_RANGE 500*500
if((DET+N_DET*PROJ) < MAX_RANGE)
    curr=mess[DET+N_DET*PROJ]; //get the data
else
   //error handling

您还需要fopen fseek中的错误处理并检查fread的返回情况以及您可以选择close(fd)

关闭打开的文件描述符