Непоследовательное поведение 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') вызывает запись строки поверх предыдущего вывода.

Другие вопросы по тегам