std::basic_fstream::put() не имеет никакого эффекта

У меня есть следующий код:

#include <iostream>
#include <fstream>

int main(int argc, char *argv[]) {
    if (argc != 2) {
        std::cout << "Usage: basics <file>" << std::endl;
        return 0;
    }

    std::basic_fstream<unsigned char> stream;

    stream.open(argv[1], std::fstream::out);
    stream.put('T');
    stream.put('E');
    stream.put('S');
    stream.put('T');
    stream.flush();
    stream.close();

    return 0;
}

Файл создается, но в нем ничего нет, когда я открываю его в редакторе. Мой компилятор gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1),
Что с этим не так?

1 ответ

Цитирование std::basic_ostream::put

В отличие от отформатированных функций вывода, эта функция не устанавливает бит сбоя, если вывод завершается ошибкой.

Даже если вы проверите состояние потока, ошибки не будет отображаться. Однако, если вы попытаетесь написать что-то с помощью форматированной операции вывода, std::bad_cast будет сгенерировано исключение, потому что среди возможных причин нет фасета, соответствующего этой локали, который проверяется после выполнения этой операции.

Необработанные операции не заботятся о локализации, поэтому они не могут завершиться по этой причине, в то время как это произойдет, если, например, при необработанной записи произошла ошибка.

станд::has_facet

Исключения
std::bad_cast, если std::has_facet(loc) == false.

В самом деле, std::ctype специализируется на char а также wchar_t не unsigned char что вам придется сделать вручную. За en_GB.utf8, std::has_facet<std::ctype<unsigned char>>( std::locale("en_GB.utf8") ) == false

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