C语言while循环读取文件打印ASCII值时输出多余-1问题
问题:读取文件ASCII值时额外输出-1
在加密作业中,读取文件内容并打印对应ASCII值时,输出末尾会多一个无关的-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; }
错误原因
feof的逻辑误区:feof()只有在尝试读取超出文件末尾后才会返回真。原循环中,当读完最后一个有效字符后,feof()仍然为假,会再次执行循环体:调用fgetc()读取到EOF(对应值为-1),并将其打印出来,这就是额外-1的来源。- 变量类型不匹配:
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__
相关产品推荐
相关产品推荐

