You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

fgetc读取文件返回值始终为255的技术问题求助

问题分析与解决方案

嘿,我一眼就揪出问题所在啦,咱们一步步拆解清楚:

核心问题根源

  • 文件指针位置错误:你用w+模式打开文件后,先执行了写入操作,写完之后文件指针会停在文件末尾。这时候直接调用fgetc读取,自然会读到EOF(文件结束标志)。
  • 返回值类型不匹配fgetc的返回值是int类型——它要么返回读取到的字符(转成unsigned char再转int),要么返回EOF(值为-1)。你把它存在unsigned char里,-1会被强制转成255,这就是你看到固定返回255的原因。

修正后的代码

#include <stdio.h>
// 注意:尽量不要直接#include .c文件,应该引用对应的头文件.h
#include "anotherCFile.h"

int main(int argc, char **argv) {
    int ch;
    FILE* filePointer;
    filePointer = fopen("text.txt", "w+");
    
    // 别忘了加文件打开失败的判断!避免空指针操作崩溃
    if (filePointer == NULL) { 
        perror("Failed to open file");
        return 1;
    }

    ch = fgetc(stdin);
    while (ch != EOF) {
        fputc(ch, filePointer);
        ch = fgetc(stdin);
    }

    // 关键操作:写完后把文件指针移回文件开头
    rewind(filePointer); 
    // 也可以用fseek(filePointer, 0, SEEK_SET); 效果完全一致

    int ch1 = fgetc(filePointer); // 用int接收,才能正确识别EOF
    if (ch1 != EOF) {
        printf("%c", ch1);
    } else {
        printf("Reached end of file");
    }

    fclose(filePointer);
    return 0;
}

额外小提醒

  • 永远要检查fopen的返回值,如果文件打开失败(比如权限不足、路径错误),filePointer会是NULL,不判断的话后续操作直接崩溃。
  • 不要直接#include .c文件,这会导致代码重复编译,正确做法是把函数声明放在.h头文件里,.c文件实现逻辑,主文件只引用头文件。

内容的提问来源于stack exchange,提问作者J. Doe

火山引擎 最新活动