Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
0 / 0 / 0
Регистрация: 15.02.2015
Сообщений: 15
1

Подсчитать сколько раз встречается каждый байт файла

15.02.2015, 19:36. Показов 4300. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Прога открывает любой файл, в нем считывает общее количество байт. А далее начинается самое интересное, нужно организовать подсчет частоты встречи каждого байта исходного файла и вывод статистики в другой файл.


У меня совсем нет идей, главным образом не знаю как правильно идентифицировать эти байты, чтобы начинать их сравнивать между собой и как организовать цикл с подсчетом. Пробовал делать быдлоком из 256 счетчиков и сравнений через символы, но MS Visual Studio испытывает проблемы со считыванием символов ASCII и совсем не хочет воспринимать символы ☺☻♥.


Выручайте.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.02.2015, 19:36
Ответы с готовыми решениями:

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

Строка: В заданной строке подсчитать, сколько раз встречается символ “*” и сколько раз символ ”+”.
Помогите описать данную программу так же как на скриншоте Условие:В заданной строке подсчитать,...

Посчитать сколько раз встречается каждый элемент в массиве.
Не получается программа. Что не так? #include <stdio.h> using namespace std; const int n = 7;...

Определить сколько раз встречается в тексте каждый символ
Для каждого символа заданного текста указать, сколько раз он встречается в тексте. Сообщение об...

19
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
15.02.2015, 19:43 2
Цитата Сообщение от xzickx Посмотреть сообщение
MS Visual Studio испытывает проблемы со считыванием символов ASCII и совсем не хочет воспринимать символы ☺☻♥.
А может быть, проблема вовсе не в Visual Studio и нужно хотя бы показать код ?
0
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
15.02.2015, 19:49 3
Ну например так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <vector>
 
std::vector<size_t> CountBytesAppearing(
    const std::vector<unsigned char> &bytes) {
  std::vector<size_t> bytes_appearing(256, 0);
  for (auto byte : bytes) {
    ++bytes_appearing[byte];
  }
 
  return bytes_appearing;
}
 
void CoutBytesAppearing(const std::vector<size_t> &bytes_appearing) {
  for (size_t byte = 0; byte < bytes_appearing.size(); ++byte) {
    std::cout << "[" << byte << " ] = " << bytes_appearing.at(byte) << '\n';
  }
}
 
int main() {
  std::vector<unsigned char> bytes = {'a', 'c', 0x22, 1, 'a', 'a', 1, 1, 1, 1};
  CoutBytesAppearing(CountBytesAppearing(bytes));
}
Пруф работоспособности:
http://ideone.com/nMorGB

Вам останется только заполнять вектор чисел элементами.
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
15.02.2015, 19:53 4
Разве эти символы в древних кодировках есть?
0
0 / 0 / 0
Регистрация: 15.02.2015
Сообщений: 15
15.02.2015, 20:10  [ТС] 5
эти символы, это лично мой застеб, потомучто я не знаю как правильно идентифицировать байт. Я пытался идентифицировать байт как один символ. И смотреть если символ встретился то к счетчику прибавляю единицу. Это работает для всех символов, кроме ☺ ☻ ♥и подобных, потому что VS начинает ругаться и не понимает что за ерунду я ввел.
Ну например так:Код C++


Пруф работоспособности:
http://ideone.com/nMorGB

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

(7) : error C2143: syntax error : missing ',' before ':'
(7) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
(7) : error C2143: syntax error : missing ';' before '{'
(21) : error C2552: 'bytes' : non-aggregates cannot be initialized with initializer list

1> 'std::vector<_Ty>' : Types with a base are not aggregate
1> with
1> [
1> _Ty=unsigned char
1> ]
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
15.02.2015, 20:21 6
Ты как файл читаешь?
0
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
15.02.2015, 20:21 7
Для компиляции требуется поддержка c++11 ( флаг -std=c++11 ) должен помогать.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
15.02.2015, 20:36 8
C++
1
2
3
4
5
6
int arr[256]={0,};
for(/*здесь какой то цикл для считывания*/)
 {
с=/*здесь как то присваиваем байт*/
arr[c]++
 }
после отработки цикла в arr количества значений
например в 0 ячейке количество 0
в 5 количество пятерок

Добавлено через 4 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
с=/*здесь как то присваиваем байт*/
маленькое уточнение
с должна быть объявлена как unsigned char
0
0 / 0 / 0
Регистрация: 15.02.2015
Сообщений: 15
15.02.2015, 21:15  [ТС] 9
Вот эту прогу я использую для считывания байт с файла, писал не я но примерно понимаю как она работает. Если посмотреть отдельные значения буфера, там видно символы, записанные в файл. Но блин как сравнить значение одного байта с другим я не знаю. Пробовал с помощью цикла while и внутри него использовать if и сравнение символа.
C++
1
2
3
4
5
6
7
8
while (i<length); //импровизация подсчет частоты байта со значение 1
    {
        if (buffer[i]=='1')
        {
            c++;
        }
            i++;
    }
сама прога
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
#include <iostream>     // std::cout
#include <fstream>      // std::ifstream
#include <iostream>
#include <vector>
 
int main () {
    
 
  std::ifstream is ("file.txt", std::ifstream::binary);
  if (is) {
    // get length of file:
    is.seekg (0, is.end);
    int length = is.tellg();
    is.seekg (0, is.beg);
 
     char * buffer = new  char [length];
 
 
    std::cout << "Reading " << length << " characters... ";
    // считывание
 
    is.read (buffer,length);
 
    if (is)
      std::cout << "all characters read successfully.";
    else
      std::cout << "error: only " << is.gcount() << " could be read";
    is.close();
 
    // ...buffer contains the entire file...
 
    delete[] buffer;
  }
 
  return 0;
}
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
15.02.2015, 21:23 10
Лучший ответ Сообщение было отмечено xzickx как решение

Решение

Вот частоты:
C++
1
2
3
4
int f[256];
for (int i = 0; i < 256; ++i) f[i] = 0;
 
for (int i = 0; i < length; ++i) ++f[(unsigned char)buffer[i]];
1
0 / 0 / 0
Регистрация: 15.02.2015
Сообщений: 15
15.02.2015, 21:44  [ТС] 11
Вот частоты:
Спасибо, работает =)
есть правда один вопрос.

в файле у меня вбито: 123456712345671234567 (44 байта)

прога насчитывает 21 повторение какого-то байта. Это байт Null ?

Добавлено через 2 минуты
я наверное туплю совсем и байт не совсем тоже самое что и символ?
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
15.02.2015, 21:57 12
Файл текстовый? То, что ты показал - 21 символ и 21 байт. Почему 44 я не понял.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
15.02.2015, 22:00 13
Цитата Сообщение от xzickx Посмотреть сообщение
я наверное туплю совсем и байт не совсем тоже самое что и символ?
по размеру одно и тоже но не все значения есть символы
смотри кодировку например
https://ru.wikipedia.org/wiki/ASCII
Цитата Сообщение от xzickx Посмотреть сообщение
прога насчитывает 21 повторение какого-то байта.
скорее всего юникоде кодировка, символ состоит из двух байт
Цитата Сообщение от xzickx Посмотреть сообщение
Это байт Null ?
от языка зависит
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
15.02.2015, 22:01 14
А, ну да кодировка может влиять. Тогда интерпретировать в символах бессмысленно, только в кодах.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
15.02.2015, 22:06 15
Цитата Сообщение от ValeryS Посмотреть сообщение
по размеру одно и тоже
Цитата Сообщение от nmcf Посмотреть сообщение
ну да кодировка может влиять
я тоже ступил
скорее так, символ не всегда байт
0
0 / 0 / 0
Регистрация: 15.02.2015
Сообщений: 15
15.02.2015, 22:08  [ТС] 16
Файл текстовый, 44 байта показывает виндоус в свойствах файла, и столькоже насчитывает прога. после вашего цикла for вставил
Код
				while (c<256)
		{
			std::cout<< "f["<<c<< "]=" << f[c] << " ";
			c++;

		}
оно и выдает f [0] = 21 .... и тд. В итоге сумма выданных цифр дает 44, значит прога работает правильно.

Теперь понятно что с символами совсем фигово все.
Всем спасибо, буду дальше дорабатывать код. =)


а все потому что у текстового файла стояла кодировка unicode
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
15.02.2015, 22:11 17
Цитата Сообщение от xzickx Посмотреть сообщение
f [0] = 21
ну значит нулевых байт 21
значит число '1' состоит из байт 0x00 0x31
1
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
15.02.2015, 22:16 18
Юникод - это хорошо. Просто определись, байты считаешь или символы. Если второе, то и считывать надо символы.
0
0 / 0 / 0
Регистрация: 15.02.2015
Сообщений: 15
15.02.2015, 22:23  [ТС] 19
нужно байты, поэтому все норм
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
15.02.2015, 22:26 20
Ну тогда хорошо. Выводи результат в виде (код - количество).
0
15.02.2015, 22:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.02.2015, 22:26
Помогаю со студенческими работами здесь

Посчитать сколько раз каждый элемент встречается в массиве
Необходимо посчитать сколько раз в массиве встречается конкретное число. Пример ввода : 1 2 2 3...

Определить сколько раз встречается в тексте каждый символ
Создать программу с использованием одномерных массивов. Вводится последовательность символов,...

Посчитать сколько раз встречается каждый символ строки в мапе
Для данной строки std::string используя std::map посчитать сколько раз встречается каждый из...

Определить, сколько раз в строке встречается каждый из символов алфавита
Определить, сколько раз в сформированной вами строке встречается каждый из симво-лов алфавита ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru