Перезапись файла большого размера - 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)
{
    // ...
}

Объяснение кода листинга программы

  1. descript1 = CreateFile(input.txt, GENERIC_READ, FILE_SHARE_WRITE,NULL, OPEN_EXISTING,0,NULL); - в этой строке кода создается дескриптор файла с именем input.txt, который будет использоваться для чтения файла. Если файл не существует или не может быть открыт, то возвращается значение INVALID_HANDLE_VALUE и код в блоке if будет выполнен.
  2. descript2 = CreateFile(input.txt, GENERIC_WRITE, FILE_SHARE_READ,NULL, OPEN_EXISTING,0,NULL); - в этой строке кода создается дескриптор файла с именем input.txt, который будет использоваться для записи в файл. Если файл не существует или не может быть открыт, то возвращается значение INVALID_HANDLE_VALUE и код в блоке if будет выполнен.
  3. Дальнейший код должен быть написан внутри блоков if для обработки ошибок открытия файла.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5
Похожие ответы