Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/180: Рейтинг темы: голосов - 180, средняя оценка - 4.71
3 / 3 / 2
Регистрация: 14.05.2011
Сообщений: 55
1

Поиск и замена текста в файле

29.06.2011, 20:01. Показов 36324. Ответов 29
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день. Хочу попробовать написать программу, которая будет выполнять поиск и замену заданного текста в файле.
Подскажите, пожалуйста, в какую сторону искать?

Думал сделать так с последующим выполнением действий :
1. Ввод названия\пути файла.
2. Ввод искомого слова\строки.
3. Ввод того, на что заменить.

Конкретные вопросы:
1. Как осуществить поиск строки?
2. Как осуществить замену?

Делать буду в обычном C.

Заранее благодарю
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.06.2011, 20:01
Ответы с готовыми решениями:

Поиск и замена текста в файле
Добрый день помогите написать программу для поиска и замены текста в файле. файл находиться по...

Поиск и замена текста в файле
Имеется, допустим, файлик в кодировке 1251: tyutuyt бухгалтера лросодло клиентов апорпвоыпоп...

Поиск и замена текста в REG-файле
Здравствуйте, помогите пожалуйста написать скрипт имеется файл C:\dir\1.reg нужно в нем найти...

Поиск текста в файле и замена его на новый
1. Есть файл, в нем описаны замены аа -> bb ссс -> jjj мама -> дядя 2. Есть исходный файл, в...

29
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
29.06.2011, 20:09 2
Цитата Сообщение от N1K003 Посмотреть сообщение
1. Как осуществить поиск строки?
http://www.cplusplus.com/refer... ng/strstr/
или разбейте текст и искомый ткст на токены и сравнивайте
1
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
29.06.2011, 20:12 3
Цитата Сообщение от N1K003 Посмотреть сообщение
Как осуществить поиск строки?
Алгоритмов много. Можно использовать полный перебор, а можно воспользоваться приличными алгоритма вроде Кнута-Морриса-Пратта.
Цитата Сообщение от N1K003 Посмотреть сообщение
Как осуществить замену?
Читать файл в память, работать с памятью и сбрасывать в файл, осуществляя полную перезапись.
1
3 / 3 / 2
Регистрация: 14.05.2011
Сообщений: 55
30.06.2011, 23:57  [ТС] 4
Попробовал, как посоветовал Maxwe11. Не работает - закрывается на моменте записи в файл.
Не мог бы кто-то проверить и подсказать?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>
#include <string.h>
#include <iostream>
 
using namespace std;
 
int main ()
{
    char stf[255], rtf[255], fpath[255], str[15000], * c; /* stf - что ищем; rtf - на что меняем; fpath - путь к файлу; str - для поиска в строке*/
    FILE * file; //файл
    int i=0;
    str[0]='\0';
 
    cout << "Enter file location: ";
    gets(fpath);
 
    file = fopen(fpath, "r+");
    
    while( file == NULL )
    {
        cout << endl << "Hanface!" << endl << "Enter exist file location: ";
        gets(fpath);
        file = fopen(fpath, "r+");
    }
 
    cout << "Enter text to find: "; 
    gets(stf);
    cout << "Enter text to replace: ";
    gets(rtf);
 
    while (!feof(file))
    {
        fgets(str, 15000, file);
        c = strstr (str, stf);
        strcpy(c, rtf);
        fputs(str, file);
    }
 
    fclose(file);
    return 0;
}
Заранее спасибо.
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
01.07.2011, 02:21 5
Лучший ответ Сообщение было отмечено как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>
#include <string.h>
 /* stf - что ищем; rtf - на что меняем; fpath - путь к файлу; str - стока текста*/
