Рассмотрим эту программу:SetFilePointer без FILE_FLAG_NO_BUFFERING
#include <stdio.h>
#include <windows.h>
int main(int argc, char** argv) {
if (argc != 2)
return 1;
HANDLE j = CreateFile("\\\\.\\F:", FILE_GENERIC_READ, FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, NULL);
int k = SetFilePointer(j, atoi(argv[1]), NULL, FILE_BEGIN);
printf("%d\n", k);
}
я получаю эти результаты:
> a 512
512
> a 513
-1
> a 1024
1024
Так что я могу только переместить указатель файла, кратные размеру сектора тома. Это - это поведение, которое можно было бы ожидать с флагом FILE_FLAG_NO_BUFFERING . Однако я не использую этот флаг, так почему я получаю эти результаты?
Файловые потоки реализуют собственную буферизацию более высокого уровня, но они используют 'CreateFile()' и 'SetFilePointer()' на нижнем уровне. Таким образом, они могут читать/записывать целые сектора на более низком уровне и буферизировать по мере необходимости, чтобы обеспечить частичное чтение/запись. –