2015-10-20 50 views
-3
int main(int argc, char *argV[]){ 

istream *br; 
ifstream inFile; 
if(argc == 2){ 

    inFile.open(argV[1]); 

    if(inFile.is_open()){ 
     cout << "file opened."; //if only "file opened" has an "\n then only it will print 
     br = &inFile;  //and the program will freeze right after printing it 
    } 
} 
else if(argc <= 1){ 

    br = &cin; 

} 
else{ 

    cout << "Unrecognized commands"; 

} 
cout << "test"; //having \n here allows the program to reach this line of code and 
cout << "test2\n"; //everything before it 

发生了一些奇怪的事情。除非字符串中包含“\ n”,否则不会打印到标准输出。例如。在底部的“test2 \ n”使得程序能够到达那些代码行,并且将关注到该点的所有事情,例如, “文件打开”行,因为test2已经打开了\ n并且打开了文件。如果将它们更改为“test1”test2“,程序将不会输出任何内容,包括”文件打开“。此外,如果将”文件打开“更改为”打开文件\ n“,则会打印该文件,但如果test1和test2没有\ n它们不会打印,因为它们位于“文件打开”中的\ n之后。为什么我的程序停止,除非包含“ n”

+3

您是否尝试刷新流? – Default

+1

什么是'istream * br;'用于? 1.你不应该需要一个指针,并且2.你不要初始化它! – crashmstr

+0

你在unixish系统上?如果是这样,'./yourprogram;回声'有什么区别?你的shell提示是否包含回车并覆盖你的输出? – melpomene

回答

1

流缓冲以避免必须执行大量小I/O操作。 ,cout是行缓冲的,因此行结束时会刷新缓冲区,您也可以在正常终止时显式刷新缓冲区并刷新所有缓冲区(也就是说,它们的内容发送到它们的目的地)如果我们的程序崩溃或终止异常地,缓冲区不会被刷新。

+0

终止程序也刷新缓冲区。 – melpomene

0

我怀疑你的证据表明该程序停止/冻结仅限于它不会产生预期的输出。你可以用source level debugger来攻击这个问题,以更好地理解程序在不打印任何东西时正在做什么。

添加,"print statements"也可以是一个有用的调试手段,但你必须正确地做到这一点(通常要求你包括\n)。就个人而言,我更喜欢使用std::cerr进行调试,其中一个原因是无论您是否包含\n,它都会自动刷新每个输出。下面是一个例子使用CERR:

using std::cerr; 
cerr<<"Unrecognized commands\n"; 

从根本上说,虽然,你为什么会想cout这些字符串末尾没有\n\nnewline的字符。没有它,所有的输出将一起在同一行中运行 - 甚至无需介入的空格字符:

file opened.testtest2 

如果您想更深入了解,这里的一对标准输出的缓冲一些相关阅读(特别是在' C'虽然):Is stdout line buffered, unbuffered or indeterminate by default?

相关问题