Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Изменение содержимого файла  (Прочитано 16559 раз)
0 Пользователей и 1 Гость смотрят эту тему.
cishka
Гость
« : 08-01-2006 03:47 » 

Наверно уже избитый ворос! но все же несмог найти либо нашел но не понял! Жаль

Не получается изменить содержимое файла незатирая его!

в документации нашел режими открытия файлов fopen! ни один из этих режимов не позволил открыть файл записать в него данные, а потом еще раз открыть его и изменить переместив указатель на середину и писать с середины.

как правильно это сделать ?
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 08-01-2006 11:53 » 

Т.е., если я правильно понял, ты хочешь вставить данные в середину и чтоб при этом существующиеся данные раздвинулись?
Для этого надо сохранить перемещаемый блок, записать вставляемый блок и, после него, сохраненные даные.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
cishka
Гость
« Ответ #2 : 08-01-2006 12:16 » 

Нет, не совсем я хочу просто изменить содержимое файла таким образом: например файл сожержит:

xxxxyyyyzzzccccdddd а мне нужно вместо zzz перезаписать 000.

Можно конечно его просто прочитать изменит и потом заново записать. Но меня интересует каким методом можно сделать так что бы fopen его открывал на чтение/запись и при этом не уничтожал существующий файл и не дописывал а открывал так что бы я мог просто сделать fseek изменить его содержимое в нужном мне месте.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 08-01-2006 13:36 » 

Попробуй заместо "w" поставить "a". У меня в справочнике написано
Цитата
w - сократить сушествуюший файл до нулевой длины или создать текстовый файл для записи.
a - добавить, что означает: открыть или создать текстовый файл для записи данных в конец файла
Я использую виндовс функцию CreateFile. С ней чуть больше возни в настройках. Зато намного больше возможностей.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
cishka
Гость
« Ответ #4 : 08-01-2006 14:41 » 

я пробовал использовать "a" но тогда происходит просто дозапись в этот файл, и с помощью fseek у меня не получилось! Сейчас попробую с CreateFile, еще не пробовал. но все же хочется это сделать стандартными средствами си, что бы в будущем можно было применить это например под unix.

вот например я делаю так:

Код:
int main(int argc, char* argv[])
{
FILE *fp;
char *filename="c:\\1111.xxx";
int x=0;
int y=65535;
if (!FileExists(filename))
    {
        fp=fopen(filename,"w+");
        for (int i=0;i<255;i++) fwrite(&x,sizeof(x),1,fp);
    }
   else
    {
        fp=fopen(filename,"a+");
        fseek(fp,sizeof(x)*128,0);
        fwrite(&y,sizeof(y),1,fp);
    }
    fclose(fp);

return 0;
}


если я использую "ab+" то происходит просто дозапись в файл, если он уже существует а если использовать wb+ то происходит просто уничтожение содержимого файла если он существует.

Должно же быть по идее решение с использованием стандартных библиотек ?
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 08-01-2006 14:58 » 

"r+" - откроет для чтения и записи.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
cishka
Гость
« Ответ #6 : 08-01-2006 15:30 » 

да получилось!!! "r+", "rb+" большое спасибо!
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 11-01-2006 11:15 » 

Можно воспользоваться mmap (memory mapped files)
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
cishka
Гость
« Ответ #8 : 04-02-2006 21:26 » 

продолжаю разбираться с файлами Улыбаюсь))
пытаюсь писать программы что бы пользоваться сразу тем чему научился... вот возникла другая проблема

на сокетах написал простенькую считалку трафика, из потока работающего параллельно основной части программы, я получаю данные, и вот тут я задумался........вернее застрял.
я хочу сохранить данные так что бы я в случае чего мог легко построить например график или показать их за текущий месяц.

Данные можно сохранять с какой то периодичностью, например раз в минут или раз в 5 минут, и при этом можно сделать так что бы данные например сохранялись только за весь день суммарно, или каждый раз отдельно, так что в итоге можно вывести подробную статистику за весь день.
   Я думаю решить задачу так: раз в 5 минут сохранять данные, добавляя новую запись, ввиде структуры { число/месяц/год, Inet_in,Inet_Out,Local_in,Locla_out }. и уже дальше что бы отдельный модуль занимался анализом этого файла строил графики и т.д.
  я так понимаю, это будет работать достаточно эффективно пока этот файл не разрастется до слишком больших размеров, ведь мне его придется его просматривать от начала и до конца и складывать значения которые я туда пишу каждые 5 минут.
  Можно привязать данные к конкретной дате, те постоянно делать операцию:
     1) прочитать данные за такое то число
     2) если день еще не сменился добавить к этому числу информацию за последние 5 минут и сохранить её.

Как лучше организовать структуру файла ? мне не хотелось бы пользоваться базой данных. Не изобретаю ли я велосипед ? Я так понимаю сбор данных наверно довольно распространенная задача, может кто подскажет, где бы можно было подхватить идеи по сохранению большим объемов информации, хочется предусмотреть возможность сохранения не только локального и интернет трафика но возможно еще какого ни будь  например задать правила  для местных и не местных сетей что бы считать еще и их, и хочется их потом достаточно быстро вытащить информацию за указанный мной период?

Еще вопрос, непопробывал пока еще memory mapped files, я так понимаю они могут отчасти решить проблему скорости если лог файл будет большим ?
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 04-02-2006 22:51 » 

Цитата
Как лучше организовать структуру файла ? мне не хотелось бы пользоваться базой данных. Не изобретаю ли я велосипед ?
Почему бы и не в базе? Как раз сохранение в файле, с последующим написание ф-ий поиска и т.п., и будет тем самым велосипедом.
Работать с БД можно посредством SQL-запросов. Это удобно.

Цитата
на сокетах написал простенькую считалку трафика
Сырой сокет не гарантирует захват всего трафика в сети. Можно реализовать прямой съем данных с хостов посредством snmp. Правда, при этом нельзя будет детализировать "куда и откуда" - будет ясно только "кто". Т.е. просто активность сетевых интерфейсов на хостах.
Внешний трафик логичнее считать на шлюзе.

Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zubr
Гость
« Ответ #10 : 05-02-2006 14:28 » 

cishka, создай файл из 2-х частей - заголовка и данных. В заголовке размести информацию для поиска нужного значения (индекс обозначающий положение в файле нужной структуры), а также последнее просуммированное значение трафика. Остальное, надеюсь понятно.
Записан
cishka
Гость
« Ответ #11 : 05-02-2006 22:45 » 

     Пока что я сделал так: создал файл заполненый нулями, расчитал количество дней в году, и вычиляю текущий день с начала года, ипользую это значение как индекс указывающий на структуру фикс размера.

    zubr!, спасибо! попробую сделать примерно таким же способом только сделаю 2 файла. а там посмотрим что получится из этого Улыбаюсь, еще нашел пару статеек по организации файловых систем тут видимо что то подобное выходит.

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

Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 07-02-2006 12:31 » new

В винде (в 2к и ХР - точно) штатно идет поддержка snmp, но она не ставится по дефолту - можно доставить.

По части сырых: дело не в мегагерцах, а в том, что когда придет много пакетов, по закону подлости, комп начинает заниматься какой-нибудь фигней. Буфер не резиновый и часть пакетов может пропасть.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines