/* This Program generates a file with a pseudo-random number of st_record_t structures. The file is passed by command line arguments. The program must by executed, in UNIX, this way: ./file_gen -path <path> */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include "types.h"
#define MSG_INVALID_INPUT "Your input was not valid"
#define CMD_FLAG_PATH_POSITION 1
#define CMD_ARG_PATH_POSITION 2
#define CMD_FLAG_PATH "-path"
#define SDM_MAX 10000.0
status_t validate_arguments (int argc, char * argv []);
int main (int argc, char * argv [])
{
FILE * fi;
size_t i;
st_record_t aux_struct, aux2_struct;
int size;
if ((validate_arguments(argc, argv))!= OK)
{
fprintf(stderr, "%s\n", MSG_INVALID_INPUT);
return EXIT_FAILURE;
}
if((fi = fopen(argv[CMD_ARG_PATH_POSITION], "wb")) == NULL)
return EXIT_FAILURE;
srand(time(NULL));
for (i=0; i<(size=100); i++)
{
aux_struct.SDM = (((float)rand()/(float)(RAND_MAX)) * SDM_MAX); /*pseudo-random real number between 0 and SDM_MAX*/
(aux_struct.ID) = i;
(aux_struct.coordinates)->latitude.deg = rand()%180;
(aux_struct.coordinates)->latitude.min = rand()%60;
(aux_struct.coordinates)->latitude.sec = rand()%60;
(aux_struct.coordinates)->longitude.deg = rand()%180;
(aux_struct.coordinates)->longitude.min = rand()%60;
(aux_struct.coordinates)->longitude.sec = rand()%60;
if((fwrite (&aux_struct, sizeof(st_record_t), 1, fi))!=1)
return ERROR_WRITING_FILE;
}
if(fclose(fi) == EOF)
return EXIT_FAILURE
return EXIT_SUCCESS;
}
问题在于(aux_struct.coordinates)->latitude.deg = rand()%180
行。如果不是使用随机数我选择一个,这将不会发生
st_record_t
结构以这种方式定义:
typedef struct {
unsigned char deg, min, sec;
}angle_t;
typedef struct {
angle_t latitude, longitude;
}st_coord_t;
typedef struct {
float SDM;
size_t ID;
st_coord_t * coordinates;
}st_record_t;
答案 0 :(得分:1)
分段错误与随机数无关,这是因为你永远不会为aux_struct.coordinates
分配内存。
要解决此问题,请使用以下内容:
aux_struct.coordinates = malloc(sizeof(st_coord_t));
请记住在不再使用时释放内存。
答案 1 :(得分:1)
除了缺少“coordinates”成员初始化的问题之外,应该指出fwrite()不会做你想要的。它只会写入st_record_t的内容。指针“coordinates”的值在进行写入的进程之外没有任何意义,并且它指向的st_coord_t结构中的数据根本不会被写入。
您可能希望查看类似hdf5的内容,以便以可移植的方式将复杂的二进制数据结构写入文件。
答案 2 :(得分:0)
你有
typedef struct {
float SDM;
size_t ID;
st_coord_t * coordinates;
}st_record_t;
如您所见,coordinates
是st_coord_t
类型的指针。您需要使用malloc
:
aux_struct.coordinates=malloc(sizeof(st_coord_t));
您需要在使用后释放已分配的内存:
free(aux_struct.coordinates);
请注意,如果您想使用coordinates
,则必须为aux2_struct
分配内存,之后在使用后将其释放。