Как посчитать символы в тексте?

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Frairs
Сообщения: 19
Зарегистрирован: 25 фев 2013, 20:04

Вообщем вот код

Код: Выделить всё

#include <iostream>
#include <vector>
#include <list>
#include <map>
#include <fstream>

using namespace std;

int main()
{
setlocale (LC_ALL, "RUS");
string s;
ifstream v; //открываем фаил для чтения
v.open ("D:\\trr.txt");
v >> s;
map <char, int> m; //использую ассоциативный массив

for (int i=0; i<s.length(); i++) //записываю символы из строки
{
    char c=s[i];
    m[c]++;
}
map <char, int>::iterator itr; //итератор

for (itr=m.begin(); itr!=m.end(); itr++) //вывод от начала до конца по алфавиту
{
    cout << itr->first << ":" << itr->second << endl;

}
}
Программа прекрасно считает буквы в какой то строчке, выводит по алфавиту буквы и пишет сколько раз какая буква встретилась в этой строчке. Но я хочу что бы он сделал этот не со строчкой, а с текстом, который находится у меня в файле. Текст это далеко не 255 символов. Как это можно сделать?
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

При чтении нужно проверять не достигнут ли конец файла

Код: Выделить всё

while(!v.eof())
{
v >> s;
}
таким образом будут прочитаны все строки из файла. Можно читать посимвольно:

Код: Выделить всё

char ch;
while(!v.eof())
{
v.get(ch);
}
только нужно будет учесть, что в этом случае будут попадаться символы разделители. Ну и в конце не забыть закрыть файл.
Frairs
Сообщения: 19
Зарегистрирован: 25 фев 2013, 20:04

Albor писал(а):При чтении нужно проверять не достигнут ли конец файла

Код: Выделить всё

while(!v.eof())
{
v >> s;
}
таким образом будут прочитаны все строки из файла. Можно читать посимвольно:

Код: Выделить всё

char ch;
while(!v.eof())
{
v.get(ch);
}
только нужно будет учесть, что в этом случае будут попадаться символы разделители. Ну и в конце не забыть закрыть файл.


Вариант

Код: Выделить всё

while(!v.eof())
{
v >> s;
}
мне подходит. Только есть одно НО. Пробелы он не считает в этом случае. А если с char то там вывод другой надо делать. Можно ли посчитать пробелы использую тип string? И ешё вопросик... Пытался сделать так что бы пользователь сам вводил имя файла.

Код: Выделить всё

string name;
v.open (name);
Такая штука не получается, хотя в паскале это работало. Потом пытался написать так:

Код: Выделить всё

char name;
v.open ("name");
Тоже не получилось. Откомпилировал он только после такого кода:

Код: Выделить всё

char *name;
v.open (name);
Только при вводе ничего не получается. Долго парился, так и ничего не получилось. Как это правильно сделать? Вообще цель была такая:

Код: Выделить всё

string name;
v.open ("C://"+name+".txt");
Что бы пользователь ввёл только имя файла на диске C без расширения.
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

Формирование строки можно сделать так:

Код: Выделить всё

string name;
	cin>>name;
	name.append(".txt");// добавляем в конец строки
	name.insert(0,"D:\\");// делаем вставочку в начало
	ifstream v; 
	v.open (name.c_str());// только так, потому что open ожидает указатель на const char 
чтение строки с пробелами так:

Код: Выделить всё

while(!v.eof())
	{
		getline(v,s);
	}
Frairs
Сообщения: 19
Зарегистрирован: 25 фев 2013, 20:04

Albor писал(а):Формирование строки можно сделать так:

Код: Выделить всё

string name;
	cin>>name;
	name.append(".txt");// добавляем в конец строки
	name.insert(0,"D:\\");// делаем вставочку в начало
	ifstream v; 
	v.open (name.c_str());// только так, потому что open ожидает указатель на const char 
чтение строки с пробелами так:

Код: Выделить всё

while(!v.eof())
	{
		getline(v,s);
	}


Спасибо большой.
Ответить