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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 121, средняя оценка - 4.69
N1K003
3 / 3 / 2
Регистрация: 14.05.2011
Сообщений: 55
29.06.2011, 20:01     Поиск и замена текста в файле #1
Добрый день. Хочу попробовать написать программу, которая будет выполнять поиск и замену заданного текста в файле.
Подскажите, пожалуйста, в какую сторону искать?

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

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

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

Заранее благодарю
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 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
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 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
Каратель
Эксперт C++
6543 / 3963 / 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
 Аватар для Cmehotron
3 / 3 / 0
Регистрация: 02.05.2013
Сообщений: 27
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
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.05.2013, 12:13     Поиск и замена текста в файле #8
Цитата Сообщение от Cmehotron Посмотреть сообщение
Кто может подсказать:
для чего это предназначено?
strlen - возвращает длину stf, отнимаем -1 (получается удаляем символ конца строки?) и потом зачем то приравниваем к '\0' мы же таким образом вообще стираем все, но она работает... Тогда что тогда она делает скажите пожалуйста. Заранее спасибо.
fgets() сохраняет при чтении '\n', после которого помещает '\0'. Вот '\n' и заменяется на '\0', чтобы не мешал.
Cmehotron
 Аватар для Cmehotron
3 / 3 / 0
Регистрация: 02.05.2013
Сообщений: 27
22.05.2013, 14:31     Поиск и замена текста в файле #9
А если использовать вместо
Цитата Сообщение от Jupiter Посмотреть сообщение
fgets(stf, 255, stdin);
C++
1
2
3
  char stf[255] = { 0 }
cout<<"stf = ";
cin>>stf;
нужно будет дописать эту конструкцию или есть простые варианты указания имени файла?
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
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
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.05.2013, 14:52     Поиск и замена текста в файле #11
Цитата Сообщение от Cmehotron Посмотреть сообщение
нужно будет дописать эту конструкцию
В смысле '\0' дописывать? Здесь нет. cin >> символ новой строки ('\n') не читает в массив, только '\0' добавляет. Но cin >> считывает до пробельного символа (считает слово), в отличие от fgets(), которая читает строку.
Cmehotron
 Аватар для Cmehotron
3 / 3 / 0
Регистрация: 02.05.2013
Сообщений: 27
22.05.2013, 15:15     Поиск и замена текста в файле #12
Ага почти все понял кроме главного почему хоть и стоит там '=' он добавляет а не записывает заново всю переменную? Это особенности чего strlen?
alsav22
5282 / 4801 / 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
 Аватар для Cmehotron
3 / 3 / 0
Регистрация: 02.05.2013
Сообщений: 27
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, а ваш код
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.03.2014, 19:25     Поиск и замена текста в файле #16
Цитата Сообщение от EvgeZ Посмотреть сообщение
ваш код почему-то не работает, ссылаясь на то, что вместо fopen нужно fopen_s и такая же байда с strcpy
Паранойя Microsoft.
Ошибка в SCANF
EvgeZ
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 *"
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.03.2014, 19:56     Поиск и замена текста в файле #18
http://www.cplusplus.com/reference/c...ite/?kw=fwrite
EvgeZ
0 / 0 / 0
Регистрация: 11.12.2013
Сообщений: 26
23.03.2014, 20:14     Поиск и замена текста в файле #19
И последний вопрос
как сделать так, чтобы в файл печаталась только измененная строка, т.е. изначальной не было, а вместо нее - измененная?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.03.2014, 20:18     Поиск и замена текста в файле
Еще ссылки по теме:

C++ Поиск, замена, удаление в текстовом файле
Замена текста в файле C++
Поиск и замена поля структуры в файле C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.03.2014, 20:18     Поиск и замена текста в файле #20
Кода не вижу.
Yandex
Объявления
23.03.2014, 20:18     Поиск и замена текста в файле
Ответ Создать тему
Опции темы

Текущее время: 01:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru