You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言while循环读取文件打印ASCII值时输出多余-1问题

问题:读取文件ASCII值时额外输出-1

在加密作业中,读取文件内容并打印对应ASCII值时,输出末尾会多一个无关的-1。文件内容为:

  1. Test file, ASCII Read
    程序输出为:49 46 32 84 101 115 116 32 102 105 108 101 44 32 65 83 67 73 73 32 82 101 97 100 -1

尝试调换循环内代码顺序后,开头会输出0,这些错误值会影响后续加密操作,需要解决。

附原代码:

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

int main() {

    
    //file read/file open

    FILE *ptr;                                        //create file pointer

    char fileName[100];                               //variable to hold file name
    char fileVal;                                     //variable to store file character values

    //ask user for file name
    printf("Please enter the file name\n");
    scanf("%s", fileName);                      //store user input as file name

    ptr = fopen(fileName,"r");           //open file with pointer

    //create while loop to read file and print character by character
    while(!feof(ptr)){
        fileVal = fgetc(ptr);                           //store each character read from the file within the variable
        printf("%d ", fileVal);                      //print all file characters
    }

    fclose(ptr);                                  //close file


    return 0;
}

错误原因

  1. feof的逻辑误区:feof()只有在尝试读取超出文件末尾后才会返回真。原循环中,当读完最后一个有效字符后,feof()仍然为假,会再次执行循环体:调用fgetc()读取到EOF(对应值为-1),并将其打印出来,这就是额外-1的来源。
  2. 变量类型不匹配:fgetc()返回int类型(需要容纳EOF的-1),而原代码中用char类型接收。如果char是无符号类型,会将-1转换为255,引发错误;即使当前输出了-1,类型不匹配也存在潜在风险。

修正方案

  • 调整循环逻辑:先调用fgetc()读取字符,再判断是否为EOF,避免多执行一次循环。
  • 将fileVal的类型改为int,正确接收fgetc()的返回值。
  • 增加文件打开失败的判断,避免空指针访问导致崩溃。

修正后的代码:

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

int main() {
    FILE *ptr;
    char fileName[100];
    int fileVal; // 改为int类型,正确容纳EOF的-1

    printf("Please enter the file name\n");
    scanf("%s", fileName);

    ptr = fopen(fileName,"r");
    if (ptr == NULL) { // 新增文件打开失败判断
        printf("Failed to open file\n");
        return 1;
    }

    // 先读取字符,再判断是否到达文件末尾
    while((fileVal = fgetc(ptr)) != EOF){
        printf("%d ", fileVal);
    }

    fclose(ptr);
    return 0;
}

说明

  • 修正后的循环会在读取到EOF时直接退出,不会打印额外的-1。
  • 新增的文件打开判断能处理文件不存在、权限不足等异常情况,提升程序健壮性。

内容的提问来源于stack exchange,提问作者rEeYaN__

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 14:20:34