ifstream与fread的二进制文件

时间:2011-05-25 21:40:25

标签: c++ file-io ifstream fread

哪个更快? ifstreamfread 我应该用哪个来读取二进制文件?

fread()将整个文件放入内存中 所以在fread之后,访问它创建的缓冲区很快。

ifstream::open()是否将整个文件放入内存中? 或者每次运行ifstream::read()时它是否都会访问硬盘?

那么......是ifstream::open() == fread()吗? 或(ifstream::open(); ifstream::read(file_length);)== fread()

或者我应该使用ifstream::rdbuf()->read()

修改 我的readFile()方法现在看起来像这样:

void readFile()
{
    std::ifstream fin;
    fin.open("largefile.dat", ifstream::binary | ifstream::in);
    // in each of these small read methods, there are at least 1 fin.read()
    // call inside.
    readHeaderInfo(fin);
    readPreference(fin);
    readMainContent(fin);
    readVolumeData(fin);
    readTextureData(fin);
    fin.close();
}

用小方法调用多个fin.read()会减慢程序吗? 我只能在main方法中使用1个fin.read()并将缓冲区传递给小方法吗?我想我打算写一个小程序进行测试。

谢谢!

5 个答案:

答案 0 :(得分:3)

你真的确定fread将整个文件放入内存吗?文件访问可以缓冲,但我怀疑你真的把整个文件放入内存。我认为ifstream::read只是以更符合C ++的方式使用fread(因此是从C ++文件中读取二进制信息的标准方法)。我怀疑是否存在显着的性能差异。

要使用fread,必须打开该文件。它不仅仅需要一个文件并立即将其放入内存。所以ifstream::open == fopenifstream::read == fread

答案 1 :(得分:2)

哪个更快,请参阅我的评论。其余的:

  • 这两种方法都不会自动将整个文件读入内存。他们都阅读你指定的内容。
  • 至少ifstream我确信IO是缓冲的,因此每次读取都不一定会有磁盘访问权。
  • 请参阅this question了解C ++ - 阅读二进制文件的方法。

答案 2 :(得分:1)

如果使用高级api,C ++流api通常比C文件api慢一点,但它提供更干净/更安全的api然后C. 如果你想要速度,可以考虑使用内存映射文件,尽管没有可移植的方法来使用标准库。

答案 3 :(得分:0)

C ++文件流的想法是将部分或全部文件缓存在内存中(基于它认为最佳的文件)并且您不必担心它。

我会使用ifstream::read()并告诉它你需要多少。

答案 4 :(得分:0)

使用流操作符:

DWORD processPid = 0;
std::ifstream myfile ("C:/Temp/myprocess.pid", std::ios::binary);
if (myfile.is_open())
{
    myfile >> processPid;
    myfile.close();
    std::cout << "PID: " << processPid << std::endl;
}