【问题标题】:Programm crashing at fgets() in c程序在 c 中的 fgets() 处崩溃
【发布时间】:2021-10-15 13:06:03
【问题描述】:

当我运行我的程序时,它应该读取一个简单的文件,它只是在 fgets() 函数处崩溃。我的 IDE 或 gcc 没有错误。我知道有类似的帖子,但我无法弄清楚它们的问题。这是我的代码,感谢您的帮助!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char a[64];

int main() {
    FILE* fp;
    fopen("Memory.mem", "r");
    fgets(a, 64, (FILE*)fp);
    printf("%s\n", a);
    // the getchar is just that the Program doesn't close it self imeadiatly
    getchar();
    return 0;
}
//In the Memory.mem file is just "abcdefg"

【问题讨论】:

  • 您没有将返回值从fopen 分配给fp,因此它未初始化。当您修复该问题时,请务必在使用之前添加代码以检查它是否不是 NULL。你不需要在fgets 中使用fp 的演员表,当你完成它时你应该fclose 文件。
  • 你应该得到一些关于在没有事先初始化的情况下使用 fp 的编译器警告。如果没有,请打开编译器警告。对于 GCC,您可以通过 -Wall -Wextra 执行此操作

标签: c string file crash fgets


【解决方案1】:

问题是当你fopen 你实际上并没有保存返回的文件指针。 当您调用 fgets fp 时未初始化,从而导致未定义的行为。

您可以通过以下方式修复它:

FILE* fp;
fopen("Memory.mem", "r");

这样做:

FILE* fp = fopen("Memory.mem", "r");

另外请注意,最好检查打开文件是否成功。

FILE* fp = fopen("Memory.mem", "r");
if(fp == NULL){
    printf("Couldn't open file!\n");
    return EXIT_FAILURE;
}

使用完文件后,您应该关闭文件:

fclose(fp);

【讨论】:

  • 这不仅是一种好的做法,而且是强制性的。
  • 你应该考虑return EXIT_FAILURE而不是return 0以防出错。
  • @Dada 你是对的,我已经编辑了我的答案。
猜你喜欢
  • 1970-01-01
  • 2016-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多