int main ()
{
    char file_path[40] = { 0 }, stf[255] = { 0 }, rtf[255] = { 0 }, str[255] = { 0 };
    FILE* file = NULL;
 
    do
    {
    printf("Enter file path: ");
    fgets(file_path, 40, stdin);
    file_path[strlen(file_path) - 1] = '\0';
    file = fopen(file_path, "r+");
    }
    while(file == NULL);
 
    printf("Enter text to find: ");
    fgets(stf, 255, stdin);
    stf[strlen(stf) - 1] = '\0';
    printf("Enter text to replace: ");
    fgets(rtf, 255, stdin);
    rtf[strlen(rtf) - 1] = '\0';
 
    while(fgets(str, 255, file) != NULL)
    {
    char* tmp_ptr = strstr(str, stf);
    while(tmp_ptr != NULL)
    {
        char tmp_str[255];
        strcpy(tmp_str, tmp_ptr + strlen(stf));
        strcpy(str + strlen(str) - strlen(tmp_ptr), rtf);
        strcat(str, tmp_str);
        tmp_ptr = strstr(str, stf);
    }
    printf("%s", str);
    }
    fclose(file);
    getchar();
    return 0;
}
Добавлено через 2 минуты
результат вывожу на консоль, перезапись файла сам сделаешь
4
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 23
20.03.2013, 21:41 6
Jupiter, пытаюсь написать программу. Суть такая. Есть форма для заполнения. 6 EditControl и 1 ComboBox. создал кнопку для записи в файл этих данных. Но в файл заносится например вместо вводимой фамилии Иванов вот это- 0034E2F0.и так со всеми буквами. латинские, русские. цифры отображаются как надо. это проблема раз. А вторая проблема такова. Есть так же кнопка Поиск. Так вот, помогите как организовать этот поиск по этому же файлу. В первый EditControl вводится фамилия нажимаем кнопку Поиск и в другие EditControlы забиваются данные совпадающие в базе с этой фамилией, т.е. имя, отчество, и в моем случае спектакль в котором играет человек(это в ComboBox должно быть) и дальше сколько билетов было на этот спектакль. В общем прощу помощи. заранее спасибо.
0
3 / 3 / 0
Регистрация: 02.05.2013
Сообщений: 40
22.05.2013, 11:56 7
Кто может подсказать:
Цитата Сообщение от Jupiter Посмотреть сообщение
file_path[strlen(file_path) - 1] = '\0';
Цитата Сообщение от Jupiter Посмотреть сообщение
stf[strlen(stf) - 1] = '\0';
Цитата Сообщение от Jupiter Посмотреть сообщение
rtf[strlen(rtf) - 1] = '\0';
для чего это предназначено?
strlen - возвращает длину stf, отнимаем -1 (получается удаляем символ конца строки?) и потом зачем то приравниваем к '\0' мы же таким образом вообще стираем все, но она работает... Тогда что тогда она делает скажите пожалуйста. Заранее спасибо.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.05.2013, 12:13 8
Цитата Сообщение от Cmehotron Посмотреть сообщение
Кто может подсказать:
для чего это предназначено?
strlen - возвращает длину stf, отнимаем -1 (получается удаляем символ конца строки?) и потом зачем то приравниваем к '\0' мы же таким образом вообще стираем все, но она работает... Тогда что тогда она делает скажите пожалуйста. Заранее спасибо.
fgets() сохраняет при чтении '\n', после которого помещает '\0'. Вот '\n' и заменяется на '\0', чтобы не мешал.
2
3 / 3 / 0
Регистрация: 02.05.2013
Сообщений: 40
22.05.2013, 14:31 9
А если использовать вместо
Цитата Сообщение от Jupiter Посмотреть сообщение
fgets(stf, 255, stdin);
C++
1
2
3
  char stf[255] = { 0 }
cout<<"stf = ";
cin>>stf;
нужно будет дописать эту конструкцию или есть простые варианты указания имени файла?
0
Антикодер
1804 / 869 / 48
Регистрация: 15.09.2012
Сообщений: 3,081
22.05.2013, 14:46 10
раз уж подняли тему, то в boost есть специальные методы для замены
пример моего кода(типа проверка на float, если не float заменить на float)
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <boost/regex.hpp>
....
 
