2016-08-09 4 views
0

У меня есть код, который, как я думал, был скомпилирован в прошлом и успешно, но теперь я сталкиваюсь с segfault, и я не понимаю, почему.C код segfault при использовании fseek

FILE *numbers = fopen("./e13.txt", "r"); 

//seeking the end of the file to get the correct size for the string 
//I will store 
fseek(numbers, 0, SEEK_END); 
long fsize = ftell(numbers); 
fseek(numbers, 0, SEEK_SET); 

//Allocating memory to the string 
char *string = malloc(fsize + 1); 

Я пытаюсь прочитать файл в память, так что я получаю правильный размер его и пытаюсь malloc, что объем памяти. Я думаю, что это происходит в функции fseek, но я не понимаю, почему ...

+8

Может быть, это время вы начали проверку на наличие ошибок. –

+0

Как бы я это сделал? – deltaskelta

+5

Шаг 1. Прочтите каждую страницу, чтобы узнать, какие значения она возвращает при ошибке. Например, страница ['fopen' man] (http://linux.die.net/man/3/fopen). Шаг 2. Проверьте эти ошибки. например 'if (! numbers) {perror (" fopen failed "); выход (1); } ' – kaylum

ответ

2

fopen может вернуть NULL, если он не может открыть файл. Вероятно, это происходит здесь. Вы должны проверить это нравится:

if(!numbers){/*report error and exit*/} 

Кроме того, если вы просто хотите, чтобы получить размер файла, рекомендуется использовать stat, если ваша система поддерживает его. Если вы хотите, чтобы открыть его и читать все это в памяти, я предложил бы использовать mmap, если ваша система поддерживает его:

#include <sys/mman.h> 
#include <sys/stat.h> 
#include <fcntl.h> 

int fd = open("e13.txt", O_RDONLY); 
if(!fd){/*report error and exit*/} 
size_t len; 
{ 
    struct stat stat_buf; 
    if(fstat(fd, &stat_buf)){ 
     close(fd); 
     /*report error and exit*/ 
    } 
    len = stat_buf.st_size; 
} 
void *map_addr = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0); 
close(fd); 
if(!map_addr){/*report error and exit*/} 
/*do work*/ 
munmap(map_addr, len); 
Смежные вопросы