I'm trying to read a file into an array but I'm getting segmentation fault, I know I'm not allocating memory correctly. What am I doing wrong here?. I'm allowed to use read()
and while
loop.
EDIT
my complete function, before I split in into two parts
int **ft_create_map(char *filename, int nb_cols, int nb_rows)
{
int **map;
int fd;
int row;
int col;
ssize_t size;
char buf[BUF_SIZE];
row = 0;
size = 0;
col = 0;
map = (int **)malloc(nb_rows * sizeof(int *));
if (!map)
return (map);
map[0] = malloc(sizeof(int) * nb_cols);
fd = open(filename, O_RDONLY);
if (!fd)
return (NULL);
while ((size = read(fd, buf, BUF_SIZE)))
{
if (size < 1)
return (NULL);
buf[size] = '\0';
if (buf[0] == '\n')
{
row += 1;
col = 0;
map[row] = malloc(sizeof(int) * nb_cols);
}
else
{
if (buf[0] == '.')
map[row][col] = 1;
else if (buf[0] == 'o')
map[row][col] = 0;
col++;
}
}
return (map);
}
Here I'm trying to split the previous function into two functions, because my functions needs to have less than 25 lines of code.
void fill_map(int **map,int fd, int row, int col)
{
ssize_t size;
char buf[BUF_SIZE];
size = 0;
while ((size = read(fd, buf, BUF_SIZE)))
{
if (size < 1)
// return (0); commented out for testing
buf[size] = '\0';
if (buf[0] == '\n')
{
//this was the problem, allocating memory to map[0] twice.
row += 1;
map[row] = malloc(sizeof(int) * (col + 1));
col = 0;
}
else
{
if (buf[0] == '.')
map[row][col] = 1;
else if (buf[0] == 'o')
map[row][col] = 0;
col++;
}
}
}
int **ft_create_map(char *filename, int nb_cols, int nb_rows)
{
int **map;
int fd;
int row;
int col;
ssize_t size;
// char buf[BUF_SIZE];
row = 0;
size = 0;
col = 0;
map = (int **)malloc(nb_rows * sizeof(int *));
if (!map)
return (map);
map[0] = malloc(sizeof(int) * nb_cols);
fd = open(filename, O_RDONLY);
if (!fd)
return (NULL);
fill_map(map, fd, row, col);
return (map);
}
in my main
int cols = count_cols(argv[1]);
int rows = count_rows(argv[1]);
int **arr;
// int j;
// int i;
arr = ft_create_map(argv[1], cols, rows);
printf_max_square(arr, rows, cols);