ifstream против fread для двоичных файлов - PullRequest
4 голосов
/ 26 мая 2011

Что быстрее?ifstream или fread.
Что я должен использовать для чтения двоичных файлов?

fread() помещает весь файл в память.
Таким образом, после fread доступ к создаваемому буферу происходит быстро.

Делает ifstream::open(), помещает весь файл впамять?
или он обращается к жесткому диску каждый раз, когда мы запускаем ifstream::read()?

Итак ... делает ifstream::open() == fread()?
или (ifstream::open(); ifstream::read(file_length);) == fread()?

Или я должен использовать ifstream::rdbuf()->read()?

edit: Мой метод 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 () в методе main и передать буфер в маленькие методы?Я предполагаю, что напишу небольшую программу для тестирования.

Спасибо!

Ответы [ 5 ]

3 голосов
/ 26 мая 2011

Вы действительно уверены, что fread поместит весь файл в память? Доступ к файлу можно буферизовать, но я сомневаюсь, что вы действительно поместите весь файл в память. Я думаю, что ifstream::read просто использует fread под капотом более совместимым с C ++ способом (и, следовательно, является стандартным способом чтения двоичной информации из файла на C ++). Я сомневаюсь, что есть существенная разница в производительности.

Чтобы использовать fread, файл должен быть открыт. Он не берет файл и сразу помещает его в память. так ifstream::open == fopen и ifstream::read == fread.

2 голосов
/ 26 мая 2011

Что касается того, что быстрее, см. Мой комментарий.В остальном:

  • Ни один из этих методов автоматически считывает весь файл в память.Они оба читают столько, сколько вы укажете.
  • Как минимум для ifstream Я уверен, что IO буферизован, поэтому не обязательно будет доступ к диску для каждого выполненного вами чтения.* См. этот вопрос для C ++ - способ чтения двоичных файлов.
1 голос
/ 26 мая 2011

API-интерфейс потока C ++ обычно немного медленнее API-файла C, если вы используете API высокого уровня, но он обеспечивает более чистый / безопасный API, чем C. Если вам нужна скорость, рассмотрите возможность использования файлов с отображенной памятью, хотя для стандартной библиотеки этого не существует.

0 голосов
/ 15 июля 2014

Использовать оператор потока:

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;
}
0 голосов
/ 26 мая 2011

Идея потоков файлов C ++ состоит в том, что часть или весь файл буферизуется в памяти (в зависимости от того, что он считает оптимальным), и вам не нужно об этом беспокоиться.

Я бы использовал ifstream::read() и просто сказал бы, сколько вам нужно.

...