Непоследовательное поведение std::cout
Мне кажется 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.
1 ответ
У меня есть чувство, что комментарий Марка Рэнсома указывает на проблему. Вы можете проверить эту гипотезу, открыв свой файл в двоичном режиме и напечатав целочисленные значения, которые кодируют символы.
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'
) вызывает запись строки поверх предыдущего вывода.