有没有C ++方法来编写任何类型的数据文件?

时间:2010-08-20 14:27:14

标签: c++ file-io

像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函数真的很重要吗?

4 个答案:

答案 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 *并没有太大的区别 - fwriteostream::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之上的格式化程序,而不是二进制接收器。