Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
dan-man007
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 62
1

Замена одного символа на другой

15.03.2016, 23:09. Просмотров 1790. Ответов 8
Метки нет (Все метки)

Продолжаю познания работы с текстовыми файлами. Пытаюсь заменить один символ на другой и вывести результат на экран. информация берется из файла. Как я понял, нужно посимвольно пройти содержимое файла и при совпадении условия, заменить символ. Вот, что пытаюсь сделать. Не могу разобраться с самим принципом работы текстового файла.
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
#include <iostream>
#include <fstream>
 
using namespace std;
 
int main()
{
    fstream file("text.txt");
    if (!file.is_open()) {
        file.open("text.txt", fstream::out);
        return 0; 
    }               
    char symbols[200];
    while (file.get(symbols))
    {
        cout << symbols;
        for (int i = 0; i < 200; i++)
        {
            if (symbols[i] = 'е')
                symbols[i] = 'а';
        }
    }
    for (int i = 0; i < 200; i++)
        cout << "Результат замены буквы Е на А"<< symbols[i] << endl;
    
    file.close();
    system("pause");
    return 0;
}
Добавлено через 20 минут
немного отредактировал код и все равно выводит "Результат замены буквы Е на Аа"
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
#include <iostream>
#include <fstream>
#include <locale.h> /* Для русского языка */
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Rus"); /* Обязательно должно быть первым. Русифицирует символы в консоли */
    fstream file("text.txt");
    if (!file.is_open()) {
        file.open("text.txt", fstream::out);
        return 0; 
    }               
    char symbols[200];
    while (! file.eof())
    {
        file >> symbols;
        for (int i = 0; i < 200; i++)
        {
            if (symbols[i] = 'е')
                symbols[i] = 'а';
        }
    }
    for (int i = 0; i < 200; i++)
        cout << "Результат замены буквы Е на А"<< symbols[i] << endl;
    
    file.close();
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2016, 23:09
Ответы с готовыми решениями:

Замена одного символа на другой в строке
Условие такое: Дана символьная строка. Заменить все символы '!' точками, кроме...

Реализовать функцию, заменяющая каждое появление одного символа на другой
5. Напишите функцию, имеющую следующий прототип: int replace (char * str, char...

Функция для замены в строчном массиве одного символа на другой.
Доброго времени суток, программисты! Возникла, значит, проблема: Написал...

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

Реализовать функцию замены одного символа на другой в заданной строке
Нужно написать функцию для замены символа 'о' на &quot;аа&quot; . Не использовать...

8
Igrich
4 / 4 / 9
Регистрация: 07.03.2016
Сообщений: 44
15.03.2016, 23:10 2
Если я правильно понял задачу,то алгоритм следующий:
1)Записать весь файл в массив;(сделано)
2)Пройтись по массиву и заменить нужный символ;(сделано)
3)Удалить исходный файл(remove("файл.txt"));
4)Записать массив из памяти в этот файл(file<<symbols);
0
dan-man007
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 62
15.03.2016, 23:20  [ТС] 3
не удалось
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
#include <iostream>
#include <fstream>
#include <locale.h> /* Для русского языка */
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Rus"); /* Обязательно должно быть первым. Русифицирует символы в консоли */
    fstream file("text.txt");
    if (!file.is_open()) {
        file.open("text.txt", fstream::out);
        return 0; 
    }               
    char symbols[200];
    while (! file.eof())
    {
        file >> symbols;
        for (int i = 0; i < 200; i++)
        {
            if (symbols[i] = 'е')
                symbols[i] = 'а';
        }
    }
    
    file.close();
    remove("файл.txt");
    file << symbols;
    system("pause");
    return 0;
}
0
Igrich
4 / 4 / 9
Регистрация: 07.03.2016
Сообщений: 44
15.03.2016, 23:47 4
попробуй так
C++
1
2
3
4
5
6
    //тут твой цикл
    file.close();
    file("text.txt", ios::trunc);
    file << symbols;
    file.close();
    system("pause");
Добавлено через 24 минуты
Не увидел последнюю правку, тогда сделай так:
Подключи <stdio.h> для remove,rename
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
char symbols[200];
    fstream out("out.txt", ios::trunc); //временный файл
    while (! file.eof())
    {
        file >> symbols;
        for (int i = 0; i < 200; i++)
        {
            if (symbols[i] = 'е')
                symbols[i] = 'а';
        }
        out<<symbols; //пишем массив во временный файл
    }
    file.close();
    out.close();
    remove("text.txt");  //удаляем старый
    rename("out.txt","text.txt"); //заменяем старый временным
    system("pause");
    return 0;
