需要帮助找出fgets的问题是什么

时间:2019-05-06 19:44:11

标签: c null fgets file-pointer

因此,基本上,我有一个文件指针,该文件的指针在80位数之间,介于0和1之间,我需要将它们变成字符串,然后对其进行处理。

该函数返回NULL,但我找不到错误原因,因为如果返回NULL,则表示错误。

    FILE *fpr = fopen(path, "r");
    FILE *fpw = fopen("code.txt", "w");
    char *str = calloc(81, sizeof(char));
    if (fpr == NULL || fpw == NULL) {
        printf("yikes");
    }
    if (fgets(str, 80, fpr) != NULL) { //HERE ITS NULL
        int p1 = 0;
        int p2 = 0;

我真的想通了,我不是很傻,就是没有明显的问题。

1 个答案:

答案 0 :(得分:3)

代码片段中有一些问题:

  • 如果无法打开任何文件,您仍将调用fgets(),如果fprNULL,则行为不确定。对每个FILE*进行单独的测试,打印更明确的错误消息并退出程序。
  • 您应该将数组的大小传递给fgets(),而不是81,而不是80
  • 该数组应至少分配给82个字节:80个字符加上结尾的换行符和空字节终止符。
  • 您不测试内存分配失败。您甚至不应该分配内存,对于较小的本地数组(例如82个字节)就可以了。

这是更正的版本:

#include <errno.h>
#include <stdio.h>

    ...
    char str[82];
    FILE *fpr = fopen(path, "r");
    if (fpr == NULL) {
        fprintf(stderr, "cannot open input file %s: %s\n", path, strerror(errno));
        exit(1);
    }
    FILE *fpw = fopen("code.txt", "w");
    if (fpw == NULL) {
        fprintf(stderr, "cannot open output file %s: %s\n", "code.txt", strerror(errno));
        exit(1);
    }
    if (fgets(str, sizeof str, fpr)) {
        int p1 = 0;
        int p2 = 0;
        ...

始终测试错误条件并显示明确的错误消息,您可以确保自己无数小时的调试时间。