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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 5.00
broken_wings
0 / 0 / 0
Регистрация: 09.01.2010
Сообщений: 10
#1

"Сканирование" текста в файле. - C++

17.04.2010, 21:52. Просмотров 1056. Ответов 12
Метки нет (Все метки)

Доброго времени суток.
Нужно вывести текст в файл,после чего "просканировать " текст на предмет слов yes или no и,если таковые имеются,заменить их на no или yes соответственно.

Код,выводящий текст в файл я написал,а вот как сделать поиск - понять не могу ((

Если я правильно понял задание - новый текст нужно вывести в другой файл.

Помогите,пожалуйста.

И еще,у меня почему-то из всего текста,который я ввожу,выводится только первое слово (


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream.h>
#include <conio.h>
#include <fstream.h>
#include <string.h>
#define max_len 1000
void main()
{
clrscr();
char string[max_len];
char *token;
char seps[] = " ,\t,\n,\0";
cout<<"input text:";
cin.getline(string,max_len);
token=strtok(string,seps);
ofstream out;
out.open("D:\\out.txt");
out<<string;
cout<<"text introduced succesfully";
out.close();
getch();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.04.2010, 21:52     "Сканирование" текста в файле.
Посмотрите здесь:

C++ Дан текст, хранящийся в текстовом файле f, каждый символ которого может быть малой буквой, цифрой или одним из знаков "+", "-", "*".
"вставка" с "заменой" текста в файле. C++
C++ по строкам.замените в слове сочетание "му" на "а" , а букву "ы" на "ца". очень нужно
C++ В текстовом файле заменить все лова начинающиеся с буквы "а" на первое место, которое начинается с буквы "с"
C++ В каждом слове текста замените "а" на букву "е"
Чтения структуры из файла (описать структуру с именем "ORDER": "счет плательщика"; "счет получателя"; "сумма, переводится банковской операцией") C++
Структура «Преподаватель» с полями "ФИО", "стаж", "категория", "нагрузка" C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
21.04.2010, 06:52     "Сканирование" текста в файле. #2
это надо двигаться по строке и, если встречено слово, то проверить, равно ли оно yes, если равно, то заменить его на no, а если оно не равно yes, то проверить не равно ли оно no, если равно, заменить на yes, иначе двигаться дальше
тут нельзя юзать быстрые методы типа найти слово и заменить его, так как изменённые слова снова будут меняться
если юзаешь strtok() - потеряешь разделители, так как она обнуляет их (и потом не различишь какие там были разделители, сколько их там было)
broken_wings
0 / 0 / 0
Регистрация: 09.01.2010
Сообщений: 10
21.04.2010, 20:16  [ТС]     "Сканирование" текста в файле. #3
accept, а не могли бы дать пример какой-нибудь?
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
22.04.2010, 05:09     "Сканирование" текста в файле. #4
там на C++ быстрее получится, вроде, через string
если задание - просто заменить слова, без учёта разделителей
broken_wings
0 / 0 / 0
Регистрация: 09.01.2010
Сообщений: 10
22.04.2010, 23:52  [ТС]     "Сканирование" текста в файле. #5
accept, string у меня - простая переменная,если вы об этом)
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
23.04.2010, 10:42     "Сканирование" текста в файле. #6
не, я про тип в C++, который называется string
там можно строки складывать, сравнивать a += b, a == b, делать замену, превращать в потоки (и читать их, как файловые потоки читаешь)
broken_wings
0 / 0 / 0
Регистрация: 09.01.2010
Сообщений: 10
25.04.2010, 13:56  [ТС]     "Сканирование" текста в файле. #7
accept, ну а примером к моему коду не поделитесь?)
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
26.04.2010, 07:40     "Сканирование" текста в файле. #8
вот пара примеров, тут есть string
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
42
43
44
45
46
47
 
#include <iostream>
#include <fstream>
 
using namespace std;
 
// добавляет в первый файл второй файл
int main(void)
{
    fstream f1;
    fstream f2;
    char c;
        
    const char *f1name = "file1.txt";
    const char *f2name = "file2.txt";
        
        
    f1.open(f1name, ios::in);
    
    if (!f1.is_open()) {
        cerr << "error 1" << endl;
        return 1;
    } else
        f1.close();    
    
    f1.open(f1name, ios::out | ios::app);
    f2.open(f2name, ios::in);
    
    if (!f1.is_open() || !f2.is_open()) {
        cerr << "error 2" << endl;
        return 1;
    }
    
    while (f2.get(c))
        f1 << c;    
    
    f1.close();
    f2.close();
        
    cout << "ok, "
         << f2name
         << " appended to "
         << f1name
         << endl;    
        
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
#include <iostream>
#include <fstream>
 
using namespace std;
 
int main(void)
{
    string s;
    ifstream in("file.txt");
    
    while (getline(in, s)) {
        if (s == "lineexit")
            break;
        cout << s << endl;
    }
    
    return 0;
}

там ещё getline() для string

это поделить строку, склеить обратно
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
#include <iostream>
#include <sstream>
 
using namespace std;
 
// makes an istringstream
int main(void)
{
    string a = "a b c d", b;
    istringstream is(a);
        
    while (is >> b)
        cout << b << endl;
        
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
#include <iostream>
 
using namespace std;
 
/* склеивает строки */
int main(void)
{
    string s1 = "one",
           s2 = "two";
    
    cout << s1
         << endl
         << s2
         << endl;
    cout << s1 + " " + s2 + "\r\n";
    return 0;
}
easybudda
Эксперт С++
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
26.04.2010, 11:01     "Сканирование" текста в файле. #9
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
#include <iostream>
#include <string>
 
int main(){
    std::string str("Petya says yes, Vasya says no, Kolya says yes and Vitya says no.");
    std::cout << str << std::endl;
    
    const std::string sYes("yes");
    const std::string sNo("no");
    
    size_t pos = 0, posYes, posNo, npos = std::string::npos;
    while ( pos != npos ){
        posYes = str.find(sYes, pos);
        posNo = str.find(sNo, pos);
        if ( posYes != npos && posNo != npos ){
            if ( posYes < posNo ){
                str.replace(posYes, sYes.length(), sNo);
                pos = ( posYes + sNo.length() < str.length() ) ? posYes + sNo.length() : npos;
            }
            else {
                str.replace(posNo, sNo.length(), sYes);
                pos = ( posNo + sYes.length() < str.length() ) ? posNo + sYes.length() : npos;
            }
        }
        else if ( posYes != npos ){
            str.replace(posYes, sYes.length(), sNo);
            pos = ( posYes + sNo.length() < str.length() ) ? posYes + sNo.length() : npos;
        }
        else if ( posNo != npos ){
            str.replace(posNo, sNo.length(), sYes);
            pos = ( posNo + sYes.length() < str.length() ) ? posNo + sYes.length() : npos;
        }
        else pos = npos;
    }
    std::cout << str << std::endl;
    
    return 0;
}
Есть, правда, одна загвоздка... К примеру слово "yesterday" в "nostreday" превратится...
asd321
Мохаммед Али
127 / 65 / 1
Регистрация: 14.08.2009
Сообщений: 916
26.04.2010, 11:20     "Сканирование" текста в файле. #10
угар надо просто yes no заменить на _yes_ _no_ это пробелы типа.
easybudda
Эксперт С++
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
26.04.2010, 11:46     "Сканирование" текста в файле. #11
asd321, а никто не говорил, что yes и no должны пробелами отделяться. Точки, запятые и прочее как учитывать будем?
asd321
Мохаммед Али
127 / 65 / 1
Регистрация: 14.08.2009
Сообщений: 916
26.04.2010, 13:56     "Сканирование" текста в файле. #12
можно написать
C++
1
2
3
4
5
6
7
for()
{
 if (ch in[a..z]) firsbool=false;
if (firsbool) {проверка yes no; 2bool=true;}
if (2bool) 
if (ch in[a..z]) 3bool=false;
}
и встроить это в вышеописанный алгоритм.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2010, 17:18     "Сканирование" текста в файле.
Еще ссылки по теме:

Реализовать структуру "Анкета" с полями "Фамилия", "Пол" и "Адрес" C++
Создать иерархию классов "Фирма", "Бухгалтер", "Сотрудник", "Зарплата" C++
C++ Удалить из текста все слова, оканчивающиеся группой букв "ing" и "ed"
Определить тип данных "Запись", имеющий поля "Фамилия", "Пол", "Зарплата" C++
Может ли MSXML в XML файле найти все вхождения "123" в значениях атрибутов элементов и заменить их на "321"? C++

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

Или воспользуйтесь поиском по форуму:
broken_wings
0 / 0 / 0
Регистрация: 09.01.2010
Сообщений: 10
27.04.2010, 17:18  [ТС]     "Сканирование" текста в файле. #13
accept, дело в том,что мой компилятор не воспринимает string как тип данных (BC++ 3.11).
Yandex
Объявления
27.04.2010, 17:18     "Сканирование" текста в файле.
Ответ Создать тему
Опции темы

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