0
dan-man007
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 62
16.03.2016, 00:37  [ТС] 5
пробовали создавая out.txt и без него. В результате удаляются оба файла (out.txt и text.txt)
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
#include <iostream>
#include <fstream>
#include <locale.h> /* Для русского языка */
#include <stdio.h>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Rus"); /* Обязательно должно быть первым. Русифицирует символы в консоли */
    fstream file("text.txt");
    if (!file.is_open()) {
        file.open("text.txt", fstream::out);
        return 0; 
    }               
    char symbols[200];
    fstream out("out.txt", ios::trunc); //временный файл
    while (!file.eof())
    {
        file >> symbols;
        for (int i = 0; i < 200; i++)
        {
            if (symbols[i] = 'е')
                symbols[i] = 'а';
        }
        out << symbols; //пишем массив во временный файл
    }
    file.close();
    out.close();
    remove("text.txt");  //удаляем старый
    rename("out.txt", "text.txt"); //заменяем старый временным
    system("pause");
    return 0;
}
пробовал не заменяя файлы, а использую один как источник данных, а другой только для вывода текста. Все равно не пашет. я не могу понять, в чем может быть ошибка. Файл out (outtext) остается пустым, как буд-то в него ничего не записывается.Может не удается записать данные в symbols?
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
#include <iostream>
#include <fstream>
#include <locale.h> /* Для русского языка */
#include <stdio.h>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Rus"); /* Обязательно должно быть первым. Русифицирует символы в консоли */
    fstream file("text.txt");
    if (!file.is_open()) {
        file.open("text.txt", fstream::out);
        return 0; 
    }               
    char symbols[200];
    fstream outtext("outtext.txt", fstream::trunc); //временный файл
    while (!file.eof())
    {
        file >> symbols;
        for (int i = 0; i < 200; i++)
        {
            if (symbols[i] = 'е')
                symbols[i] = 'а';
        }
        outtext << symbols; //пишем массив во временный файл
    }
    file.close();
    outtext.close();
    system("pause");
    return 0;
}
Добавлено через 2 минуты
Попробовал только записать данные файла в symbols, а затем из symbols записать в другой файл. Не записывает, файл остается пустым
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
#include <iostream>
#include <fstream>
#include <locale.h> /* Для русского языка */
#include <stdio.h>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Rus"); /* Обязательно должно быть первым. Русифицирует символы в консоли */
    fstream file("text.txt");
    if (!file.is_open()) {
        file.open("text.txt", fstream::out);
        return 0; 
    }               
    char symbols[300];
    fstream outtext("outtext.txt", fstream::trunc); //временный файл
        file >> symbols;
        outtext << symbols; //пишем массив во временный файл
    file.close();
    outtext.close();
    system("pause");
    return 0;
}
0
Igrich
4 / 4 / 9
Регистрация: 07.03.2016
Сообщений: 44
16.03.2016, 04:06 6
Лучший ответ Сообщение было отмечено dan-man007 как решение

Решение

dan-man007, попробуй этот,у меня работает
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
#include <iostream>
#include <fstream>
#include <locale.h> /* Для русского языка */
#include <stdio.h>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Rus"); /* Обязательно должно быть первым. Русифицирует символы в консоли */
    fstream file("text.txt");
    //проверка ну открытие файла сделай,забыл и лень уже делать ^_^
    char symbols[200];
    ofstream out("out.txt", ios::trunc); //временный файл
    while (!file.eof())
    {
        file >> symbols;
        for (int i=0;i<sizeof(symbols); i++)
        {
            if (symbols[i] == 'e')
                symbols[i] ='a';
        }
        out<<symbols; //пишем массив во временный файл
    }
    file.close();
    out.close();
    remove("text.txt");  //удаляем старый
    rename("out.txt","text.txt"); //заменяем старый временным
    return 0;
}
1
Renji
2105 / 1545 / 471
Регистрация: 05.06.2014
Сообщений: 4,484
16.03.2016, 04:18 7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<fstream>
using namespace std;
 
int main()
{
    fstream stream("test.txt");
    while(stream.peek()!=EOF)
    {
        char c=stream.get();
        stream.seekp(stream.tellg()-1);
        stream.put(c=='t'?'Q':c);
    }
    return 0;
}
1
dan-man007
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 62
16.03.2016, 13:48  [ТС] 8
Igrich, Код работает. Единственный момент: он убирает все пробелы и предложение записывается слитно

Добавлено через 4 минуты
Renji, в этом коде не понял, что означает:
C++
1
2
3
        char c=stream.get();
        stream.seekp(stream.tellg()-1);
        stream.put(c=='t'?'Q':c);
Добавлено через 18 минут
Вот рабочий код, может кому-нибудь пригодится. И спасибо всем за помощь)
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
#include <iostream>
#include <fstream>
#include <locale.h> /* Для русского языка */
#include <stdio.h>
 
    using namespace std;
 
    int main()
    {
        setlocale(LC_ALL, "Rus"); /* Обязательно должно быть первым. Русифицирует символы в консоли */
        fstream file("text.txt");
        if (!file.is_open()) {
            file.open("text.txt", fstream::out);
            return 0;
        }
        char symbols[200];
        ofstream out("out.txt", ios::trunc); //временный файл
        while (file.getline(symbols,sizeof(symbols)))
        {
            for (int i = 0; i<sizeof(symbols); i++)
            {
                if (symbols[i] == 'е')
                    symbols[i] = 'а';
            }
            out << symbols; //пишем массив во временный файл
        }
        file.close();
        out.close();
        remove("text.txt");  //удаляем старый
        rename("out.txt", "text.txt"); //заменяем старый временным
        system("pause");
        return 0;
    }
0
Renji
2105 / 1545 / 471
Регистрация: 05.06.2014
Сообщений: 4,484
16.03.2016, 14:08 9
Цитата Сообщение от dan-man007 Посмотреть сообщение
Renji, в этом коде не понял, что означает:
C++
1
2
3
char c=stream.get();//из потока читается один символ
stream.seekp(stream.tellg()-1);//позиция записи устанавливается на символ до позиции чтения
stream.put(c=='t'?'Q':c);//поверх прочитанного символа, записывается новый
1
16.03.2016, 14:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2016, 14:08

Как в переменной строкового типа заменить все вхождения одного символа на другой?
Подскажите как в переменной строкового типа заменить все вхождения одного...

Замена символа в строке на число соответствующему номеру по порядку вхождения этого символа в строку
В заданной строке заменить каждый символ «*» числом, соответствующим номеру по...

Замена символа
Здравствуйте!!! помогите решить задачку! Дано строка символов оттуда надо...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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