Поиск С++ с помощью CreateFile вместо fopen

Я хотел бы обменять FILE* на HANDLE=CreateFile(), чтобы проверить разницу в скорости.

Я пытаюсь изменить свой код сейчас.

Может ли кто-нибудь сказать мне, как мне изменить эти две строки, чтобы отразить, что теперь я имею дело с дескриптором, а не с ФАЙЛОМ*?

fseek(myFile,iBytePos,SEEK_SET);
fread(&SomeValues[0],iByteCount,1,myFile);

Я старался

LARGE_INTEGER l;

l.QuadPart=iBytePos;
SetFilePointer(myFile,l.LowPart,&l.HighPart,FILE_BEGIN);

DWORD dw;
BOOL result = ReadFile(myFile,&SomeValues[0],iByteCount,&dw,NULL);

но что-то не так. Должно быть, я где-то ошибся.

Огромное спасибо за помощь!


person tmighty    schedule 12.10.2013    source источник


Ответы (2)


Эквивалентом Windows API для fread является ReadFile, а для fseek это SetFilePointer. Если вы просто замените эти вызовы, разница в производительности будет незначительной, если таковая имеется. В отличие от fseek, SetFilePointer поддерживает файлы > 2 ГБ. Если вам не нужен вызов просто:

SetFilePointer(myFile, iBytePos, NULL, FILE_BEGIN);

Вы можете ускорить дисковый ввод-вывод с помощью Windows API, используя его большую гибкость. Если у вас много операций поиска-чтения-искания-чтения, вы можете использовать ReadFileScatter вместо этого.

Другим потенциальным путем оптимизации может быть использование асинхронного ввода-вывода. Сравнение можно найти на странице синхронного и асинхронного ввода-вывода.

person IInspectable    schedule 12.10.2013

Для fseek вы можете использовать SetFilePointerEx или SetFilePointer.

Для fread вы можете использовать ReadFile или ReadFileEX

Вы можете найти помощь здесь

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365542(v=vs.85).aspx

person CS Pei    schedule 12.10.2013
comment
Хотя можно использовать *Ex-версии вызовов Windows API, они предоставляют функциональные возможности, выходящие за рамки того, что предлагают вызовы C Runtime. Простые вызовы больше напоминают вызовы C Runtime. - person IInspectable; 12.10.2013