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

С++ по Krupniku. Problema с задачей. Может дело в getline() ? - C++

Восстановить пароль Регистрация
 
SergioFromSPB
0 / 0 / 0
Регистрация: 28.08.2012
Сообщений: 3
28.08.2012, 22:35     С++ по Krupniku. Problema с задачей. Может дело в getline() ? #1
Всем привет! Учу С++ по книге Крупника. В его задаче нужно сделать словарь из текста 2-х книг на английском языке. Например Шекспира. Скачал Шекспира на английском. Но вот проблема. Если задаю имя книги (со всеми словами в книге), то программа ничего не выводит на экран. Решил попробовать другим способом: копировал книгу, удалил все слова кроме первых 5, и каждое слово распределил на новой строке. Сохранил под другим именем. И ура, все работает! Вывод текста есть. Я не стал писать весь код, так как не работает вывод 1-й книги, не добавляя еще даже второй.
Массив символов состоит из 80 символов. Ну весь словарь мне и не надо, но хотя бы первые 80 символов то по идее должны показаться.
Может дело в getline() ?? Может она как-то с этим связана?

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
#include <iostream>
#include <string>
#include <fstream>
#include <map>
using namespace std;
 
int main() 
{
    map<string,string> d;   //Контейнер для слов
    map<string,string>::iterator im;
    char  mass[80]; 
    string b;
    cout << "Enter book title: ";
    cin >> b;   
    ifstream infile(b); //Открываем книгу
    while(1)
    {
        infile.getline(mass, sizeof(mass));     //Прочитанную строку сохраняем в массиве.
        if(infile.eof()) break;                 
        d.insert(pair<string,string>(mass, " K"));  //Вставка слова в контейнер, и пометка слов буквой "К"
    }
        for(im=d.begin(); im !=d.end(); im++)   //Вывод слов на экран.
    cout << im->first << im->second << endl;
    
system("pause");
return 0;   
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.08.2012, 22:35     С++ по Krupniku. Problema с задачей. Может дело в getline() ?
Посмотрите здесь:

C++ Problema с работой с фаилами и параметрами
getline C++
getline() в чем дело C++
getline C++
Getline C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
28.08.2012, 22:50     С++ по Krupniku. Problema с задачей. Может дело в getline() ? #2
если уж пользуетесь stl то избавьтесь от массива char, и используйте string.
C++
1
2
string mass;
getline(infile, mass);
SergioFromSPB
0 / 0 / 0
Регистрация: 28.08.2012
Сообщений: 3
28.08.2012, 23:01  [ТС]     С++ по Krupniku. Problema с задачей. Может дело в getline() ? #3
Цитата Сообщение от panicwassano Посмотреть сообщение
если уж пользуетесь stl то избавьтесь от массива char, и используйте string.
C++
1
2
string mass;
getline(infile, mass);
Мне нужно, чтобы был словарь, состоящий из РАЗНЫХ слов, прочитанных из книги. Ведь map не зря объявлен. А так, как Вы сказали сделать, получается, что в 2-х строках, есть одинаковые слова, потому что ключом map являются целые фразы и соответственно будут повторения. Получается, что массив нужен.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.08.2012, 11:49     С++ по Krupniku. Problema с задачей. Может дело в getline() ? #4
Во первых, сделайте проверку открытия файла:
C++
1
2
3
4
5
6
7
ifstream infile(b); //Открываем книгу
if (!infile.is_open())
{ 
    cout << "Error!" << endl;
    system("pause");
    return 1;
}
cin >> правильно считает название книги, если оно состоит из одного слова (читает до пробела). Чтобы правильно читалось название книги, состоящее из нескольких слов, можно сделать так:
C++
1
2
3
string b;
cout << "Enter book title: ";
getline(cin, b);
Добавлено через 28 минут
Если вам нужно считать из книги отдельные слова, а не строки, то используйте getline() с третьим параметром ' ':
C++
1
infile.getline(mass, sizeof(mass), ' ');
Будет читать sizeof(mass) - 1 символ из книги пока не встретит пробел или конец файла. По умолчанию читает до '\n' или конца файла. Или используйте оператор >> :
C++
1
infile >> mass;
Добавлено через 10 минут
Вот в таком виде, код вполне рабочий:
Код
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
#include <fstream>
#include <map>
#include <Windows.h>
#include <cctype> // для ispunct()
using namespace std;
 
int main() 
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    map <string, string> d;   //Контейнер для слов
    map <string, string>::iterator im;
    //char  mass[80];
    string mass; 
    string b;
    cout << "Enter book title: ";
    getline(cin, b);
    
    ifstream infile(b); //Открываем книгу
    if (!infile.is_open())
    { 
        cout << "Error!" << endl;
        system("pause");
        return 1;
    }
    
    string::iterator it;// для удаления знаков пунктуации в начале и конце слова
    while(true)
    {
        infile >> mass; // читаем слово в mass.
        if(infile.eof()) break;
 
        it = mass.begin(); // указывает на первый символ слова.
        while (!mass.empty() && ispunct((unsigned char)(*it))) // удаляем знаки пунктуации в начале слова.
        {
            mass.erase(it);
            it = mass.begin();
        }   
        if (mass.empty()) continue;
        
        it = --mass.end(); 
        while (ispunct((unsigned char)(*it))) // удаляем знаки пунктуации в конце слова.
        {
            mass.pop_back(); 
            it = --mass.end();
        }                 
          
          d.insert(pair <string, string> (mass, " K"));  // Вставка слова в контейнер, и пометка слов буквой "К"
     } //while
        
        for(im = d.begin(); im != d.end(); im++)   // Вывод слов на экран.
           cout << im ->first << im ->second << endl;
    
system("pause");
return 0;   
}
SergioFromSPB
0 / 0 / 0
Регистрация: 28.08.2012
Сообщений: 3
30.08.2012, 22:49  [ТС]     С++ по Krupniku. Problema с задачей. Может дело в getline() ? #5
Спасибо, вставив Ваш код - вышло, как и хотел, словарь из разных слов в столбик.
Yandex
Объявления
30.08.2012, 22:49     С++ по Krupniku. Problema с задачей. Может дело в getline() ?
Ответ Создать тему
Опции темы

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