string format("$1.$2");
    string res;
    regex xRegEx("^([0-9]{1,10})\\.?([0-9]{0,10})"), xRegExRep("([0-9]{1,10})\\.?([0-9]{0,10})");
    smatch xResults;
    if (regex_match(currentString, xResults, xRegEx)) return;
    string resMatch1(xResults[1].first, xResults[1].second), resMatch2(xResults[2].first, xResults[2].second);
   if (isdigit((char)resMatch1.c_str()) && ( resMatch2 == "" || isdigit((char)resMatch2.c_str())))
   {
        string str = regex_replace(currentString, xRegExRep, format);
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.05.2013, 14:52 11
Цитата Сообщение от Cmehotron Посмотреть сообщение
нужно будет дописать эту конструкцию
В смысле '\0' дописывать? Здесь нет. cin >> символ новой строки ('\n') не читает в массив, только '\0' добавляет. Но cin >> считывает до пробельного символа (считает слово), в отличие от fgets(), которая читает строку.
0
3 / 3 / 0
Регистрация: 02.05.2013
Сообщений: 40
22.05.2013, 15:15 12
Ага почти все понял кроме главного почему хоть и стоит там '=' он добавляет а не записывает заново всю переменную? Это особенности чего strlen?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.05.2013, 15:30 13
Цитата Сообщение от Cmehotron Посмотреть сообщение
хоть и стоит там '='
Про это речь?
C++
1
stf[strlen(stf) - 1] = '\0';
В массив stf, по индексу, равному strlen(stf) - 1, помещается '\0'. Это присвоение по индексу. Если при объявлении массива написать:
C++
1
char stf[255] = "\0";
то весь массив заполнится '\0'. Это инициализация.
1
3 / 3 / 0
Регистрация: 02.05.2013
Сообщений: 40
22.05.2013, 15:35 14
Ааааа, голова моя содовая, все разобрался! Я просто не понял что это вообще идет как массив и рассматривал ка обычную переменную, впредь буду внимательнее спасибо большое за помощь!
0
0 / 0 / 0
Регистрация: 11.12.2013
Сообщений: 26
23.03.2014, 19:21 15
N1K003, ваш код почему-то не работает, ссылаясь на то, что вместо fopen нужно fopen_s и такая же байда с strcpy

Добавлено через 41 секунду
N1K003, пардон, не ваш)

Добавлено через 31 секунду
Jupiter, а ваш код
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.03.2014, 19:25 16
Цитата Сообщение от EvgeZ Посмотреть сообщение
ваш код почему-то не работает, ссылаясь на то, что вместо fopen нужно fopen_s и такая же байда с strcpy
Паранойя Microsoft.
https://www.cyberforum.ru/post5488517.html
1
0 / 0 / 0
Регистрация: 11.12.2013
Сообщений: 26
23.03.2014, 19:54 17
Параноя?)

Добавлено через 19 минут
А как теперь измененную строку записать в файл?
пишу так
fwrite(&file, sizeof(char), 1000, str);
но пишет, что
error C2664: fwrite: невозможно преобразовать параметр 4 из "char [255]" в "FILE *"
IntelliSense: аргумент типа "char *" несовместим с параметром типа "FILE *"
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.03.2014, 19:56 18
http://www.cplusplus.com/refer... ?kw=fwrite
1
0 / 0 / 0
Регистрация: 11.12.2013
Сообщений: 26
23.03.2014, 20:14 19
И последний вопрос
как сделать так, чтобы в файл печаталась только измененная строка, т.е. изначальной не было, а вместо нее - измененная?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.03.2014, 20:18 20
Кода не вижу.
0
23.03.2014, 20:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.03.2014, 20:18
Помогаю со студенческими работами здесь

Поиск и замена текста в файле, в содержимом которого имеются специальные символы
Поискал в инете, толкового ответа не нашел. Суть вопроса... Есть текстовый файл. При запуске...

Поиск значений в файле и замена соответствующих в другом файле
Сильно не пинайте, я новичок. Существует 2 файла. В первом (1.txt) текст: 123=qwerty...

Поиск части текста в диапазоне ячеек и замена этого текста на найденное соответсвие
Имеется список адресов, которым нужно присвоить в отдельной ячейке название микрорайона. Есть...

Замена текста в файле
Помогите пожалуйста. Есть файл &quot;mytext.txt&quot; с таким содержанием: &lt;div class=&quot;one&quot;&gt;текст&lt;/div&gt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru