像C中的这个函数一样:
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
我查看了C ++文件流并找到了这个:
ostream& write ( const char* s , streamsize n );
这个只接受char*
而不是void*
但是如果我在c ++中使用 C 式的fwrite函数真的很重要吗?
答案 0 :(得分:3)
除非我误解你的问题,否则Streams可能就是你要找的东西。有许多风格可以处理不同的工作,比如输出到文件:
#include <cstdlib>
#include <fstream>
#include <string>
using namespace std;
int main()
{
ofstream f("c:\\out.txt");
const char foo[] = "foo";
string bar = "bar";
int answer = 42;
f << foo << bar<< answer;
return 0;
}
...像printf
一样构建字符串:
#include <cstdlib>
#include <sstream>
#include <string>
#include <iostream>
using namespace std;
int main()
{
stringstream ss;
const char foo[] = "foo";
string bar = "bar";
int answer = 42;
ss << foo << bar<< answer;
string my_out = ss.str();
return 0;
}
......如果你告诉他们如何:他们甚至可以处理你自己的类型:
#include <cstdlib>
#include <string>
#include <iostream>
using namespace std;
class MyGizmo
{
public:
string bar_;
int answer_;
MyGizmo() : bar_("my_bar"), answer_(43) {};
};
ostream& operator<<(ostream& os, const MyGizmo& g)
{
os << g.bar_ << " = " << g.answer_;
return os;
}
int main()
{
MyGizmo gizmo;
cout << gizmo;
return 0;
}
答案 1 :(得分:2)
您可以使用其中任何一个。使用char *
代替void *
并没有太大的区别 - fwrite
和ostream::write
通常用于各种数据类型(使用C ++,您需要向char *
添加一个显式强制转换,假设你已经为fwrite
包含了一个合适的原型,那么在C中将强制进行强制转换。
答案 2 :(得分:0)
在C ++中,您需要使用std::ofstream
个对象来写入文件。他们可以使用<<
运算符接受任何类型的数据,这与std::cout
用于写入控制台的方式非常相似。当然,就像std::cout
一样,如果要打印自定义类型,则需要为其定义operator<<
重载。
一个例子:
std::ofstream outfile("myfile.txt");
int i = 5;
double d = 3.1415926535898;
std::string s = "Hello, World!";
outfile << i << std::endl;
outfile << d << std::endl;
outfile << s << std::endl;
要使用std::ofstream
,您需要#include <fstream>
。
outfile
对象会在文件析构时自动关闭文件,或者您可以调用其close()
方法。
答案 3 :(得分:0)
与已经给出的答案相反,fwrite()和ostream :: write()之间存在重要区别。
fwrite()编写未经修改的二进制数据(好吧,在那些可怜的非Unix平台上有端线转换,除非文件以二进制模式打开)。
ostream :: write()使用locale来转换每个字符,这就是它接受char *而不是void *的原因。通常,它使用默认的“C”语言环境,它不进行任何转换。
请记住,basic_ostream是basic_streambuf之上的格式化程序,而不是二进制接收器。