题
用这个代码我尝试打印的字符串"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 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());
}
重点做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*型。
不隶属于 StackOverflow