Перезапись файла большого размера - C (СИ)
Формулировка задачи:
Помогите реализовать запись в тот же файл с которого было произведено чтение через буфер,приходиться работать с файлами больших размеров (>80 Гб),а у WinAPI функций WriteFile и ReadFile предел в 4 Гб (параметр передающий с какого байта читать\писать буфер принимает DWORD значение максимальный размер которого 4294967295 что равняеться 4 Гб).К тому же при перезаписи если данные в буфере были изменены (другой участок моего кода),то в файл они попадают через блок,т.е. блок оригинального файла,блок измененного буфера и так чередуются до конца файла.Компилирую MinGW.Код вот -
#include <windows.h>
#include <stdio.h>
#include <stdbool.h>
BYTE buf[16777216];
DWORD buflen;
HANDLE file;
int main() {
file = CreateFile("C:\\RW.BIN", GENERIC_READ | GENERIC_WRITE, 0,NULL, OPEN_EXISTING,0,NULL);
while(ReadFile(file,buf,16777216,&buflen,0) && buflen > 0){
WriteFile(file,&buf,buflen,&buflen,0);
}
}
Хотя зря я в этой ветке написал,код компилится и C++ компилятором,лучше было создать тему в C++ и WinAPI.Тем не менее пишу и компилирую С код.C++ 'ом не компилировал до того как написал тему
Хотя и WinAPI здесь имеет косвенное отношение, т.к. его средства чтения/записи не удовлетворяют моим требованиям по размеру
Решение задачи: «Перезапись файла большого размера»
textual
Листинг программы
descript1 = CreateFile("input.txt", GENERIC_READ, FILE_SHARE_WRITE,NULL, OPEN_EXISTING,0,NULL);
if (INVALID_HANDLE_VALUE == descript1)
{
// ...
}
descript2 = CreateFile("input.txt",GENERIC_WRITE, FILE_SHARE_READ,NULL, OPEN_EXISTING,0,NULL);
if (INVALID_HANDLE_VALUE == descript2)
{
// ...
}
Объяснение кода листинга программы
descript1 = CreateFile(input.txt, GENERIC_READ, FILE_SHARE_WRITE,NULL, OPEN_EXISTING,0,NULL);- в этой строке кода создается дескриптор файла с именемinput.txt, который будет использоваться для чтения файла. Если файл не существует или не может быть открыт, то возвращается значение INVALID_HANDLE_VALUE и код в блоке if будет выполнен.descript2 = CreateFile(input.txt, GENERIC_WRITE, FILE_SHARE_READ,NULL, OPEN_EXISTING,0,NULL);- в этой строке кода создается дескриптор файла с именемinput.txt, который будет использоваться для записи в файл. Если файл не существует или не может быть открыт, то возвращается значение INVALID_HANDLE_VALUE и код в блоке if будет выполнен.- Дальнейший код должен быть написан внутри блоков if для обработки ошибок открытия файла.