【问题标题】:fgets() randomly changes between returning NULL and returning the correct valuefgets() 在返回 NULL 和返回正确值之间随机变化
【发布时间】:2018-05-19 15:54:14
【问题描述】:

在调用此函数以从文件fe 中获取行时,有时该函数会工作并继续工作一段时间,直到它随机决定不再工作并且fgets() 开始返回@ 987654323@(我不允许使用 getline 作为替代)。 我尝试从头开始重新制作该功能,但它仍然不想工作。我百分之一地确定我的文件存在并且正在加载。

请原谅菜鸟代码,第二个月使用C。

int getEtudiants(FILE *fe, int *num, char nom[100][30],char pre[100][30],char sec[100][10]) {
    FILE *p;
    p = fe;
    fseek(p, 0, SEEK_SET);
    //char temp[5] = {0};
    char *temp = (char*)malloc(sizeof(char) * 75);
    int i = 0;
    int lines = 0;
    int ch;
    int n = 0;

    while((ch = getc(p)) != EOF) {
        if(ch == '\n') lines++;
    }
    fseek(p, 0, SEEK_SET);
    //printf("found %d students\n", lines);
    char *lineBuffer = (char*)malloc(sizeof(char) * 75);

    for(i = 0; i < lines; i++){                   
        fgets(lineBuffer, 76, p); 
        strncpy(temp, lineBuffer, 5);
        num[i] = atoi(temp);
        strncpy(nom[i], lineBuffer + 5, 30);
        trimStr(nom[i]);
        strncpy(pre[i], lineBuffer + 35, 30);
        trimStr(pre[i]);
        strncpy(sec[i], lineBuffer + 65,10);
        trimStr(sec[i]);
        //printf("num: %d,%s %s section: %s\n", num[i], nom[i], pre[i], sec[i]);
        fseek(p, 2, SEEK_CUR);
        n++;
    }
    return n;
}

【问题讨论】:

  • 如果你从不检查返回值,你怎么知道fgets返回NULL?另外,fseek(p, 2, SEEK_CUR); 有什么意义?
  • Niggle:你分配了 75 个字节 char *lineBuffer = (char*)malloc(sizeof(char) * 75);fgets(lineBuffer, 76, p); 可以超过。
  • 另外,你malloc()而不是free(),所以你有内存泄漏。但是malloc 完全没有必要——只需将templineBuffer 声明为char 的普通数组(这样就不需要释放它们)。
  • 顺便问一下,fseek(p, 2, SEEK_CUR) 在循环中的意义是什么?这很可疑。
  • "我确实检查了 fgets 的返回值,方法是使用 printf 打印出 lineBuffer" --> 不是 检查 fgets() 的返回值。 fgets() 是一个有返回值的函数——检查一下。例如for(i = 0; i &lt; lines &amp;&amp; (fgets(lineBuffer, 75, p) != NULL); i++) {

标签: c file null fgets


【解决方案1】:

chux 正确指出“使用 printf 打印 lineBuffer”不是检查 fgets() 的返回值。我们可以推断出更多:“它打印(null) in most cases" 表示lineBuffer 为NULL,并且

char *lineBuffer = (char*)malloc(sizeof(char) * 75)

表示malloc() 返回 NULL,即。 e.它耗尽了内存或内存管理已损坏 - 两者都是可以想象的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 2017-08-29
    • 2014-03-07
    • 2019-08-05
    • 1970-01-01
    相关资源
    最近更新 更多