C代码在使用fseek时发生错误

C代码在使用fseek时发生错误,c,gcc,segmentation-fault,C,Gcc,Segmentation Fault,我有一个代码,我认为我在过去编译成功,但现在我遇到了一个segfault,我不明白为什么 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, SEE

我有一个代码,我认为我在过去编译成功,但现在我遇到了一个segfault,我不明白为什么

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函数中的错误,但我不明白为什么…

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);
#包括
#包括
#包括
int fd=打开(“e13.txt”,仅限ordu);
如果(!fd){/*报告错误并退出*/}
尺寸透镜;
{
结构统计;
if(fstat(fd和stat_buf)){
关闭(fd);
/*报告错误并退出*/
}
len=统计数据和标准尺寸;
}
void*map\u addr=mmap(NULL,len,PROT\u READ,map\u PRIVATE,fd,0);
关闭(fd);
如果(!map_addr){/*报告错误并退出*/}
/*工作*/
munmap(地图地址,len);

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);
#包括
#包括
#包括
int fd=打开(“e13.txt”,仅限ordu);
如果(!fd){/*报告错误并退出*/}
尺寸透镜;
{
结构统计;
if(fstat(fd和stat_buf)){
关闭(fd);
/*报告错误并退出*/
}
len=统计数据和标准尺寸;
}
void*map\u addr=mmap(NULL,len,PROT\u READ,map\u PRIVATE,fd,0);
关闭(fd);
如果(!map_addr){/*报告错误并退出*/}
/*工作*/
munmap(地图地址,len);

也许是时候开始检查错误了。我该怎么做呢?步骤1。阅读每个手册页,找出错误时返回的值。例如,。第二步。检查这些错误。e、 g.
如果(!numbers){perror(“fopen失败”);退出(1)}
@deltaskelta:通过阅读手册!也许你该开始检查错误了。我该怎么做呢?第一步。阅读每个手册页,找出错误时返回的值。例如,。第二步。检查这些错误。e、 g.
如果(!numbers){perror(“fopen失败”);退出(1)}
@deltaskelta:通过阅读手册!