2015-02-04 5 views
4

У меня есть следующий код:станд :: basic_fstream :: положит() не имеет никакого эффекта

#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

Возможно, вам стоит убедиться, что написание действительно успешно. – chris

+0

Интересно, что изменение параметра шаблона 'unsigned char' только на' char' (поскольку 'std :: fstream' typedefed) решает проблему. Я не уверен на 100%, почему; Мне нужно было бы вникать в кишечник STL, чтобы понять, что один из них. – inetknght

+1

Стандартные потоки гарантируются только специализациями 'char' и' wchar_t'. – 0x499602D2

ответ

0

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

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

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

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

std::has_facet

Исключения
станд :: bad_cast если станд :: has_facet (LOC) == ложь.

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