这是我目前的代码:
#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格式数字的二进制文件。”readSinogram“读取一个包含N_DET*N_PROJ编号的数据集。(指针移动两倍于块大小,因为文件中有两个测量值的交替块。)
读过之后,你可以输入一个DET和PROJ,并在这一点上查看数据。
到目前为止,一切正常。数据对于特定的数据范围是正确的,但是当要求太大的DET和/或PROJ时,数据是错误的。
我确实在Matlab中读取了相同的文件,并且可以确认其中的数据是正确的。
更准确地说:上面的每个索引[DET+N_DET*PROJ]>248835将返回52428,而不是正确的值(范围从0到4088)。这些价值观都很管用。所以我想索引上面的“mess”数组一定有问题。
我做错什么了?提前谢谢!
最佳答案
您需要分配一个更大的数组以获得大于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)
关闭打开的文件描述器