Чтение динамических выделенных векторов из двоичного файла

#file #file-io #memory-management #segmentation-fault

#файл #файл-ввод-вывод #управление памятью #ошибка сегментации

Вопрос:

Мне нужна помощь в чтении двух динамических выделенных векторов из двоичного файла. В конечном итоге возникает ошибка ошибки сегментации, но векторы остаются полными нулей (иногда без нулей и «мусора»), даже когда fread () выполняется без проблем.

Вот код, который я использую для его чтения:

 struct Node *node;  
node = (Node *) calloc(GRAPHSIZE,sizeof(Node));

int edgesSize = 2*GRAPHSIZE;

int *edges;
edges = (int *) calloc(edgesSize,sizeof(int));  

FILE * file;

printf("nLoading graph file...n");

file = fopen ("graph1M.g","rb");    
fread (amp;edges, edgesSize * sizeof(int),1,file);
fread (amp;node, GRAPHSIZE * sizeof(Node),1,file);
fclose(file);
  

И вот как они сохраняются:

 int edgesSize = 2*GRAPHSIZE;

struct Node *node;  
node = (Node *) calloc(GRAPHSIZE,sizeof(Node));


int *Edges;
Edges = (int *) calloc(edgesSize,sizeof(int));  


/* put data into the vectors... */


FILE *file;

//writes file:
file = fopen ("graph1M.g","wb");
fwrite (amp;Edges, edgesSize * sizeof(int),1,file);
fwrite (amp;node, GRAPHSIZE * sizeof(struct Node),1,file);
fclose(file);
  

Ответ №1:

Они содержат ошибки (вы повреждаете свой стек):

 fread (amp;edges, edgesSize * sizeof(int),1,file);
fread (amp;node, GRAPHSIZE * sizeof(Node),1,file);
  

Вы хотите это вместо:

 fread (edges, edgesSize * sizeof(int),1,file);
fread (node, GRAPHSIZE * sizeof(Node),1,file);
  

Та же проблема с fwrite также.

Кстати, если вы используете Linux, вам следует протестировать свои программы с помощью Valgrind. Делайте это часто, это сэкономит вам много времени.

Комментарии:

1. Тай, это решило проблему, также я посмотрю на этот Valgrind.