尝试访问二进制文件

时间:2018-12-13 13:51:54

标签: c file segmentation-fault

我的程序将矩阵存储在二进制文件中,当我尝试在程序的相同使用过程中“加载”它们时,一切正常。

但是,当我关闭程序并在以后使用它时,无法访问相同的文件,并且遇到了分段错误(核心转储)错误。

这是“加载”矩阵的函数:

void Loading(int mat**){
  char* name = malloc(sizeof(char)*20);
  printf("Enter name of the file");
  scanf("%s",name);
  FILE* file=fopen(name,"rb");
  if (file==NULL){
    printf("error opening file");
    exit(0);
  }
  fread(mat,sizeof(int)*M*M,1,file);
  fclose(fichier);
}

其中M是常数。

同样,当我在程序的相同使用过程中存储/加载多个时间时,它会完美工作

对不起我不是英语使用者的错误

2 个答案:

答案 0 :(得分:2)

如前所述,该问题缺少关键要素,无法进行全面分析或完整答案。但是根据显示的内容,这里有一些建议:

1) 无法绝对确定您的细分错误的原因,因为您的帖子中缺少某些内容。但是,考虑到它有时起作用,而不是其他起作用,这表明 undefined behavior 发挥了作用。如果我要猜测未定义行为的根源,那就是您正在传递双指针变量int **mat,而只需要一个指针变量int *mat(请参阅{{1的原型}}),进一步使我相信fread()的内存未正确创建。我建议更改:

mat

void Loading(int mat**) // double pointer is not needed here

(请参见下面 3中void Loading(unsigned int mat*) //and memory allocation method adjusted accordingly. 的原因。)

2) 函数unsigned的原型为:

fread()

在您的通话中:

size_t fread (void *Buffer, size_t Element_Size, size_t Number_of_Elements, FILE *Stream);

参数2和3似乎相反。应该写成:

fread(mat,sizeof(int)*M*M,1,file);

3) 为什么在处理二进制数据时fread(mat, sizeof(unsigned int), M*M, file); unsigned int相对应:

  • 您的帖子并未明确说明如何将数据写入文件或文件的确切格式,但是通常,在处理二进制数据时,最好使用int类型作为< em> reasons listed here

答案 1 :(得分:1)

您有一个指向矩阵int **mat的缓冲区的指针。 问题是,这并不指向内存中的单个连续位置。 int mat**是一个指向int的指针数组的指针。这是一个应该在内存中包含更多指针的位置。然后每个(int*)都应指向不同的数组,这些数组最终将包含整数数组。

基本上,您使用命令读取将整个数据写入指针数组。也许您根本没有足够的空间来存储数据。即使您愿意,也需要另一种指针。 如果有一个连续数组,则可以使用int *指向它。然后,您可以通过计算索引来选择一些元素。

int *mtx = (int*) malloc(M*M*sizeof(int);
int x = 2, y = 3;
int index = y*M+x;
mtx[index] = 123; // write to matrix coordinates 2,3

您可以毫无问题地将fread与此类缓冲区一起使用,只需检查输入文件中矩阵元素的索引方式,也许x,y就被交换了。