在C编程中,每当我使用它fgetc(file)
来读取所有字符,直到它的文件结束它.但是当我使用类似的fscanf(file, "%c")
功能时,它会打印出奇怪的字符.码:
#include <stdio.h>
#include <stdlib.h>
int main() {
char c;
FILE * file = fopen("D\\filename.txt", "r");
while (c != EOF) {
fscanf(file, "%c", &c);
printf("%c", c);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我使用fgetc
而不是fscanf
,它的工作原理.并打印出文件中存在的每个字符.
任何人都可以回答为什么会这样吗?
请注意
c=fscanf(file,"%c");
Run Code Online (Sandbox Code Playgroud)
是未定义的行为(这里我解释为什么你应该害怕它,即使一个程序似乎显然"工作"),并且每个好的C编译器(例如,被调用的GCCgcc -Wall -Wextra -g
)应该警告你(如果你启用所有警告).在C语言编码时,您还应该学习如何使用调试器(例如gdb
).
你应该阅读fscanf(3)的文档.你可能想要编码
char c= '\0';
if (fscanf(file, "%c", &c) <= 0) break;
Run Code Online (Sandbox Code Playgroud)
你最好养成初始化每个变量的习惯; 一个好的优化编译器会删除那个初始化,如果它没用,并且经常会警告你关于单元化变量.
请注意,在您的情况下使用fgetc(3)可能更可取.然后你需要声明c
为整数,而不是字符和代码:
do {
int c=fgetc(file);
if (c==EOF) break;
} while (!feof(file));
Run Code Online (Sandbox Code Playgroud)
请注意,上述循环的feof(file)
永远不会是真实的(因为fgetc
将给予EOF
前),所以你会更好的替换while(!feof(file))
用while(true)
阅读(由其他开发人员,甚至是自己在几个月内)使用相同的代码更简单,并且它可能更快.大多数实现fscanf
基于某种方式fgetc
或非常相关的事情.
另外,要养成测试输入的好习惯.输入文件可能不是您所期望的.
在最近的系统中,编码现在是UTF-8.要知道,有些(人类语言)字符可以在几个字节(被编码,例如,法国强调é字母é
,或俄罗斯yery信?
,甚至是欧元符号€
,或数学的所有标志?
在其他语言,文字或图形等. ..).你可能应该考虑使用一些UTF-8库(例如libunistring),如果你关心它(你应该关心严肃的软件中的UTF-8!).
诺塔Bene的:如果你还年轻,学习编程,更好(IMNSHO)学习计划与SiC颗粒,例如使用球拍学习C或Java之前.C真的不适合初学者恕我直言.
PS字符类型(通常是一个字节)是char
小写的.
归档时间: |
|
查看次数: |
451 次 |
最近记录: |