我似乎std::cout
在打印多个内容时不能始终如一地工作,如以下两个示例所示。我认为它可能与缓冲区刷新有关,但即使我在测试示例中添加了一些std::flush
也没有区别。
#include <cstdlib>
#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
void test(const std::string& f1);
int main(void) {
std::string a = "a";
std::cout << a << a << a << std::endl;
// Then I got aaa on the screen, which is as expected.
test("inputfile");
// The input file contains one character: "a"
// after running the test I got only one "a" on the screen
// even though the string is repeated three times in the cout statement, as in the previous case
return 0;
}
void test(const std::string& f1){
std::ifstream ifile;
ifile.open(f1);
for(std::string line; std::getline(ifile, line); ) {
std::cout << line << line << line << std::endl;
}
ifile.close();
}
我希望看到
aaa
aaa
在屏幕上,但实际输出是
aaa
a
我用它来编译
g++ -g -std=c++11 -o test test.cpp
g ++的版本是5.2.0。
答案 0 :(得分:5)
我有一种感觉Mark Ransom的评论指出了这个问题。您可以通过以二进制模式打开文件并打印编码字符的整数值来验证该假设。
void test(const std::string& f1){
std::ifstream ifile;
ifile.open(f1, std::ifstream::binary);
int ch;
while ( (ch = ifile.get()) != EOF )
{
// Print the integer value that encodes the character
std::cout << std::setw(2) << std::setfill('0') << std::hex << ch << std::endl;
}
ifile.close();
}
如果输出
61
0d
0a
并且您的平台不是Windows,那么您获得的输出将是有意义的。
从文件中读取的行包含字符'a'
(0x61
)和'\r'
(0x0d
)。
回车符('\r'
)会将行写在上一个输出的顶部。