用这个代码我尝试打印的字符串"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循环条件应该是I <10

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

您所呼叫的CSTR中的方法前(),但CStr的是一个字符,而不是字符串,所以我不知道你们是怎么编译。

假设CStr的是一个字符串,你不希望使用&取前()迭代器的地址,而不是你想说的是这样的:

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

和你不想环路St.size()迭代。只要做到以上。

其他提示

我的天啊,这有一个很大的错误:

  • int主应该返回值;
  • 你不要使用模板< typename T>在你的功能;
  • Mystr-不正确的名字在功能的电话,名称在c++的情况下sencetive;
  • char备-没有方面,以及std::string;
  • 你不能把地址的第一个元素,如在的情况下与矢量;
  • 它会更好,如果你将接受性::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::(输出模式)和ios::二(二元模式)
  • 功能写入需要两个参数。第一个参数的类型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::出和ios::binary。还有一个符ios::应用程序,它告诉操作系统,该文件也打开了在追加方式。这意味着任何新的数据将附于本文件结尾。

  • 写功能使用上述需求的参数字指的类型。所以我们用一种类型转换器reinterpret_cast到定型的结构进char*型。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top