2013-04-15 2 views
0

Я подозреваю, что я даже не создание и открытие файла для двоичных входов/выходов с помощью std::fstreamстанд :: fstream :: написать && станд :: fstream :: putc станд :: ИОС :: двоичная

BinarySearchFile::BinarySearchFile(std::string file_name){ 

    // concatenate extension to fileName 
    file_name += ".dat"; 

    // form complete table data filename 
    data_file_name = file_name; 

    // create or reopen table data file for reading and writing 
    binary_search_file.open(data_file_name, std::ios::binary); // create file 

    if(!binary_search_file.is_open()){ 

     binary_search_file.clear(); 
     binary_search_file.open(data_file_name, std::ios::out | std::ios::binary); 
     binary_search_file.close(); 
     binary_search_file.open(data_file_name), std::ios::out | std::ios::in | std::ios::binary | std::ios::ate; 
    } 

    try{ 
     if(binary_search_file.fail()){ 
      throw CustomException("Unspecified table data file error"); 
     } 
    } 
    catch (CustomException &custom_exception){ // Using custom exception class 
     std::cout << custom_exception.what() << std::endl; 
     return; 
    }  

} 

Я считаю, что это верно, потому что я пишу данные

void BinarySearchFile::writeT(std::string attribute){ 
    try{ 
     if(binary_search_file){ 
      binary_search_file.write(attribute.c_str(), attribute.length()); 
     }else if(binary_search_file.fail()){ 
      throw CustomException("Attempt to write attribute error"); 
     } 

    } 
    catch(CustomException &custom_exception){ // Using custom exception class 
     std::cout << custom_exception.what() << std::endl; 
     return; 
    } 
} 

Но файл является стандартным текстовым файлом со считываемыми текстовыми данными. Я хочу написать символы строки или самих символов в двоичном формате (2 байта char). Я пытаюсь использовать std::fstream, аналогичный RandomAccessFile.

_ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __

Вопрос: правильно ли я создал файл и почему я не вижу записи двоичных данных?

+0

Я считаю, что вам нужно использовать 'binary_search_file.open (data_file_name.c_str(), std :: ios :: binary)'. Обратите внимание на 'c_str()'. –

+0

@Thomas: (a) Visual Studio обеспечивает перегрузку для поддержки кода OP; (b) также C++ 11; (c) если это не так, это вызовет ошибку компиляции, и кажется очевидным, что OP не испытывает ошибку компиляции. –

ответ

0

Вы действительно создали файл правильно. У вас есть недоразумение, что есть два типа файлов: двоичный и текстовый. Вместо этого существуют два типа операций ввода-вывода, например, operator<< и двоичный код, например write.

Причина, по которой вы не видите два байтовых символа, состоит в том, что std::string имеет только один байт. Если вы хотите использовать два байтовых символа, используйте std::wstring.

+0

'write' ожидает' const char * ', а' std :: wstring' является 'const wchar_t *', поэтому появляется явное преобразование в порядке, но как? Если я пишу данные в двоичном формате, я должен правильно использовать 'write'? – Mushy

+0

@Mushy Да, требуется явное приведение, используйте reinterpret_cast, как этот 'binary_search_file.write (reinterpret_cast (attribute.c_str()), ...'. И да, если писать двоичное использование write (или put, если писать один байт на время). – john

+0

Что-то по-прежнему не подходит мне должным образом. Если я пишу данные в двоичном формате, то почему он появляется в текстовой форме, читаемой человеком? – Mushy

Смежные вопросы