Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.07.27;
Скачать: CL | DM;

Вниз

Работа с файлом на WinAPI   Найти похожие ветки 

 
Dmitry_177   (2007-10-26 16:49) [0]

Если в файл посредством функции WriteFile записано много записей, например c i1 по i10000:

WriteFile(hSaveFile, i1, SizeOf(i1), BytesWrite, nil);
WriteFile(hSaveFile, i2, SizeOf(i2), BytesWrite, nil);
WriteFile(hSaveFile, i3, SizeOf(i3), BytesWrite, nil);
...
WriteFile(hSaveFile, i10000, SizeOf(i10000), BytesWrite, nil);

и надо удалить к примеру i10 запись.. на сколько я знаю прямого удаления нету, и нужно поступить примерно так: прочитать значения с i11 до конца файла, т.е. по i10000 во временный буфер, и затем перевести указатель позиции на i10 и произвести запись буфера.. Но а если файл будет слишком большим по размеру? То придется слишком большой буфер выделять.. Где этот буфер хранится? В оперативной памяти? Может ли получиться так что не хватит оперативки? Или может есть еще какой-то способ удаления какой-то записи из середины файла?


 
Сергей М. ©   (2007-10-26 17:00) [1]


> WriteFile(hSaveFile, i1, SizeOf(i1), BytesWrite, nil);
> WriteFile(hSaveFile, i2, SizeOf(i2), BytesWrite, nil);
> WriteFile(hSaveFile, i3, SizeOf(i3), BytesWrite, nil);
> ...
> WriteFile(hSaveFile, i10000, SizeOf(i10000), BytesWrite,
>  nil);


К чему вся эта ботва ?
Неужели так трудно вместо этого сказать, что речь идет о файле, не имеющем регулярную структуру, т.е. неструктурированном ?


 
Dmitry_177   (2007-10-26 17:03) [2]

чтобы было проще объяснить, я ж написал к примеру..


 
Сергей М. ©   (2007-10-26 17:08) [3]

Читай последовательно по одной записи из входного файла и тут же записывай прочитанную запись в выходной, веди подсчет обработанных записей, как дойдешь до i10-й - не записывай ее.

Вот и всех делов)


 
homm ©   (2007-10-26 17:13) [4]

читаешь в буфер 100кб с той позиции, где заканчивается удаляемая запись, пишеш буфер в позицию, где начинается удаляемая запись, читаешь в буфер 100кб с той позиции, где заканчивается удаляемая запись + 100кб, пишешь буфер в позицию, где начинается удаляемая запись + 100кб…
Так, пока не кончится файл.


 
Dmitry_177   (2007-10-26 17:14) [5]

Вы наверно не доконца поняли.. файл один, т.е. входной и выходной один и тотже.. но это ладно.. мне кажется если по одной записи считывать это будет слишком долго.. можно же сразу с i11 до конца файла все считать а потом записать, только вот проблема в том что куда это считать, если очень много??


 
homm ©   (2007-10-26 17:21) [6]

> [5] Dmitry_177   (26.10.07 17:14)
> файл один, т.е. входной и выходной один и тотже..

нет никаких препятствий писать и читать в 1 файл.

> мне кажется если по одной записи считывать это будет слишком
> долго..
читай по 100кб!



Страницы: 1 вся ветка

Текущий архив: 2008.07.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.018 c
2-1214219491
Евро2008
2008-06-23 15:11
2008.07.27
Повернуть на 90 градусов


2-1214223301
F@T@L_Err0r
2008-06-23 16:15
2008.07.27
Закрытие приложения


2-1214563180
cvg
2008-06-27 14:39
2008.07.27
Почему при сравнении элементов массива компилятор выдает ошибку?


15-1213004432
LightRipple
2008-06-09 13:40
2008.07.27
Коварный inline :)


15-1213095081
Res
2008-06-10 14:51
2008.07.27
текст с картинки