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

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

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

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

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

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

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

Заранее благодарю
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.06.2011, 20:01
Ответы с готовыми решениями:

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

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

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

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

29
Каратель
Эксперт С++
6610 / 4029 / 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
Записей в блоге: 2
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
Каратель
Эксперт С++
6610 / 4029 / 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
5499 / 4894 / 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
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,084
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
5499 / 4894 / 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
5499 / 4894 / 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
5499 / 4894 / 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
5499 / 4894 / 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
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.03.2014, 20:18 20
Кода не вижу.
0
23.03.2014, 20:18
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
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
Ответ Создать тему
Блоги программистов
Подброка решений задач на Python
IT_Exp 06.01.2025
Целью данной подборки является предоставление возможности ознакомиться с различными задачами и их решениями на Python, что может быть полезно как для начинающих, так и для опытных программистов. . . .
С чего начать программировать микроконтроллер­­ы
raxper 06.01.2025
Введение в мир микроконтроллеров Микроконтроллеры стали неотъемлемой частью современного мира, окружая нас повсюду: от простых бытовых приборов до сложных промышленных систем. Эти маленькие. . .
Из чего собрать игровой компьютер
inter-admin 06.01.2025
Сборка игрового компьютера требует особого внимания к выбору комплектующих и их совместимости. Правильно собранный игровой ПК не только обеспечивает комфортный геймплей в современных играх, но и. . .
Обновление сайта www.historian.b­y
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
Модель полного двоичного сумматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list): s=^y] p=x and y for i in range(1,len(x)): s. append((x^y)^p) p=(x and y)or(p and (x or y)) return s x=list() y=list()
Это мы не проходили, это нам не задавали...(аси­­­­­­­­­­­­­­хро­н­н­ы­й счётчик с управляющим сигналом задержки).
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
Руководство по созданию бота для Телеграм на Python
IT_Exp 04.01.2025
Боты для Телеграм представляют собой автоматизированные программы, которые выполняют различные задачи, взаимодействуя с пользователями через интерфейс мессенджера. В данной статье мы рассмотрим,. . .
Применение компонентов PrimeVue в Vue.js 3 на TypeScript
BasicMan 04.01.2025
Введение в PrimeVue и настройка окружения PrimeVue представляет собой мощную библиотеку компонентов пользовательского интерфейса для Vue. js 3, которая предоставляет разработчикам богатый набор. . .
Как стать Senior developer
cpp_developer 04.01.2025
В современной индустрии разработки программного обеспечения позиция Senior Developer представляет собой не просто следующую ступень карьерной лестницы, а качественно новый уровень профессионального. . .
Что известно о дате выхода Windows 12 и чего от нее ждать
IT_Exp 04.01.2025
В мире технологий постоянно происходят изменения, и операционные системы не являются исключением. Windows 11, выпущенная в октябре 2021 года, принесла множество инноваций и улучшений, но. . .
Что новенького в .NET Core 9
Programming 04.01.2025
Обзор ключевых изменений в . NET Core 9 Платформа . NET Core продолжает активно развиваться, и версия 9 представляет собой значительный шаг вперед в эволюции этой технологии. Новый релиз. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru