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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Smiler_
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 4
#1

Бинарный режим открытия файла; Битовые вхождения в файл - C++

05.06.2013, 07:59. Просмотров 936. Ответов 6
Метки нет (Все метки)

Доброго времени суток! Нужна помощь, не могу разобраться как с заданием, так и с написанием программы.

Задание такое: Написать программу подсчитывающую количество вхождений одинаковых битовых последовательностей в файл.

Как я понял задание: Открываем файл в бинарном режиме, считываем данные из файла(в виде байтов), далее необходимо байты разбить на биты(применяя битовую маску), посчитать кол-во одинаковых битовых последовательностей...(Так мне объяснили)

Что у меня вышло:
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
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <cstring>
#include <string>
using namespace std;
int main()
{
setlocale(0, "rus");
string d,e,f,g;
int i, j, k=0,length;
char b[15]="Hello world!!!";
char rd[15];
unsigned char mask=0x1;
FILE* fp = fopen("my_file.bin","wb+");
if(fp != NULL)
{
fwrite( b, sizeof(char), 14, fp );
fseek(fp,0L,SEEK_END);
length = ftell(fp);
fseek(fp,0L,SEEK_SET);
    for (i=1; i<=length ;i++)
    {
fread(rd,sizeof(char), 1,fp);
fseek(fp,i,SEEK_SET);
for (j=1;j<14;j++)
{
d=rd[i]*mask;
e.append(d);
rd[i]>>1;
}
    }
    for (i=1; i<=(e.length()/8);i++)
    {
        f=e.substr(0,8*i);
        g=e.substr(8*i, e.length());
        length--;
        for (j=1; j<length+1;j++)
        {
                if(g.substr(8*j, f.length()) == f)
                k++;
        }
    }
cout << "Число одинаковых битовых вхождений:"<<k<<endl;
}
else
{
cout << "Файл не открыт\n";}
if(fclose(fp))
{
    cout << "Файл не закрыт\n";
}
system("pause");
return 0;
}
И соответственно вопрос...где тут, что не так) И что считывает функция fread...байт в виде 0 и 1 ? или просто символ?
Не отрицаю, что код корявый)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.06.2013, 07:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Бинарный режим открытия файла; Битовые вхождения в файл (C++):

Данные из текстового файла записать в бинарный файл - C++
пытаюсь считать данные из текстового файла, записать их в бинарный файл. после пытаюсь считать из бинарного файла в строку и вывести ее...

Из текстового файла считать матрицу и записать ее в бинарный файл - C++
Прошу помочь с решением: Из текстового файла считать матрицу и записать ее в бинарный файл Добавлено через 2 часа 22 минуты ...

Как записать в бинарный файл структуры записи из текстового файла? - C++
Здравствуйте! Прошу помочь с чтением из текстового файла а затем запись всего что записано в структуру в бинарный файл. Есть текстовый...

Запись вектора uin8_t в бинарный файл и обратное чтение из файла - C++
Здравствуйте. Есть std::vector&lt;uint8_t&gt;. Нужно записать все элементы в бинарный файл, а затем считать обратно из файла в...

Записать в бинарный файл массив объектов Student (бинарный файловый ввод/вывод) - C++
Здравствуйте. Стоит задача записать в бинарный файл массив объектов student: class student { string firstname,lastname, group; ...

Занести в бинарный файл h из текстового файла t целые числа, упорядоченные по возрастанию - C++
Не получается..(((киньте идеи.. В текстовом файле t записаны целые числа, упорядоченные по убыванию. Занести в бинарный файл h из...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
stima
473 / 322 / 30
Регистрация: 22.03.2011
Сообщений: 1,046
Завершенные тесты: 2
05.06.2013, 12:47 #2
Нужно определиться, что считать битовой последовательностью.
номер *****0 1 2 3 4 5
числа***** 4 2 2 1 1 0
байты(hex) 34 32 32 31 31 30

а. Предел одного и того же байта. В данном случае байты под номером 1 и 2 равны.
б. Любая комбинация. Тогда 0-й байт hi == 1-му байту hi == 2-му байте hi и т.д.
0
Smiler_
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 4
05.06.2013, 14:41  [ТС] #3
Хм..Однако, ничего не понял(( Вероятно байты... Мы считываем байты - выходит последовательность из байтов..преобразуем ее в битовую...Далее смотрим сколько раз встречается 1-й бит, затем сколько 1-й и 2-й...как-то так. Я не понимаю, что записывается в строку при вызове этой функции:
C++
1
fread(rd,sizeof(char), 1,fp);
Раз это бинарный режим, и допустим мы считываем символ "3" - то должен считаться двоичный код в виде 00000011 ? Тогда - это байт и нужно применить битовую маску... т.е. умножить на 00000001, и затем сдвинуть на один бит...??
0
stima
473 / 322 / 30
Регистрация: 22.03.2011
Сообщений: 1,046
Завершенные тесты: 2
05.06.2013, 14:57 #4
C++
1
fread(rd,sizeof(char), 1,fp);
Считать из файла fp 1 элемент размером char в буфер rd.

Добавлено через 6 минут
Наводящий вопрос. Если в файле припустим только число 2(00000010). Сколько по Вашему тут должно быть повторений?
0
Smiler_
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 4
05.06.2013, 15:05  [ТС] #5
Шесть, по-моему.
0
stima
473 / 322 / 30
Регистрация: 22.03.2011
Сообщений: 1,046
Завершенные тесты: 2
05.06.2013, 16:09 #6
Чтобы помочь Вам решить, нужно понять, что решать. Давайте посчитаем вместе:

01234567
00000010

1. Берем 0 бит, проходимся от 0 к 7. Имеем еще 6 совпадений.
2. Берем 0 и 1 биты, проходимся от 1 к 7. Еще 2.
3. Берем 012 биты, проходимся от 2 к 7. Еще 1.
----------
Итого 9.

Этого требует условие?
0
Smiler_
0 / 0 / 0
Регистрация: 04.06.2013
Сообщений: 4
06.06.2013, 06:21  [ТС] #7
Можно и так, но я считал с конца.

Добавлено через 4 часа 24 минуты
Спасибо, разобрался!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2013, 06:21
Привет! Вот еще темы с ответами:

Записать в файл g компоненты файла f, исключив повторные вхождения чисел - C++
Нужно написать программы на языке с++ 1)Дан файл f, компоненты которого являются целыми числами. Записать в файл g, компоненты файла f,...

Записать в файл g, компоненты файла f, исключив повторное вхождения чисел - C++
Дан файл f, компоненты которого являются целыми числами. Записать в файл g, компоненты файла f, исключив повторное вхождения чисел

Чтение бинарного файла в поток std::ifstream и вывод в другой бинарный файл std::ofstream (создание копии) - C++
Проверил работу программы на маленькой картинке(744 байт). Все работает. С несколько бОльшими файлами(512КБ) нет. Суть задачи в том,...

на основе данных входного файла составить список вкладчиков(ФИО,№ счёта,сумма,год открытия счёта)Вывести в new файл инфу об открывших счёт в этом году - C++
Решить задачу, используя структуру, содержащую члены-данные и члены-функции. Замечание. Подразумевается, что исходная информация...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
06.06.2013, 06:21
Ответ Создать тему
Опции темы

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