Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 121, средняя оценка - 4.69
N1K003
3 / 3 / 2
Регистрация: 14.05.2011
Сообщений: 55
#1

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

29.06.2011, 20:01. Просмотров 17430. Ответов 26
Метки нет (Все метки)

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

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

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

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

Заранее благодарю
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.06.2011, 20:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Поиск и замена текста в файле (C++):

Замена текста в файле - C++
У меня есть программа которая записывает написанный в консоли текст в файл. Но мне нужно заменить некоторое количество текста начиная с...

Поиск и замена символов в файле - C++
Добрый вечер(день)! Пытаюсь разобраться с задачей, есть файл в нем нужно найти слово и заменить на другое,замена может быть разной длины и...

Поиск, замена, удаление в текстовом файле - C++
Добрый день. У меня есть текстовый файл с информацией(типа: № Имя Фамилия). Как можно осуществить поиск по номеру записи и вывод ее в...

Поиск, считывание и замена символов в файле [C++] - C++
И снова здраствуйте! Нужно, чтобы программа находила в файле число от 0 до 5120, а после считывала оттуда данные после точки, присваивала...

Поиск и замена слов в файле txt - C++
Как заменить и найти слова в файле txt на С++. То есть есть файл вот такой структуры AAA БББ BBB 111 222 ыыы

Поиск и замена поля структуры в файле - C++
Всем привет, возникла проблема с заменой определённой строки в файле. Задание состоит в том, что бы найти нужное поле в файле структуры и...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
29.06.2011, 20:09 #2
Цитата Сообщение от N1K003 Посмотреть сообщение
1. Как осуществить поиск строки?
http://www.cplusplus.com/reference/c...string/strstr/
или разбейте текст и искомый ткст на токены и сравнивайте
fasked
Эксперт С++
4935 / 2515 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
29.06.2011, 20:12 #3
Цитата Сообщение от N1K003 Посмотреть сообщение
Как осуществить поиск строки?
Алгоритмов много. Можно использовать полный перебор, а можно воспользоваться приличными алгоритма вроде Кнута-Морриса-Пратта.
Цитата Сообщение от N1K003 Посмотреть сообщение
Как осуществить замену?
Читать файл в память, работать с памятью и сбрасывать в файл, осуществляя полную перезапись.
N1K003
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;
}
Заранее спасибо.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
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 минуты
результат вывожу на консоль, перезапись файла сам сделаешь
Aleksey68
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 23
20.03.2013, 21:41 #6
Jupiter, пытаюсь написать программу. Суть такая. Есть форма для заполнения. 6 EditControl и 1 ComboBox. создал кнопку для записи в файл этих данных. Но в файл заносится например вместо вводимой фамилии Иванов вот это- 0034E2F0.и так со всеми буквами. латинские, русские. цифры отображаются как надо. это проблема раз. А вторая проблема такова. Есть так же кнопка Поиск. Так вот, помогите как организовать этот поиск по этому же файлу. В первый EditControl вводится фамилия нажимаем кнопку Поиск и в другие EditControlы забиваются данные совпадающие в базе с этой фамилией, т.е. имя, отчество, и в моем случае спектакль в котором играет человек(это в ComboBox должно быть) и дальше сколько билетов было на этот спектакль. В общем прощу помощи. заранее спасибо.
Cmehotron
3 / 3 / 0
Регистрация: 02.05.2013
Сообщений: 33
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' мы же таким образом вообще стираем все, но она работает... Тогда что тогда она делает скажите пожалуйста. Заранее спасибо.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.05.2013, 12:13 #8
Цитата Сообщение от Cmehotron Посмотреть сообщение
Кто может подсказать:
для чего это предназначено?
strlen - возвращает длину stf, отнимаем -1 (получается удаляем символ конца строки?) и потом зачем то приравниваем к '\0' мы же таким образом вообще стираем все, но она работает... Тогда что тогда она делает скажите пожалуйста. Заранее спасибо.
fgets() сохраняет при чтении '\n', после которого помещает '\0'. Вот '\n' и заменяется на '\0', чтобы не мешал.
Cmehotron
3 / 3 / 0
Регистрация: 02.05.2013
Сообщений: 33
22.05.2013, 14:31 #9
А если использовать вместо
Цитата Сообщение от Jupiter Посмотреть сообщение
fgets(stf, 255, stdin);
C++
1
2
3
  char stf[255] = { 0 }
cout<<"stf = ";
cin>>stf;
нужно будет дописать эту конструкцию или есть простые варианты указания имени файла?
XRuZzz
Антикодер
675 / 576 / 28
Регистрация: 15.09.2012
Сообщений: 2,523
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);
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.05.2013, 14:52 #11
Цитата Сообщение от Cmehotron Посмотреть сообщение
нужно будет дописать эту конструкцию
В смысле '\0' дописывать? Здесь нет. cin >> символ новой строки ('\n') не читает в массив, только '\0' добавляет. Но cin >> считывает до пробельного символа (считает слово), в отличие от fgets(), которая читает строку.
Cmehotron
3 / 3 / 0
Регистрация: 02.05.2013
Сообщений: 33
22.05.2013, 15:15 #12
Ага почти все понял кроме главного почему хоть и стоит там '=' он добавляет а не записывает заново всю переменную? Это особенности чего strlen?
alsav22
5417 / 4813 / 442
Регистрация: 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'. Это инициализация.
Cmehotron
3 / 3 / 0
Регистрация: 02.05.2013
Сообщений: 33
22.05.2013, 15:35 #14
Ааааа, голова моя содовая, все разобрался! Я просто не понял что это вообще идет как массив и рассматривал ка обычную переменную, впредь буду внимательнее спасибо большое за помощь!
EvgeZ
0 / 0 / 0
Регистрация: 11.12.2013
Сообщений: 26
23.03.2014, 19:21 #15
N1K003, ваш код почему-то не работает, ссылаясь на то, что вместо fopen нужно fopen_s и такая же байда с strcpy

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

Добавлено через 31 секунду
Jupiter, а ваш код
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.03.2014, 19:21
Привет! Вот еще темы с ответами:

Поиск слова в файле и его замена - C++
Не могу никак решить одну проблему. Мне осталось в 3 классе написать следующее: - Программа просит ввести строку, которую нужно заменить....

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

Поиск и замена текста - C++
Всем добрый день. Интересует как можно создать поиск файла по названию, например test.mln (Текстовой файл), и заменить содержание этого...

Ошибка. Поиск и замена слова в текстовом файле - C++
Задача: найти и заменить одно слово на другое в текстовом файле. Я сделал вот так, но она работает не совсем правильно - теряет символ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.03.2014, 19:21
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru