【问题标题】:Segmentation fault when calling fgets调用 fgets 时出现分段错误
【发布时间】:2012-09-26 20:19:17
【问题描述】:

我正在尝试编写一个简单的程序来从纯文本列表中列出的文件中读取数据,但是当我尝试在我的 processFile 函数中调用 fgets() 时,我一直遇到分段错误。

如果我只是简单地调用类似 processFile("file.txt") 的东西就不会发生这种情况,但是当我尝试通过我的 processList 函数调用 processFile 时会发生这种情况。

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

void processFile (char *file)
{
    char line[256];
    FILE* pgmFile;
    pgmFile = fopen(file, "r");
    fgets(line, 200, pgmFile); // Seg fault here
    fclose(pgmFile);
}    

// Runs processFile on every file listed in list
void processList (char *list)
{
    FILE *pgmList;
    pgmList = fopen(list, "r");

    char line[256];

    while (fgets(line, 255, pgmList) != NULL) {
        processFile(line);
    }
    fclose(pgmList);
}      

int main ()
{
    processList("downgesture_test1.list");
}  

【问题讨论】:

  • 在成功完成 fopen()、fdopen() 和 freopen() 后返回一个 FILE 指针。否则,返回 NULL 并设置 errno 以指示错误。请检查 fopen() 返回的内容。生活并不总是完美的。文件可能无法访问。
  • 老兄 - 错误检查!在尝试读取之前确保“fopen()”成功;)

标签: c segmentation-fault


【解决方案1】:

尝试检查fopen 的返回值。如果是NULL 怎么办?因为你的“文件名”很可能有尾随\n

【讨论】:

  • 这正是问题所在!感谢您的帮助!
  • 如果您认为自己已经拥有这样的安全性,请考虑检查您的测试确实是 pgmFile == NULL 而不是 pgmFile = NULL — 可能会为您节省大量时间。
  • @SkippyleGrandGourou, !pgmFile ;-)
【解决方案2】:

如果文件不存在,fopen 将返回 NULL。在调用 fopen 之后添加一些错误处理,有可能您的列表中有错误的条目。

可能发生的情况是 pgmFile 为 NULL,fgets 尝试访问它,导致 seg 错误。

【讨论】:

    猜你喜欢
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 2020-03-10
    • 2022-01-14
    • 2018-03-17
    • 2017-08-05
    • 2015-10-03
    相关资源
    最近更新 更多