3

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

4 回答 4

9

这里有很多错误,我将列出我看到的所有内容:

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

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

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

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

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

而且您不想循环 St.size() 迭代。只需执行上述操作。

于 2009-03-26T07:06:42.243 回答
3

omg,它有很多错误:

  • int main - 应该返回值;
  • 您不在函数中使用 template< 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 );
于 2009-03-26T07:18:55.193 回答
1

首先,char CStr说那CStr是一个单一的字符。其次,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());
}
于 2009-03-26T07:07:51.943 回答
1

在二进制模式下进行 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* 类型。

于 2009-03-26T07:39:23.427 回答