6

哪个更快?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() 调用会减慢程序的速度吗?我应该只在主方法中使用 1 fin.read() 并将缓冲区传递给小方法吗?我想我要写一个小程序来测试。

谢谢!

4

5 回答 5

5

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

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

于 2011-05-25T21:49:17.947 回答
3

如果您使用高级 api,C++ 流 api 通常比 C 文件 api 慢一点,但它提供比 C 更清洁/更安全的 api。如果您想要速度,请考虑使用内存映射文件,尽管没有可移植的方式这样做与标准库。

于 2011-05-25T21:50:26.457 回答
3

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

  • 这些方法都不会自动将整个文件读入内存。他们都阅读了你指定的内容。
  • 至少ifstream我确信 IO 是缓冲的,所以每次读取都不一定有磁盘访问。
  • 有关读取二进制文件的 C++ 方式,请参阅此问题
于 2011-05-25T21:52:08.060 回答
0

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

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

于 2011-05-25T21:48:32.080 回答
-1

使用流运算符:

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;
}
于 2014-07-15T11:15:18.177 回答