【问题标题】:Core dumped after using fseek in c在 c 中使用 fseek 后核心转储
【发布时间】:2023-03-17 21:55:01
【问题描述】:

我编写了一个代码,但在函数的特定部分遇到了一些问题。如果我添加 fseek 函数,我会得到“核心转储”,但如果我删除它,一切正常。

这是我的代码中存在问题的部分:

    FILE* fe;

    fe=fopen("fete","rb");
    if (fe==NULL)
    {
        printf("eroare");
        exit(1);
    }

    STUDENT* x;
    int i;
    long int nrfete=0;
    **fseek(fe,0L,SEEK_END);**
    printf("%ld",ftell(fe));
    nrfete = ftell(fe)/sizeof(STUDENT);
    x=(STUDENT*)malloc(nrfete*sizeof(STUDENT));

    fread(&x,sizeof(STUDENT),nrfete,fe);
    printf("%s",x[0].prenume);//pt verificare
    fclose(fe);

来自comment

typedef struct { 
  char prenume[20];
  char sex;
  float nota;
} STUDENT;

【问题讨论】:

  • fread(&x,sizeof(STUDENT),nrfete,fe); 应该是fread(x,sizeof(STUDENT),nrfete,fe);
  • 我修改了但我得到了同样的错误
  • 请不要修改您发布的内容,除非它不是您遇到问题的实际代码。
  • 哦,好的。我明白。然而,这个错误并不是问题所在。
  • ftell 返回0,分配0 字节内存并且fread 从文件中读取0 字节时,代码如何在没有fseek 的情况下工作?请发布显示问题的Minimal, Complete, and Verifiable example

标签: c file binary fseek


【解决方案1】:

特别是两个错误:

您必须在fread 完成之前将rewindfseek 文件返回到开头。就目前而言,它不会读取任何数据,因此分配的内存仍然包含垃圾值。

并始终检查 I/O 函数的返回值,例如 fread,这会告诉您没有读取数据。

另一个问题是传递给fread的缓冲区应该是malloc得到的指针,而不是指针存放的地址。所以

fread(&x,sizeof(STUDENT),nrfete,fe);

应该是

if(fread(x, sizeof(STUDENT), nrfete, fe) != nrfete) {
    // report error
}

【讨论】:

  • 我做了所有的修改,但我得到了同样的错误
  • 而您仍然没有发布显示问题的Minimal, Complete, and Verifiable example。你读过链接吗? MCVE 是一个完整的程序,可以复制/粘贴、编译和运行以重现问题。
  • 可能内存不足。
【解决方案2】:

如我所见,您正在寻找文件末尾

fseek(fe,0L,SEEK_END);

然后你为 STUDENT 结构分配数据

x=(STUDENT*)malloc(nrfete*sizeof(STUDENT));

然后你尝试阅读它:

fread(&x,sizeof(STUDENT),nrfete,fe);

但我认为您在这里遇到了错误。因为你已经在文件的末尾了。因此,您不填充数据,并且 x 变量中有垃圾。在这种情况下 x[0].prenume 不是以空字符结尾的字符串。所以当你尝试打印它时会出错。

要检查我是否正确,您可以在分配后用零填充分配的内存,在这种情况下您不会收到错误(但结构仍然为空):

memset(x, '\0', nrfete*sizeof(STUDENT));

你也可以打印 fread() 的结果

【讨论】:

  • 谢谢,我修改了代码,但是错误没有消失
  • 你做了哪些修改?
【解决方案3】:
STUDENT* x;
...
x=(STUDENT*)malloc(nrfete*sizeof(STUDENT));
..
fread(&x,sizeof(STUDENT),nrfete,fe);

x 指向一个内存块,&x 是 x 的指针,只有 4 个字节。

fread 更改为以下内容应该可以解决问题:

fread(x, sizeof(STUDENT),nrfete,fe);

【讨论】:

    猜你喜欢
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多