我目前正在尝试学习C编程语言,并且正在使用Kernighan和Ritchie的 The C Programming Language,Second Edition 。我正在尝试编写一个程序,类似于他们在第一章关于文本流的书中给出的一个例子。
我的程序应该将文本文件打印到终端,然后在打印该数字之前计算字符数。这是我的代码:
#include <stdio.h>
int main()
{
int count = 0, c;
while ((c = getchar()) != EOF) {
count++;
putchar(c);
}
printf("\n%d characters\n", count);
return 0;
}
这是输出:
This is a simple file
With two very small lines
I mean three
1 characters
但是当我在count++
下面添加这一行时:
printf("%d", count);
结果是:
1T2h3i4s5 6i7s8 9a10 11s12i13m14p15l16e17 18f19i20l21e22
23W24i25t26h27 28t29w30o31 32v33e34r35y36 37s38m39a40l41l42 43l44i45n46e47s48
49I50 51m52e53a54n55 56t57h58r59e60e61
1 characters
这意味着计数正在递增,但我无法从while循环外部访问其值。我认为如果变量的声明(在这种情况下int count = 0
在循环之外),那么在循环之后仍然可以达到该值。
如果它有所不同,这就是我所说的:
./example <text.txt
我犯了一个愚蠢的错误吗?任何帮助,将不胜感激。感谢
更新
我不知道它是否有所作为,但我使用的编译器是:powerpc-apple-darwin9-gcc-4.0.1。这就是问题所在吗?
更新2
这是我用来编译源代码的命令:gcc -Wall example.c -o example
。刚刚发生了一件奇怪的事情。当我跑这个时,它运作得很好:
#include <stdio.h>
int main()
{
int count = 0, c;
while ((c = getchar()) != EOF) {
count++;
putchar(c);
}
printf("x");
printf("\n%d characters\n", count);
return 0;
}
输出结果为:
This is a simple file
With two very small lines
I mean three
61 characters
此代码与上述代码之间的唯一区别是printf("x")
行。我不明白为什么它突然起作用,如果我打印别的东西,我不明白为什么它不可见。任何字符都可以放在命令中,并且会出现相同的结果。如果添加了多个字符,则会打印第二个字符以及之后的任何字符。
答案 0 :(得分:0)
很可能你对字符存储在内存中的字符的引用被错误地编码,这就是你的输出就是这样的原因。确保正确引用其中的文件和文本。除此之外,代码似乎没问题。
我认为这是你应该做的:
int count = 0, c;
FILE *file = fopen("example.txt", "r");
while ((c = getc(file)) != EOF) {
count++;
putchar(c);
}
printf("\n%d characters\n", count);
fclose(file);
答案 1 :(得分:0)
尝试在fflush(stdout)
printf("\n%d characters\n", count);
仅供参考:您的原始代码在Ubuntu 14.04 Linux上按预期执行。