Работа с файлом
Как переписать строку файла. Средства CFile позволяют считать символ или группу символов из файла или записать символ/символы в конкретное место файла причем символы которые уже имеются будут перезаписаны. А нужно просто добавить символ в конкретное место а остальные символы сдвинуть.
Боюсь, что так тебе и придется сделать - сдвинуть и вставить.
Боюсь, что так тебе и придется сделать - сдвинуть и вставить.
А как лучше сделать есть какие нить алгоритмы. У меня конечно есть идея объявить переменную CString и считаь оставшуюся часть файла в нее. Но тогда возникает вопрос сколько в эту переменную можно записать. Мне нужно файлы редактировать большого размера, а изменить допустим нужно в начале. Тогда придется весь оставшийся файл(а это сотни и тысячи символов)считать в переменную???
А как лучше сделать есть какие нить алгоритмы. У меня конечно есть идея объявить переменную CString и считаь оставшуюся часть файла в нее. Но тогда возникает вопрос сколько в эту переменную можно записать. Мне нужно файлы редактировать большого размера, а изменить допустим нужно в начале. Тогда придется весь оставшийся файл(а это сотни и тысячи символов)считать в переменную???
Не читай весь файл в память!
Создай др. файл и копируй инф. туда.
А как лучше сделать есть какие нить алгоритмы. У меня конечно есть идея объявить переменную CString и считаь оставшуюся часть файла в нее. Но тогда возникает вопрос сколько в эту переменную можно записать. Мне нужно файлы редактировать большого размера, а изменить допустим нужно в начале. Тогда придется весь оставшийся файл(а это сотни и тысячи символов)считать в переменную???
Можешь хранить в файле информацию блоками. Скажем каждый блок содержит 1 килобайт данных, смещение следующего и предыдущего блоков, количество данных (если блок не полон). Плюс в начале файла смещение первого блока. Писать сложнее, зато работать (при необходимости часто перемешивать=) ) будет быстрее.
Для "действительно большого" файла простого решения быть не может. Поищите на codeproject.com или в другом подобном месте. Думаю, найдёте несколько решений.
Можешь хранить в файле информацию блоками.
Если хранить в файле информацию о блоках то при просмотре другой программой скажем блокнот то эта информация будет видна. А проблема состоит в том что моя программа изменяет htm файлы(добавляет новые теги и удаляет старые) поэтому, как сами понимаете создавать дополнительные структуры в файле не желательно. Кстати методом научного тыка выяснилось что CString больших файлов не грузит но если объявить динамическую переменную типа char то можно загрузить файл размером 2^16(я сам не грузил но грузил файлы 30 кб(нормально работает) и 100 кб(не грузит вызывает ошибку в адресе)).
Наверно придется поступить как написал Green.
...моя программа изменяет htm файлы...
Html файлы не бывают «действительно большими». Пусть даже его размер будет 50Mb, его надо грузить полностью в память, обрабатывать и переписывать в конце работы. Надеюсь, что на машине, на которой собираются работать с «большими» файлами, оперативная память тоже «большая» ;)
Html файлы не бывают «действительно большими». Пусть даже его размер будет 50Mb, его надо грузить полностью в память, обрабатывать и переписывать в конце работы. Надеюсь, что на машине, на которой собираются работать с «большими» файлами, оперативная память тоже «большая» ;)
А какая разница. Проблема в добавлении символа в файл между двумя, методы CMemFile этого не позволяют. Я уже поступил как написал Green все нормально работает.
А какая разница.
Разница только в том, что в памяти переписывание делается в тысячи раз быстрее, чем на диске. Однако, это вы почувствуете, конечно, только если файл хоть сколько-нибудь можно назвать "большим".
Если же файл занимает 50kb, то я бы не стал называть его большим и затевать всю эту дискуссию. Можете делать как хотите, всё равно работать будет мгновенно по сравнению со скоростью вколачивания с клавиатуры.
Разница только в том, что в памяти переписывание делается в тысячи раз быстрее, чем на диске. Однако, это вы почувствуете, конечно, только если файл хоть сколько-нибудь можно назвать "большим".
Если же файл занимает 50kb, то я бы не стал называть его большим и затевать всю эту дискуссию. Можете делать как хотите, всё равно работать будет мгновенно по сравнению со скоростью вколачивания с клавиатуры.
Да вопрос то не в скорости а в алгоритме переписывания файла!!! Методы CMemFile (если ты конечно имеешь в виду именно этот класс для работой с файлом в памяти) не позволяют вставлять символ между двумя а только замещать (write). Вот и вопрос: как сместить оставшуюся часть файла для вставки символа.
Да вопрос то не в скорости а в алгоритме переписывания файла!!! Методы CMemFile (если ты конечно имеешь в виду именно этот класс для работой с файлом в памяти) не позволяют вставлять символ между двумя а только замещать (write). Вот и вопрос: как сместить оставшуюся часть файла для вставки символа.
Работает так, как уже сделал? Если да, то и обсуждать тут больше нечего. Если не работает, с удовольствием помогу чем могу.
[COLOR=silver]Моё последнее сообщение было вызвано тем, что я увидел вопрос "какая разница?". Поскольку не люблю оставлять безответные вопросы, написал. Только и всего.[/COLOR]
Жизнь продолжается.
Нафиг этот CFile. Есть fread и fwrite.
А дальше???
А дальше???
А что дальше?
Нету, понимаешь ли такой вещи как аппаратная вставка или удаление блоков памяти - ни на уровне ОЗУ ни на уровне харда. Все это приходится делать руками. В памяти, либо на диске.
Вот тебе два варианта:
1. File to File.
int bsz,fsz;
char buf[0x1000];
// позиция для вставки
int pos=0x100; // к примеру
// строка для вставки
char *str="<a href>";
fp1=fopen("1.html","rb");
fp1=fopen("2.html","wb");
fseek(fp1,0,SEEK_END);
fsz=ftell(fp1)-pos;
fseek(fp1,0,SEEK_SET);
while (pos)
{
bsz=0x1000;
if (bsz>pos) bsz=pos;
fread(buf,bsz,1,fp1);
fwrite(buf,bsz,1,fp2);
pos-=bsz;fsz-=bsz;
}
fwrite(str,strlen(str),1,fp2);
while (fsz)
{
bsz=0x1000;
if (bsz>pos) bsz=pos;
fread(buf,bsz,1,fp1);
fwrite(buf,bsz,1,fp2);
fsz-=bsz;
}
fflush(fp2);
fclose(fp2);
fclose(fp1);
2. Тоже - только с памятью.
int bsz,fsz;
char *buf;
// позиция для вставки
int pos=0x100; // к примеру
// строка для вставки
char *str="<a href>";
fp1=fopen("1.html","rb");
fp1=fopen("2.html","wb");
fseek(fp1,0,SEEK_END);
fsz=ftell(fp1)-pos;
fseek(fp1,0,SEEK_SET);
buf=realloc(NULL,fsz);
fread(buf,fsz,1,fp1);
fclose(fp1);
buf=realloc(buf,fsz+strlen(str));
memmove(buf+pos+strlen(str),buf+pos,fsz-pos);
memcpy(buf+pos,str,strlen(str));
fwrite(buf,fsz,1,fp2);
free(buf);
fflush(fp2);
fclose(fp2);
А использовать CFile, fwrite или WriteFile - это уже до лампочки. Хоть работай с диском через 13 прерывание.
А что дальше?
Нету, понимаешь ли такой вещи как аппаратная вставка или удаление блоков памяти - ни на уровне ОЗУ ни на уровне харда. Все это приходится делать руками. В памяти, либо на диске.
Вот в этом то и весь вопрос был. К тому же идея о ведении дополнительного файла уже высказывалась на этой теме.