Главная страница
    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.45 MB
Время: 0.006 c
15-1213103553
oxffff
2008-06-10 17:12
2008.07.27
Среди наших кто-нибудь балуется разработкой компилятора?


15-1213006023
@!!ex
2008-06-09 14:07
2008.07.27
У меня есть матричный принтер...


2-1214222977
Borispol
2008-06-23 16:09
2008.07.27
Права пользователя


2-1214232759
User
2008-06-23 18:52
2008.07.27
Поиск файлов


15-1212514820
olevacho_
2008-06-03 21:40
2008.07.27
инструменты создания отчетов для полиграфии





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский