繁体   English   中英

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

[英]How to Write Strings Into Binary File

使用此代码,我尝试以二进制格式打印字符串“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();   
}

这里有很多错误,我只想列出我看到的一切:

你的for循环条件应该是<10。

你为什么使用模板而不是模板化的参数T?

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

假设CStr是一个字符串,你不想使用&获取front()迭代器的地址,而是想要说出如下内容:

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

并且您不希望为St.size()迭代循环。 只要做上面的事情。

omg,它有很多错误:

  • int main - 应该返回值;
  • 你不要在你的函数中使用模板<typename T>;
  • Mystr - 函数调用中的名称不正确,c ++中的名称是大小写的;
  • char CStr - 没有方法前面,也没有std :: string;
  • 你无法得到第一个元素的地址,比如矢量;
  • 如果你接受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;
}

但我建议使用std::fill_n算法

std::fill_n( std::ostream_iterator< std::string >( myfile, "\t" ), 10, MyStr );

首先, char CStrCStr是一个单一角色。 第二, fn.write(&CStr.front(), CStr.size()); 将该字符视为容器,如std::vector<> ,当然无法编译。

假设WriteStr2BinFh所有内容都没问题,我还没有检查过,这就是WriteStr2BinFh应该(看起来)的样子:

void WriteStr2BinFh(const string& St, ostream &fn)
{
    for(string::iterator it = St.begin(); it != St.end(); ++it)
    {
        fn.put(*it);
    }
}

或者,最好是

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

在二进制模式下执行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(); } 

    此I / O二进制函数将一些数据写入函数。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM