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

Ваш аккаунт

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

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

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

записать в файл

2.0K
08 апреля 2003 года
v0id
31 / / 08.04.2003
Блин, стрёмный вопрос, но всё же...
Как мне найти строчку в текст. файле, и заменить на свою. Люди подскажите plzz как попроще осуществить..
451
08 апреля 2003 года
Gerret
51 / / 20.05.2000
Цитата:
Originally posted by v0id
Блин, стрёмный вопрос, но всё же...
Как мне найти строчку в текст. файле, и заменить на свою. Люди подскажите plzz как попроще осуществить..



Ничего стремного... просто по строчно читаешь файл, пишешь считаную строку в массив char * и функцией strstr() ищешь в ней то что надо, и если находишь нужную, заменяешь.
А вообще посмотри в Help'e функции по работе со строками, а то я на память не все помню, боюсь соврать :-)

989
08 апреля 2003 года
Vlad232ua
182 / / 02.04.2003
Цитата:
Originally posted by v0id
Блин, стрёмный вопрос, но всё же...
Как мне найти строчку в текст. файле, и заменить на свою. Люди подскажите plzz как попроще осуществить..


По идее, если просто, то должно быть, что-то в этом духе
FILE *Result;
char string[256],Find_line[14] = {“Искомый текст”},My_Line[16]={“А это я вставлю”};
int line_number = 0;

if ((Result = fopen("C:\\My_folder\\My_file.txt","rt")) == NULL)
{ MessageBox(NULL,”Ошибка открытия файла”,”ERROR”,MB_ICONERROR); return; }

for(;fgets(string,255,Result) !=NULL; line_number++)
{ if(strstr(string,Find_line)!=NULL)
{ if(fwrite(My_line,16,1,Result)==NULL)
{ MessageBox(NULL,”Ошибка записии файла”,”ERROR”,MB_ICONERROR); return; }
)
}
Но это так от балды - побыстрому, файл еще закрыть надо, да и line_number тут ненужен ... В общем не пробовал я этот кусок

362
09 апреля 2003 года
_kolyan
339 / / 03.12.2002
Цитата:
Originally posted by Vlad232ua

Но это так от балды - побыстрому, файл еще закрыть надо, да и line_number тут ненужен ... В общем не пробовал я этот кусок



И не пробуй - испортишь файл :-)
Потому-что “А это я вставлю” длинее чем “Искомый текст” и при таком простом переписывании куска записи затрется часть теста следующего за “Искомый текст”, это первое.
Второе: после fgets указатель чтения-записи файла уже на следующей строке, и “А это я вставлю” запишется дальше чем нужно (опять-же поверх текста следующей строки)

989
09 апреля 2003 года
Vlad232ua
182 / / 02.04.2003
Цитата:
Originally posted by _kolyan


И не пробуй - испортишь файл :-)


Да говорю-ж, от балды - как направление (я ведь и файл только на чтение открыл). А вот причем тут затрется, непонял, файл то текстовый, символов перевода строки там, что нет. Человеку ведь принцип нужен был (и как я понял функции), а дальше он и сам справится.

272
12 апреля 2003 года
vladsoft
512 / / 20.08.2000
Цитата:
Originally posted by Vlad232ua

Да говорю-ж, от балды - как направление (я ведь и файл только на чтение открыл). А вот причем тут затрется, непонял, файл то текстовый, символов перевода строки там, что нет. Человеку ведь принцип нужен был (и как я понял функции), а дальше он и сам справится.



Живи проще!!!
Создавай какой либо tmp переписывай нужный файл в tmp , а потом изменяй все как тебе хочется!!!
А потом удаляй исходный файл, делай REname и все .
Или поменяй атрибут файла, и делай как ты первоначально делаешь....

А как менять атрибуты посмотри help или вручную с помощью винды или фара поменяй

2.0K
17 апреля 2003 года
v0id
31 / / 08.04.2003
Цитата:
Originally posted by Gerret


Ничего стремного... просто по строчно читаешь файл, пишешь считаную строку в массив char * и функцией strstr() ищешь в ней то что надо, и если находишь нужную, заменяешь.
А вообще посмотри в Help'e функции по работе со строками, а то я на память не все помню, боюсь соврать :-)



Действительно кажется просто, а почему тогда вот это не работает:

char ch[256];
char My_line[8]="++++++++";
char Find_line[8]="--------";
FILE *f;
f=fopen("c:\\123","rw");
while(gets(ch))
{
if(strstr(ch,Find_line)!=NULL)
fwrite(My_line,8,1,f);
}
fclose(f);

362
17 апреля 2003 года
_kolyan
339 / / 03.12.2002
Цитата:
Originally posted by v0id


Действительно кажется просто, а почему тогда вот это не работает:

char ch[256];
char My_line[8]="++++++++";
char Find_line[8]="--------";
FILE *f;
f=fopen("c:\\123","rw");
while(gets(ch))
{
if(strstr(ch,Find_line)!=NULL)
fwrite(My_line,8,1,f);
}
fclose(f);



Да, собственно, о том что я уже говорил. После того, как ты сделал fgets указатель чтения-записи файла сместился на конец этой строки, и после этого ты делаешь fwrite и затираешь следующую строку, за искомой, либо вообще ничего не происходит, если файл кончился.
Нужно, как минимум, смещать указатель обратно на начало найденного куска, чтобы новая строка записалась повер старой.
Проблема остается, если строки разной длины.
Файл (как системный оьект) редактируется в режиме overwrite, а не в режиме insert, как в редакторе

так что не так все просто, как может показаться

2.0K
17 апреля 2003 года
v0id
31 / / 08.04.2003
Цитата:
Originally posted by _kolyan


[skip]

так что не так все просто, как может показаться



Может есть какие-нибудь мысли? Приведи пример, как сделал бы ты.:)

2.0K
17 апреля 2003 года
v0id
31 / / 08.04.2003
Или может есть у кого исходники, может урл. Что-нибудь типа работы с конфигами.
362
17 апреля 2003 года
_kolyan
339 / / 03.12.2002
Цитата:
Originally posted by v0id


Может есть какие-нибудь мысли? Приведи пример, как сделал бы ты.:)



Такой проблемы не вставало. Но мне нравится идея про переписывание файла. Для небольших файлов

2.0K
17 апреля 2003 года
v0id
31 / / 08.04.2003
Цитата:
Originally posted by _kolyan


Такой проблемы не вставало. Но мне нравится идея про переписывание файла. Для небольших файлов


Боюсь мне это не подходит.

3
18 апреля 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by v0id

Боюсь мне это не подходит.



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

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

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

2.0K
18 апреля 2003 года
v0id
31 / / 08.04.2003
Цитата:
Originally posted by Green


другого пути, как переписывать файл не существует


Ну ни может такого быть.

2.0K
18 апреля 2003 года
v0id
31 / / 08.04.2003
Цитата:
Originally posted by v0id

Тогда подскажите, как мне найти слово, если я буду файл считывать посимвольно.

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