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

Файл - C++

Восстановить пароль Регистрация
 
Alik-Soldier
9 / 9 / 0
Регистрация: 01.05.2009
Сообщений: 127
06.09.2009, 14:29     Файл #1
Здравствуйте.Помогите пожалуйста в решении вот такой задачи:

Дан файл, содержащий текст на русском языке. В предложениях некоторые из слов записаны подряд.
Получить в новом файле отредактированный текст, в котором удалены повторные вхождения слов в предложение.

У миня получился вот такой код.Считывается из файла информация правильно,но при обработке слов вылезает ошибка...

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
48
49
50
51
52
53
54
55
56
57
58
59
#include "stdafx.h"
#include <conio.h>
#include <fstream>
#include <iomanip>
#include <iostream>
using namespace std;
int main()
{
    setlocale(NULL,"rus");
    ifstream fin;
    fin.open("text.txt");
    if(!fin.is_open())
    {
        cout<<"Текстовый файл не найден"<<endl;
        exit(1);
    }
    cout<<"Текстовый файл успешно открыт"<<endl;
    ofstream fout;
    fout.open("text1.txt",ios::out);
    char predl[200];
    char *word=NULL;
    char *word1=NULL;
    int count=0;
    int count1=0;
    int n_word=0;
    while(!fin.eof())
    {
        fin.getline(predl,200,'.');//читаем предложение
        
            for(int j=0;j<sizeof(predl);j++)//считаем количество слов
            {
                if(predl[j]==' ')
                    n_word++;
            }
            n_word++;
            cout<<n_word<<'\n';
            for(int k=0;k<n_word;k++)//выделяем слово в буфер
            {
                word=strtok(predl," ");
                for(int k1=0;k1<n_word;k1++)//перебираем все слова и сравниваем с выделенным
                {
                    word1=strtok(predl," ");
                    if(*word==*word1)//если найдено более 1 совпадения
                        count1++;
                    if(count1>1)
                        for(int log=0;log<sizeof(word1);log++)// удаляем повторяющееся слово
                            word1[log]=0;
                }
                count1=0;
            }
            n_word=0;
        
    fout<<predl<<endl;
    }
    fin.close();
    fout.close();
    getch();
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2009, 14:29     Файл
Посмотрите здесь:

C++ Записует только одну букву в файл текс в файл
Файл: Записать в файл g целые числа b1..bn по следющим условиям: b[i] = i и b[i] = 2^i +3^(i+1) C++
C++ Сформируйте выходной файл, вставив в первый входной файл содержимое второго входного файла с указанной позиции
error C4335: Обнаружен файл в формате Mac: преобразуйте исходный файл в формат DOS или UNIX C++
C++ Взять готовый файл с набором чисел, в нем найти максимальное значение и записать во второй созданный файл
C++ Файл: Сформировать файл, элементами котого являются числа a1, a1*a2, a1*a2*a3,..., a1*a2*a3*...*an
C++ Записать из файла f четные цифры в файл g, а нечетные в файл h
C++ Чем открыть файл cсv файл в текстовом документе?
Как считать файл построчно записывая в другой файл? C++
C++ Переписать все отрицательные числа в файл g, положительные — в файл h
C++ Разбиение метода класса на файл реализации и файл заголовка
Потерял cpp файл, а ехе-шник остался. Можно как-то декомпилировать файл обратно? C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,298
06.09.2009, 15:12     Файл #2
Что за ошибка? В какой строке?
Gravity
 Аватар для Gravity
556 / 550 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
06.09.2009, 15:21     Файл #3
Код
word=strtok(predl," ");
Код
word1=strtok(predl," ");
Как насчет проверять возвращаемое значение? Может выдать NULL.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,298
06.09.2009, 17:12     Файл #4
Не стал полностью исправлять код. Тут ещё работать да работать.
Одна из основных ошибок.
Смотри автор. Значит, во внешнем цикле ты перебираешь слова, одно за другим.
И во внутреннем тоже.
Так вот. Когда ты пойдёшь не первый проход внутреннего цикла, (то есть на самый первый, при котором k==0 и k1==0) у тебя сработает условие
C++
1
(*word==*word1)
и count1 увеличится на 1. По другому не может быть, ведь мы сравниваем слово с самим с собой.


Беда в том, что при втором проходе внутреннего цикла (k==0 и k1==1) слово, с которым сравнивают, каким было, таким и осталось. Действительно, на него указывает word1. А он был при первом проходе ( когда k==0 и k1==0) был так инициализирован
C++
1
word1=strtok(predl," ");
Так он это же значение при (k==0 и k1==1) и принимает. Ты сравнивашь слово с самим собой. 2 раза подряд.
Короче, дальше не разбирался.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
07.09.2009, 07:08     Файл #5
В строке 30, цикл подсчета слов:
for(int j=0;j<sizeof(predl);j++)//считаем количество слов
при такой записи не зависимо от того какой длины предложение считано из файла, цикл всегда будет повторяться 200 раз (ведь Вы сами задали размер - char predl[200]. Что бы этого избежать лучше строку 30 переписать так:
for(int j=0;predl[j]!='\0';j++)//считаем количество слов
И еще один мой совет: использованием только функций strtok() для написания того что задумано здесь не обойтись.
Yandex
Объявления
07.09.2009, 07:08     Файл
Ответ Создать тему
Опции темы

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