С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
2 / 2 / 0
Регистрация: 13.09.2015
Сообщений: 56

Как прочитать из файла абсолютно все слова?

07.11.2015, 18:27. Показов 1672. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В моей программе читаются все слова из файла и выводятся на экран все слова, которые встречаются в тексте (слово выводится один раз) и при этом выводятся они в порядке убывания того, сколько раз они встретились в тексте.
Но проблема в том, что корректно считываются только файлы такого типа:
a
aa
bb
aa
Т.е. когда каждое слово записано с новой строки. Когда же файл такого типа:
aa a bb
bb b aa
aa b
aa
то хоть и должно быть выведено "aa aa bb b a", "b" совсем не выводится. Т.е. когда слова идут не с новой строки, а могут быть записаны и в текущей, программа не работает корректно. Но не могу понять почему. Помогите, что следует изменить?
Нужно использовать именно map.

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 <map>
#include <vector>
#include <string>
#include <algorithm>
#include <fstream>
using namespace std;
 
int main(int argc, char* argv[]) {
    ifstream fin("input.txt");
 
    string word;
    map<string, int> text, text2;
    map<int, string> m2;
    
    while (fin >> word) {
        text[word]++;
        if (text.find(word) != text.end())  {
            int tmp = text[word];
            text2[word] = tmp;
        }
    }
 
    for (map<string, int>::iterator it = text2.begin(); it != text2.end(); ++it)
        m2[it->second] = it->first;
 
    map<int, string>::reverse_iterator rit;
    for (rit = m2.rbegin(); rit != m2.rend(); ++rit)
        cout << rit->second << endl;
 
    fin.close();
    system("pause");
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.11.2015, 18:27
Ответы с готовыми решениями:

Записать в файл F слова. Прочитать данные из файла и найти слова из 5 букв
Записать в файл F слова. Прочитать данные из файла и найти слова из 5 букв Не получается написать, поправьте что бы работала...

Как прочитать все содержимое текстового файла в строку на C++
Здравствуйте, речь идет про запись всего содержимого файла в одну переменную &quot;разом&quot;. Читал кучу ответов на форумах, кто то...

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

14
 Аватар для Крюгер
40 / 60 / 8
Регистрация: 16.11.2012
Сообщений: 460
Записей в блоге: 7
07.11.2015, 18:47
у тебя разделители это пробелы, на них и ориентируйся.
0
2 / 2 / 0
Регистрация: 13.09.2015
Сообщений: 56
07.11.2015, 19:02  [ТС]
Крюгер, я понимаю, что тут дело в пробелах, но никак не могу понять, как это применить. Можете написать фрагмент кода, пожалуйста?

Добавлено через 7 минут
Крюгер, так тоже не работает(
C++
1
2
3
4
5
6
7
8
9
10
char p = ' ';
    char n = '\n';
    
    while ((fin >> word && fin >> p) || fin >> word && fin >> n) {
        text[word]++;
        if (text.find(word) != text.end())  {
            int tmp = text[word];
            text2[word] = tmp;
        }
    }
0
 Аватар для Крюгер
40 / 60 / 8
Регистрация: 16.11.2012
Сообщений: 460
Записей в блоге: 7
07.11.2015, 19:17
[CPP]#include "stdafx.h"
Цитата Сообщение от Jack_15 Посмотреть сообщение
C++
1
while ((fin >> word && fin >> p)
позволь спросить зачем ты в пробел из файла читаешь?

Добавлено через 1 минуту
у тебя здесь p и n - спецсимволы, а ты в них файл считываешь, естессно не будет работать
1
2 / 2 / 0
Регистрация: 13.09.2015
Сообщений: 56
07.11.2015, 19:17  [ТС]
Крюгер, а как можно иначе решить?
0
 Аватар для Крюгер
40 / 60 / 8
Регистрация: 16.11.2012
Сообщений: 460
Записей в блоге: 7
07.11.2015, 19:20
Jack_15, ну здесь не принципиально, поэтому можно считать текст в буфер, а из буфера уже сравнивать, пробел это, конец строки, или что то другое.

Добавлено через 41 секунду
а можно когда считываешь воткнуть условие if..
0
2 / 2 / 0
Регистрация: 13.09.2015
Сообщений: 56
07.11.2015, 19:41  [ТС]
Крюгер, можете код скинуть? если с условием if
0
 Аватар для Крюгер
40 / 60 / 8
Регистрация: 16.11.2012
Сообщений: 460
Записей в блоге: 7
07.11.2015, 19:48
Jack_15,

Не по теме:

блин, ну вы не знаете как условия ставить, что ли? =) я вас умоляю, откуда тогда у вас такой код, который с применением stl , который по сути сложнее чем составить условие???



C++
1
2
3
4
5
6
7
while (true)
{
fin >> word;
if( (word == p)||(word ==n) { сделать что то} 
else{  сделать еще что то}
 
..code..}
0
2 / 2 / 0
Регистрация: 13.09.2015
Сообщений: 56
07.11.2015, 19:54  [ТС]
Крюгер, с stl сейчас как раз учусь работать и условия составлять умею, но работать с файлами - не до конца. Поэтому и прошу помощи. Тем более думал, что с применением p и n всё всё равно не станет работаь правильно и таки да, не работает правильно. Считываю, если слово НЕ равно n или p.
В данном случае не понимаю, какое именно условие составить.
C++
1
2
3
4
5
6
7
8
9
10
11
string p = " ";
string n = "\n";
while (fin >> word) {
        if (word != p && word != n) {
            text[word]++;
            if (text.find(word) != text.end())  {
                int tmp = text[word];
                text2[word] = tmp;
            }
        }
    }
Добавлено через 1 минуту
Крюгер, а while(true) - это ведь бесконечный цикл
0
 Аватар для Крюгер
40 / 60 / 8
Регистрация: 16.11.2012
Сообщений: 460
Записей в блоге: 7
07.11.2015, 20:02
Цитата Сообщение от Jack_15 Посмотреть сообщение
C++
1
2
int tmp = text[word];
* * * * * * * * text2[word] = tmp;
а к чему у вас это? если вы из файла читаете сразу без пробелов, зачем тогда вам второй буфер?

Добавлено через 3 минуты
Цитата Сообщение от Jack_15 Посмотреть сообщение
int tmp = text[word];
* * * * * * * * text2[word] = tmp;
тем более вы тут вообще тип int передаёте, а у вас string
0
2 / 2 / 0
Регистрация: 13.09.2015
Сообщений: 56
07.11.2015, 20:04  [ТС]
Крюгер, это не имеет никакого отношения к моему вопросу насчёт считывания из файла

Добавлено через 1 минуту
Крюгер, ну так у меня ж меп, в котором ключ стринг, а значение - int. Я ключу присваиваю значение типа int.
0
 Аватар для Крюгер
40 / 60 / 8
Регистрация: 16.11.2012
Сообщений: 460
Записей в блоге: 7
07.11.2015, 20:13
C++
1
2
3
4
5
6
7
8
    ifstream i(file);
    cout << "\nПрочитаем содержимое файла " << file << endl;
    while(true) {
    getline(i, out_s);
    if(!i.eof())
        cout << out_s << endl;
    else break;
    }
примерно так построчно считай в буфер текст, из буфера отфильтруй пробелы и закинь в мап, потом выведи.

Добавлено через 2 минуты
или сразу читаешь строчку, посимвольно анализируешь на пробелы/конец строки и тд

Добавлено через 5 минут
C++
1
2
3
4
 string s="string text123";
   for (int i=0;i<strlen(s.c_str());i++)
      if (s[i]!= " " && s[i]!="\n")
         std::cout<<s[i]<<"\n";
- а так можно строку проанализировать
0
2 / 2 / 0
Регистрация: 13.09.2015
Сообщений: 56
07.11.2015, 20:19  [ТС]
Крюгер, но что мне даст последний фрагмент кода, если мне надо не символы в меп добавлять, а слова?
0
 Аватар для Крюгер
40 / 60 / 8
Регистрация: 16.11.2012
Сообщений: 460
Записей в блоге: 7
07.11.2015, 21:13
Jack_15, где твоя фантазия? этот код можно использовать для того чтобы отфильтровать пробелы из слова, вообще то.. просто еще одну переменную типа string добавь, в нее и считаешь слова без пробелов.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ifstream i(file);
 map <char,int> myFirstMap;
 map<string, int>::iterator it;
string a, b;
 
    while(true) {
 
    getline(i, a);
    if(!i.eof()){
 
 for (int q=0;q<strlen(a.c_str());q++)
      if (a[q]!= " " && a[q]!="\n")
      b[q] = a[q];
        
   } else break;
 
 myFirstMap.insert ( pair<string,int>(b,it++) );
    }
как то так. вроде бы.

Добавлено через 33 минуты
будем считать что не помогло.
0
166 / 69 / 17
Регистрация: 22.03.2011
Сообщений: 196
07.11.2015, 22:26
Jack_15,
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 <algorithm>
#include <iterator>
#include <map>
#include <vector>
 
using namespace std;
 
int main()
{
    typedef map<string, size_t> my_map;
    typedef vector<my_map::iterator> my_vec;
    
    my_map m;
    my_vec v;
 
    for (auto i = istream_iterator<string>(*(new fstream("foo.txt"))); i != istream_iterator<string>(); ++i) {
        ++m[*i];
    }
 
    for (auto i = m.begin(); i != m.end(); ++i) {
        v.push_back(i);
    }
 
    sort(v.begin(), v.end(), [](const my_vec::value_type &lh, const my_vec::value_type &rh) {
            return lh->second > rh->second; 
    });
 
    for (auto &i : v) {
        cout << i->first << ": " << i->second << endl;
    }
}
Добавлено через 51 минуту
Jack_15, вариант с multimap. попроще, но в памяти будет 2 копии данных, в отличии от копирования итератора прошлого варианта.

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
#include <iostream>
#include <fstream>
#include <algorithm>
#include <iterator>
#include <map>
 
using namespace std;
 
int main()
{
    typedef map<string, size_t> my_map;
    typedef multimap<size_t, string, greater<size_t>> my_multimap;
 
    my_map m;
    my_multimap mm;
 
    for (auto i = istream_iterator<string>(*(new fstream("foo.txt"))); i != istream_iterator<string>(); ++i) {
        ++m[*i];
    }
 
    for (auto &i : m) {
        mm.insert(make_pair(i.second, i.first));
    }
 
    for (auto &i : mm) {
        cout << i.first << ": " << i.second << endl;
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.11.2015, 22:26
Помогаю со студенческими работами здесь

В txt файле найти все слова которые начинаются на гласные, вывести ети слова и все числа из файла
В txt файле найти все слова которые начинаются на гласные, вывести ети слова и все числа из файла.

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

Прочитать слова из файла в отдельных строках
И так, имеется текстовый файл: Нужно собственно прочитать все слова в отдельных строках. Однако read(f, s) считывает всю строку. Нет...

Прочитать из текстового файла слова, отсортировать буквы по возрастанию
Ребят не могу понять в чем ошибка..... Суть задачи: Нужно прочитать из текстового файла слова, отсортировать буквы по возрастанию(в...

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru