使用此代码我尝试打印字符串“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();
}
答案 0 :(得分:9)
这里有很多错误,我只想列出我看到的所有内容:
你的for循环条件应该是i&lt; 10。
为什么使用模板但不使用模板化参数T?
你在CStr上调用方法front(),但是CStr是一个字符串,而不是一个字符串,所以我甚至不知道它是如何编译的。
假设CStr是一个字符串,你不想使用&amp;来获取front()迭代器的地址,而是想要说出类似的内容:
fn.write(St.c_str(), St.size());
并且您不想为St.size()迭代循环。只要做上面的事情。
答案 1 :(得分:3)
omg,它有很多错误:
修复了您的示例,并对您的代码进行了整理和命名:
#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 );
答案 2 :(得分: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());
}
答案 3 :(得分:1)
在二进制模式下执行io操作的重点:
文件必须在最后关闭。
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,告诉操作系统该文件也是以追加模式打开的。这意味着任何新的数据集都将附加到文件末尾。
上面使用的写入函数需要将参数作为字符指针类型。因此我们使用类型转换器reinterpret_cast将结构类型转换为char *类型。