【问题标题】:std::fstream::write && std::fstream::putc std::ios::binarystd::fstream::write && std::fstream::putc std::ios::binary
【发布时间】:2013-04-15 20:21:53
【问题描述】:

我怀疑我什至没有使用 std::fstream 创建和打开二进制 I/O 文件

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字节字符)编写字符串的字符或字符本身。我正在尝试操作类似于RandomAccessFilestd::fstream

_____________ __________________ _________________ _________________________________

问题是:我是否正确创建了文件,为什么我没有看到写入的二进制数据?

【问题讨论】:

  • 我相信你需要使用binary_search_file.open(data_file_name.c_str(), std::ios::binary)。注意c_str()
  • @Thomas:(a) Visual Studio 提供了一个重载来支持 OP 的代码; (b) C++11 也是如此; (c) 如果没有,那将导致编译错误,并且很明显 OP 没有遇到编译错误。

标签: c++ fstream


【解决方案1】:

您确实正确地创建了文件。你有一个误解,有两种文件,二进制文件和文本文件。取而代之的是两种 I/O 操作,像 operator&lt;&lt; 这样的文本和像 write 这样的二进制。

您没有看到两个字节字符的原因是std::string 只有一个字节字符。如果您想要两个字节字符,请使用std::wstring

【讨论】:

  • write 期望 const char *std::wstringconst wchar_t * 所以看起来明确的转换是有序的,但如何?如果我以二进制形式写入数据,我应该使用write 对吗?
  • @Mushy 是的,需要显式转换,像这样使用 reinterpret_cast binary_search_file.write(reinterpret_cast&lt;const char*&gt;(attribute.c_str()), ...。是的,如果写二进制使用 write(或者 put,如果一次写一个字节)。
  • 我仍然没有正确设置某些东西。如果我以二进制格式写入数据,那么为什么它会以人类可读的文本形式出现?
  • 不确定您的期望。即使是二进制的,字符串也是人类可读的。您是否希望看到十六进制值或其他内容?
  • 我发现binary_search_file.write(reinterpret_cast&lt;char *&gt;(&amp;attribute), attribute.length() * 2);以二进制格式写入数据,打开文件时,数据不是人类可读的形式。参考 [this].(en.cppreference.com/w/cpp/io/basic_ostream/write) 另外,因为 char 在 c++ 中是一个字节,而在 Java 中是两个字节,所以我将字符串的长度乘以 2。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 2011-01-19
  • 2012-02-08
  • 1970-01-01
相关资源
最近更新 更多