2016-08-09 38 views
0

我有一個代碼,我認爲我已經編譯過去併成功,但現在我正在運行到一個段錯誤,我看不出爲什麼。C代碼在使用fseek時存在segfaulting

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功能segfaulting,但我不明白爲什麼...

+8

也許是你開始檢查錯誤的時間。 –

+0

我該怎麼做呢? – deltaskelta

+5

第1步。閱讀每個手冊頁以找出錯誤時返回的值。例如['fopen'手冊頁](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);