C++ 如何将字符串写入二进制文件

C++ 如何将字符串写入二进制文件,c++,binaryfiles,C++,Binaryfiles,使用这段代码,我尝试打印字符串“foo”10次 以二进制格式。但是为什么这个函数不起作用呢 #include <iostream> #include <fstream> using namespace std; template <typename T> void WriteStr2BinFh (string St, ostream &fn) { for (unsigned i = 0; i < St.size(); i++) {

使用这段代码,我尝试打印字符串“foo”10次 以二进制格式。但是为什么这个函数不起作用呢

#include <iostream>
#include <fstream>
using namespace std;

template <typename T> void WriteStr2BinFh (string St, ostream &fn) {
     for (unsigned i = 0; i < St.size(); i++) {
         char CStr = St[i];
         fn.write(&CStr.front(), CStr.size());
     }
     return;
}

int main() {
   string MyStr = "Foo";
   ofstream myfile;
   myfile.open("OuputFile.txt", ios::binary|ios::out);

   // We want to print it 10 times horizontally
   // separated with tab

  for (int i = 0; i < 9; i++) {
      WriteStr2BinFh(Mystr+"\t", myfile);
   }

   myfile.close();   
}
#包括
#包括
使用名称空间std;
模板void WriteStr2BinFh(字符串St、ostream和fn){
对于(无符号i=0;i
这里有很多错误,我只想列出我看到的所有东西:

您的for循环条件应为i<10

为什么要使用模板而不是模板化参数T

您在CStr上调用方法front(),但是CStr是一个字符,而不是字符串,所以我甚至不知道它是如何编译的

假设CStr是一个字符串,您不想使用&获取front()迭代器的地址,而是想说:

fn.write(St.c_str(), St.size());

您不想循环进行St.size()迭代。就照上面说的做

首先,
char-CStr
表示
CStr
是单个字符。其次,
fn.write(&CStr.front(),CStr.size())
将该字符视为容器,如std::vector,当然无法编译

假设
writestr2binph
之前的一切都正常(我没有检查),这就是
writestr2binph
应该(可以)的样子:

或者,最好是

void WriteStr2BinFh(const string& St, ostream &fn)
{
    fn.write(St.c_str(), St.length());
}

天哪,它有很多错误:

  • int main-应返回值
  • 在函数中不使用模板 MySTR-函数调用中没有正确的名称,C++中的名称是案例从属关系;李>
  • char CStr-没有方法前端,也没有std::string
  • 您无法获取第一个元素的地址,例如在使用vector的情况下
  • 如果您接受std::string作为const引用,则会更好
  • 您忘了包含字符串头
修复了您的示例,使用您的代码组织和命名:

#include <iostream>
#include <fstream>
#include <string>

void WriteStr2BinFh( const std::string& St, std::ostream &out ) 
{
    out.write( St.c_str(), St.size() );
}

int main() 
{
    std::string MyStr = "Foo";
    std::ofstream myfile( "OuputFile.txt", std::ios::binary | std::ios::out );


    for (size_t i = 0; i < 9; ++i) 
    {
        WriteStr2BinFh( MyStr+"\t", myfile );
    }

   myfile.close();   
   return 0;
}

在二进制模式下执行io操作的要点:

  • 必须使用标志ios::out(输出模式)和ios::binary(二进制模式)以输出和二进制模式打开文件
  • 函数write包含两个参数。对于要写入的数据,第一个参数的类型为char*,第二个参数的类型为int,要求将数据的大小写入二进制文件
  • 最后必须关闭文件

    void write_to_binary_file(WebSites p_Data)
    {
        fstream binary_file("c:\\test.dat",ios::out|ios::binary|ios::app);
        binary_file.write(reinterpret_cast<char *>(&p_Data),sizeof(WebSites));
        binary_file.close();
    }
    
    void write_to_binary_文件(网站p_数据)
    {
    fstream二进制文件(“c:\\test.dat”,ios::out | ios::binary | ios::app);
    binary_file.write(reinterpret_cast(&p_数据),sizeof(网站));
    二进制文件.close();
    }
    
    此I/O二进制函数将一些数据写入函数

  • 该文件以输出和二进制模式打开,使用ios::out和ios::binary。 还有一个说明符ios::app,它告诉操作系统该文件也以追加模式打开。这意味着任何新的数据集都将附加到文件末尾

  • 上面使用的write函数需要参数作为字符指针类型。因此,我们使用类型转换器重新解释_cast将结构类型转换为char*类型


我喜欢main()中的显式返回;但是,C++标准需要从主体()的末尾掉下来,等价于返回0。我已经检查了标准第3.6.1.5项-是的,你说得对。但无论如何,我认为应该澄清一下。
std::fill_n( std::ostream_iterator< std::string >( myfile, "\t" ), 10, MyStr );
void write_to_binary_file(WebSites p_Data)
{
    fstream binary_file("c:\\test.dat",ios::out|ios::binary|ios::app);
    binary_file.write(reinterpret_cast<char *>(&p_Data),sizeof(WebSites));
    binary_file.close();
}