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之后。
答案 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
? \n
是newline个字符。没有它,所有输出将在同一条线上一起运行 - 甚至没有插入空格字符:
file opened.testtest2
如果你想深入了解,请参阅以下有关缓冲stdout的相关内容(特别是在&#39; C&#39;中):Is stdout line buffered, unbuffered or indeterminate by default?