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
будет сгенерировано исключение, потому что среди возможных причин нет фасета, соответствующего этой локали, который проверяется после выполнения этой операции.
Необработанные операции не заботятся о локализации, поэтому они не могут завершиться по этой причине, в то время как это произойдет, если, например, при необработанной записи произошла ошибка.
Исключения
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