Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с файлом

4.9K
11 марта 2005 года
CyberMan
55 / / 25.01.2005
Как переписать строку файла. Средства CFile позволяют считать символ или группу символов из файла или записать символ/символы в конкретное место файла причем символы которые уже имеются будут перезаписаны. А нужно просто добавить символ в конкретное место а остальные символы сдвинуть.
301
11 марта 2005 года
lord Kelvin
897 / / 08.11.2004
Цитата:
Originally posted by CyberMan
Как переписать строку файла. Средства CFile позволяют считать символ или группу символов из файла или записать символ/символы в конкретное место файла причем символы которые уже имеются будут перезаписаны. А нужно просто добавить символ в конкретное место а остальные символы сдвинуть.


Боюсь, что так тебе и придется сделать - сдвинуть и вставить.

4.9K
14 марта 2005 года
CyberMan
55 / / 25.01.2005
Цитата:
Originally posted by lord Kelvin

Боюсь, что так тебе и придется сделать - сдвинуть и вставить.


А как лучше сделать есть какие нить алгоритмы. У меня конечно есть идея объявить переменную CString и считаь оставшуюся часть файла в нее. Но тогда возникает вопрос сколько в эту переменную можно записать. Мне нужно файлы редактировать большого размера, а изменить допустим нужно в начале. Тогда придется весь оставшийся файл(а это сотни и тысячи символов)считать в переменную???

3
14 марта 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by CyberMan

А как лучше сделать есть какие нить алгоритмы. У меня конечно есть идея объявить переменную CString и считаь оставшуюся часть файла в нее. Но тогда возникает вопрос сколько в эту переменную можно записать. Мне нужно файлы редактировать большого размера, а изменить допустим нужно в начале. Тогда придется весь оставшийся файл(а это сотни и тысячи символов)считать в переменную???



Не читай весь файл в память!
Создай др. файл и копируй инф. туда.

301
14 марта 2005 года
lord Kelvin
897 / / 08.11.2004
Цитата:
Originally posted by CyberMan

А как лучше сделать есть какие нить алгоритмы. У меня конечно есть идея объявить переменную CString и считаь оставшуюся часть файла в нее. Но тогда возникает вопрос сколько в эту переменную можно записать. Мне нужно файлы редактировать большого размера, а изменить допустим нужно в начале. Тогда придется весь оставшийся файл(а это сотни и тысячи символов)считать в переменную???


Можешь хранить в файле информацию блоками. Скажем каждый блок содержит 1 килобайт данных, смещение следующего и предыдущего блоков, количество данных (если блок не полон). Плюс в начале файла смещение первого блока. Писать сложнее, зато работать (при необходимости часто перемешивать=) ) будет быстрее.

425
14 марта 2005 года
sq_deep
498 / / 18.02.2005
Если файл большой, но "не очень", то надо закачать его в буфер и переписать в конце работы или делать это время от времени. Ну, а если он действительно большой, то надо, конечно, придумать что-то в духе того, что предлагает lord Kelvin. Например, хранить изменения в журнале, а после того, как размер журнала станет достаточно большим, показать пользователю wait cursor, переписать файл и убить журнал. Ну, а в начале работы анализировать журнал на случай аварийного завершения предыдущей сессии.

Для "действительно большого" файла простого решения быть не может. Поищите на codeproject.com или в другом подобном месте. Думаю, найдёте несколько решений.
8.9K
16 марта 2005 года
Siro
8 / / 24.11.2004
Цитата:
Originally posted by lord Kelvin

Можешь хранить в файле информацию блоками.


Если хранить в файле информацию о блоках то при просмотре другой программой скажем блокнот то эта информация будет видна. А проблема состоит в том что моя программа изменяет htm файлы(добавляет новые теги и удаляет старые) поэтому, как сами понимаете создавать дополнительные структуры в файле не желательно. Кстати методом научного тыка выяснилось что CString больших файлов не грузит но если объявить динамическую переменную типа char то можно загрузить файл размером 2^16(я сам не грузил но грузил файлы 30 кб(нормально работает) и 100 кб(не грузит вызывает ошибку в адресе)).
Наверно придется поступить как написал Green.

425
16 марта 2005 года
sq_deep
498 / / 18.02.2005
Цитата:
Originally posted by Siro
...моя программа изменяет htm файлы...

Html файлы не бывают «действительно большими». Пусть даже его размер будет 50Mb, его надо грузить полностью в память, обрабатывать и переписывать в конце работы. Надеюсь, что на машине, на которой собираются работать с «большими» файлами, оперативная память тоже «большая» ;)

4.9K
18 марта 2005 года
CyberMan
55 / / 25.01.2005
Цитата:
Originally posted by sq_deep
Html файлы не бывают «действительно большими». Пусть даже его размер будет 50Mb, его надо грузить полностью в память, обрабатывать и переписывать в конце работы. Надеюсь, что на машине, на которой собираются работать с «большими» файлами, оперативная память тоже «большая» ;)


А какая разница. Проблема в добавлении символа в файл между двумя, методы CMemFile этого не позволяют. Я уже поступил как написал Green все нормально работает.

425
21 марта 2005 года
sq_deep
498 / / 18.02.2005
Цитата:
Originally posted by CyberMan

А какая разница.

Разница только в том, что в памяти переписывание делается в тысячи раз быстрее, чем на диске. Однако, это вы почувствуете, конечно, только если файл хоть сколько-нибудь можно назвать "большим".

Если же файл занимает 50kb, то я бы не стал называть его большим и затевать всю эту дискуссию. Можете делать как хотите, всё равно работать будет мгновенно по сравнению со скоростью вколачивания с клавиатуры.

4.9K
21 марта 2005 года
CyberMan
55 / / 25.01.2005
Цитата:
Originally posted by sq_deep
Разница только в том, что в памяти переписывание делается в тысячи раз быстрее, чем на диске. Однако, это вы почувствуете, конечно, только если файл хоть сколько-нибудь можно назвать "большим".

Если же файл занимает 50kb, то я бы не стал называть его большим и затевать всю эту дискуссию. Можете делать как хотите, всё равно работать будет мгновенно по сравнению со скоростью вколачивания с клавиатуры.

Да вопрос то не в скорости а в алгоритме переписывания файла!!! Методы CMemFile (если ты конечно имеешь в виду именно этот класс для работой с файлом в памяти) не позволяют вставлять символ между двумя а только замещать (write). Вот и вопрос: как сместить оставшуюся часть файла для вставки символа.

425
21 марта 2005 года
sq_deep
498 / / 18.02.2005
Цитата:
Originally posted by CyberMan
Да вопрос то не в скорости а в алгоритме переписывания файла!!! Методы CMemFile (если ты конечно имеешь в виду именно этот класс для работой с файлом в памяти) не позволяют вставлять символ между двумя а только замещать (write). Вот и вопрос: как сместить оставшуюся часть файла для вставки символа.

Работает так, как уже сделал? Если да, то и обсуждать тут больше нечего. Если не работает, с удовольствием помогу чем могу.

[COLOR=silver]Моё последнее сообщение было вызвано тем, что я увидел вопрос "какая разница?". Поскольку не люблю оставлять безответные вопросы, написал. Только и всего.[/COLOR]

Жизнь продолжается.

279
21 марта 2005 года
bave
456 / / 07.03.2004
Нафиг этот CFile. Есть fread и fwrite.
4.9K
25 марта 2005 года
CyberMan
55 / / 25.01.2005
Цитата:
Originally posted by bave
Нафиг этот CFile. Есть fread и fwrite.


А дальше???

487
26 марта 2005 года
ddnh_bc
301 / / 16.09.2003
Цитата:
Originally posted by CyberMan
А дальше???



А что дальше?
Нету, понимаешь ли такой вещи как аппаратная вставка или удаление блоков памяти - ни на уровне ОЗУ ни на уровне харда. Все это приходится делать руками. В памяти, либо на диске.

Вот тебе два варианта:

1. File to File.

Код:
FILE *fp1,*fp2;
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. Тоже - только с памятью.

Код:
FILE *fp1,*fp2;
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 прерывание.
4.9K
28 марта 2005 года
CyberMan
55 / / 25.01.2005
Цитата:
Originally posted by ddnh_bc
А что дальше?
Нету, понимаешь ли такой вещи как аппаратная вставка или удаление блоков памяти - ни на уровне ОЗУ ни на уровне харда. Все это приходится делать руками. В памяти, либо на диске.


Вот в этом то и весь вопрос был. К тому же идея о ведении дополнительного файла уже высказывалась на этой теме.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог