为什么我的程序会停止,除非包含“\ n”

时间:2015-10-20 17:42:17

标签: c++ freeze cout

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”,否则不会打印到标准输出。例如。 cout&lt;&lt; “测试”&amp;底部的“test2 \ n”使程序能够访问这些代码行,并将在此之前完成所有操作,例如: “文件已打开”行,因为test2具有\ n并且文件已打开。如果他们被改为只是cout“test1”test2“程序将不输出任何内容,包括”文件打开“。此外,如果我将”文件打开“更改为”文件打开\ n“然后将打印,但如果test1和test2没有\ n它们不会打印,因为它们位于“文件打开”中的\ n之后。

2 个答案:

答案 0 :(得分:1)

Streams有缓冲以避免必须执行大量的小I / O操作。默认情况下,cout是行缓冲的,因此行尾会刷新缓冲区。您还可以显式刷新缓冲区,并在正常终止时刷新所有缓冲区(即,将其内容发送到其目标)。如果我们的程序异常崩溃或终止,则不会刷新缓冲区。

答案 1 :(得分:0)

我怀疑你的程序停止/冻结的证据仅限于它没有产生预期的输出。您可以使用source level debugger来解决此问题,以便更好地了解程序在打印任何内容时所执行的操作。

添加,"print statements"也可以是一种有用的调试方法,但您必须正确执行(通常需要包含\n)。就个人而言,我更喜欢使用std::cerr进行调试,其中一个原因是无论是否包含\n,它都会自动刷新每个输出。以下是使用cerr的示例:

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

从根本上说,为什么你想要cout这些字符串没有尾随\n\nnewline个字符。没有它,所有输出将在同一条线上一起运行 - 甚至没有插入空格字符:

file opened.testtest2

如果你想深入了解,请参阅以下有关缓冲stdout的相关内容(特别是在&#39; C&#39;中):Is stdout line buffered, unbuffered or indeterminate by default?