2013-05-02 121 views
0

我目前打算至K & R C和我想要出了该程序采用字符流作为输入,然后打印有流中的字符数的例子。为什么在使用printf()时不会产生任何输出?

这似乎并不远,产生任何输出,因为我可以看到:

main() 
{ 
    long nc; 
    nc = 0; 
    while (getchar() != EOF){ 
     ++nc; 
    } 
    printf("%1d\n", nc); 
} 

然而,这似乎从做工精细虽然,略有不同的是我想:

main() 
{ 
    long nc; 
    nc = 0; 
    while (getchar() != EOF){ 
     ++nc; 
     printf("%1d\n", nc); 
    } 
} 

任何指针将不胜感激。提前致谢!

编辑

我已经尝试使用模拟CTRL ž的EOF但似乎并没有奏效。如果这有什么区别的话,我在Windows 7的cmd行上运行它。 enter image description here

+0

你是如何关闭输入流? – Mat 2013-05-02 10:21:39

+0

添加getch();中的printf – 999k 2013-05-02 10:23:39

+2

后,如果你的'了'while'循环内部printf'作品,但不出来那么它从来没有收到'EOF'。 – 2013-05-02 10:23:42

回答

4

你的程序工作正常。

你没有看到输出,因为你永远不发送EOF。在文件中,如果你在命令行中运行,必须通过:

./a.out <myfile.txt 

(这也将在Windows工作)

或者,如果你在你自己的打字输入,类型<return><ctrl-D><return>到发送一个EOF。 (或<return><ctrl-Z><return>在Windows上)

那么这应该按预期工作。

➤ cat try.c 
#include <stdio.h> 
main() 
{ 
    long nc; 
    nc = 0; 
    while (getchar() != EOF){ 
     ++nc; 
    } 
    printf("%1d\n", nc); 
} 
➤ gcc try.c -o try && ./try <try.c 
131 

这是GnuCC的示例会话。

control-Z working with minGW

2

对于getchar回到EOF你需要“关闭流/到达流的末尾”。见这个问题的答案:C : How to simulate an EOF?

总之: 你需要(例如,通过在Windows或Ctrl + d在Linux上发送按Ctrl + Z)发送EOF到流。 或者例如使用管道。例如将一个文件的管道内容传送到您的应用程序。当第一个应用程序终止时,它会自动关闭流,以便应用程序读取EOF。

例如在Linux下:

$ cat some_file.txt | ./a.out 

希望这会有所帮助。

相关问题