gpt4 book ai didi

c - 为什么我们在 C 编程中总是必须使用 fgetc 命令而不是 fscanf,它做同样的事情但打印奇怪的结果?

转载 作者:行者123 更新时间:2023-11-30 18:22:05 26 4
gpt4 key购买 nike

在 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;
}

但是当我使用 fgetc 而不是 fscanf 时,它可以工作。它会打印文件中存在的每个字符。

有人能回答为什么它会这样吗?

最佳答案

请注意

c=fscanf(file,"%c");

undefined behavior ( here 我正在解释为什么你应该害怕它,即使一个程序看起来明显“工作”),以及每个好的 C 编译器(例如 GCC 被调用为 gcc -Wall -Wextra - g)应该警告您(如果您启用所有警告)。使用 C 语言编码时,您还应该学习如何使用调试器(例如 gdb)。

您应该阅读 fscanf(3) 的文档。您可能想要编码

char c= '\0';
if (fscanf(file, "%c", &c) <= 0) break;

你最好养成初始化每个变量的习惯;如果初始化没有用,一个好的优化编译器会删除它,否则通常会警告您有关未初始化的变量。

请注意,使用 fgetc(3)在你的情况下可能是更好的选择。然后需要将c声明为整数,而不是字符,代码:

do {
int c=fgetc(file);
if (c==EOF) break;
} while (!feof(file));

请注意,在上面的循环中,feof(file) 永远不会为 true(因为 fgetc 之前会给出 EOF),所以你最好将 while(!feof(file)) 替换为 while(true)

使用相同的代码(由其他开发人员,甚至您自己在几个月内)阅读起来更简单,而且很可能更快。 fscanf 的大多数实现都以某种方式基于 fgetc 或非常相关的东西。

此外,养成测试您的输入的好习惯。输入文件可能不符合您的预期。

在最新的系统上,编码是今天的 UTF-8 。请注意,某些(人类语言)字符可以用多个字节进行编码(例如,法语重音 e 字母 é,或俄语 yery 字母 Ы,甚至是欧元符号 ,或者数学所有符号 、其他语言中的字母或字形等等...... )。如果您关心这一点,您可能应该考虑使用一些 UTF-8 库(例如 libunistring )(并且您应该关心严肃软件中的 UTF-8!)。

Nota Bene:如果你还年轻并且学习编程,最好(IMNSHO)学习 SchemeSICP ,使用例如Racket在学习 C 或 Java 之前。恕我直言,C 确实不适合初学者。

PS,字符类型(通常是字节)是小写的 char

关于c - 为什么我们在 C 编程中总是必须使用 fgetc 命令而不是 fscanf,它做同样的事情但打印奇怪的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30825492/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com