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

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

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

Чтение из бинарного файла - C++

04.01.2015, 22:48. Просмотров 482. Ответов 12
Метки нет (Все метки)

Уважаемые форумчане! Прошу помочь мне с чтением из бинарного файла. Проблема следующая. Есть функция, которая пишет в бинарный файл - writeBits(). Есть функция, которая читает из бинарного файла - readBits(). Предположим, что существует бинарный файл, записанный "давно", т.е при запуске программы, функция writeBits() использована не была, а читали через readBits(). Возникает мусор какой-то. Но если записать в файл и потом из него считать т.е сначала запустить ф-цию writeBits(), а потом readBits(), все ок. Помогите пожалуйста!!! Вот мой код.

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#define _CRT_SECURE_NO_WARNINGS
# include <iostream>
# include <fstream>
 
using namespace std;
 
class Codorgam
{
    friend ostream &operator << (ostream &o, const Codorgam &obj);
    friend ofstream &operator << (ofstream &ofs, const Codorgam &obj);
    friend ifstream &operator >> (ifstream &ifs, Codorgam &obj);
private : 
    char *synchro;
    char *cods1;
    char *cods2;
    char *cods3;
    char *cods4;
    char *cods5;
    char *cods6;
public : 
    Codorgam();
    void writeBits(Codorgam &);
    void readBits(Codorgam &);
    ~Codorgam();
};
 
ostream &operator << (ostream &o, const Codorgam &cod)
{
    cout << cod.synchro << " " << cod.cods1 << " " << cod.cods2 << " " << cod.cods3 << " "
         << cod.cods4 << " " << cod.cods5 << " " << cod.cods6;
    return o;
}
 
ofstream &operator << (ofstream &ofs, const Codorgam &obj)
{
    char ch = 0xFF;
    int i=0;
    for(i=0; i<7; i++)
    {
        ofs.write(&obj.synchro[i], 1);
    }
    for(i=0; i<5; i++)
    {
        ofs.write(&obj.cods1[i], 1);
    }
    for(i=0; i<5; i++)
    {
        ofs.write(&obj.cods2[i], 1);
    }for(i=0; i<5; i++)
    {
        ofs.write(&obj.cods3[i], 1);
    }for(i=0; i<5; i++)
    {
        ofs.write(&obj.cods4[i], 1);
    }
    for(i=0; i<5; i++)
    {
        ofs.write(&obj.cods5[i], 1);
    }
    for(i=0; i<5; i++)
    {
        ofs.write(&obj.cods6[i], 1);
    }
//  ofs.write(&ch, 1);
    return ofs;
}
 
ifstream &operator >> (ifstream &ifs, Codorgam &obj)
{
    ifs >> obj.synchro;
    ifs >> obj.cods1;
    ifs >> obj.cods2;
    ifs >> obj.cods3;
    ifs >> obj.cods4;
    ifs >> obj.cods5;
    ifs >> obj.cods6;
    return ifs;
}
 
Codorgam::Codorgam()
{
    this->synchro = new char[8];
    this->cods1 = new char[6];
    this->cods2 = new char[6];
    this->cods3 = new char[6];
    this->cods4 = new char[6];
    this->cods5 = new char[6];
    this->cods6 = new char[6];
}
 
Codorgam::~Codorgam()
{
    delete [] this->synchro;
    delete [] this->cods1;
    delete [] this->cods2;
    delete [] this->cods3;
    delete [] this->cods4;
    delete [] this->cods5;
    delete [] this->cods6;
}
 
void Codorgam::writeBits(Codorgam &cod)
{
    char cg = 0xFF;
    ifstream ifs("file1.txt");
    ofstream ofs("file2.bit", ios::out|ios::binary);
    ofs.write(&cg, 1);
    while(!ifs.eof())
    {
        if(ifs >> cod.synchro)
        {
            ifs >> cod.cods1;
            ifs >> cod.cods2;
            ifs >> cod.cods3;
            ifs >> cod.cods4;
            ifs >> cod.cods5;
            ifs >> cod.cods6;
            cout << cod << endl;
            ofs << cod;
        }
    }
    ifs.close();
    ofs.close();
}
 
void Codorgam::readBits(Codorgam &cod)
{
    int i=0;
    Codorgam c;
    bool bl = true;
    ifstream ifs("file2.bit", ios::in|ios::binary);
    while(!ifs.eof())
    {
            for(i=0; i<7; i++)
            {
                ifs.read(&cod.synchro[i], 1);
            }
            for(i=0; i<5; i++)
            {
                ifs.read(&cod.cods1[i], 1);
            }
            for(i=0; i<5; i++)
            {
                ifs.read(&cod.cods2[i], 1);
            }
            for(i=0; i<5; i++)
            {
                ifs.read(&cod.cods3[i], 1);
            }
            for(i=0; i<5; i++)
            {
                ifs.read(&cod.cods4[i], 1);
            }
            for(i=0; i<5; i++)
            {
                ifs.read(&cod.cods5[i], 1);
            }
            for(i=0; i<5; i++)
            {
                ifs.read(&cod.cods6[i], 1);
            }
            cout << cod << endl;
    }
    ifs.close();
}
 
int main()
{
    Codorgam cod;
    cod.writeBits(cod);
    cod.readBits(cod);
    system("pause");
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2015, 22:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чтение из бинарного файла (C++):

Чтение нескольких структур и одной переменной из бинарного файла. Формат файла имеется - C++
Формат файла состоит из 3 структур и одной переменной. Подробное описание формата во вложении, просьба посмотреть его. У меня возникла...

Чтение бинарного файла - C++
Добрый Добавлено через 6 минут Добрый день. Не получается прочитать бин. файл. Суть какая: есть файл, в котором записаны дубл...

Чтение из бинарного файла - C++
Всем приветы. Подскажите или помогите, пожалста. Есть вот такая штука: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

Чтение из бинарного файла - C++
Добрый вечер.Возникла проблема при чтении имени объекта из бинарного файла,запись в файл идет по структуре |char|int|double|float|'/0'|...

Чтение бинарного файла - C++
Помогите, пожалуйста, научите, как правильно читать файлы! Есть бинарный файл. В нем хранятся шеснадцатиричные числа. (по 40 чисел в...

Чтение из бинарного файла - C++
Здравствуйте. Столкнулся с проблемой, не до конца понимаю от чего она возникает и как решить её. Открываю для чтения файл в бинарном...

12
lss
921 / 850 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
04.01.2015, 22:59 #2
Цитата Сообщение от Dima_Bro Посмотреть сообщение
Предположим, что существует бинарный файл, записанный "давно"
С помощью writeBits()?
0
Dima_Bro
1 / 1 / 0
Регистрация: 09.04.2014
Сообщений: 16
04.01.2015, 23:00  [ТС] #3
lss, да с помощью writeBits()
0
lss
921 / 850 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
04.01.2015, 23:04 #4
А что в файле "file1.txt"?
0
Dima_Bro
1 / 1 / 0
Регистрация: 09.04.2014
Сообщений: 16
04.01.2015, 23:11  [ТС] #5
lss,
1111100 10010 01101 01010 01011 01110 11010
1111100 01010 11100 01011 01011 01110 01110
1111100 10010 01110 01110 01010 01010 01010
1111100 01010 11101 00000 00000 00000 00000
.....
.....
0
lss
921 / 850 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
04.01.2015, 23:20 #6
Вижу вот эту запись в файл:
C++
1
ofs.write(&cg, 1);
, но не вижу чтения этого.
0
Dima_Bro
1 / 1 / 0
Регистрация: 09.04.2014
Сообщений: 16
04.01.2015, 23:22  [ТС] #7
lss, это я потом поставлю. В старом файле этой записи нет
0
lss
921 / 850 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
04.01.2015, 23:27 #8
Цитата Сообщение от Dima_Bro Посмотреть сообщение
это я потом поставлю. В старом файле этой записи нет
Почему нет, если он записывался:
Цитата Сообщение от Dima_Bro Посмотреть сообщение
да с помощью writeBits()
???

Добавлено через 2 минуты
И как тогда возможно это:
Цитата Сообщение от Dima_Bro Посмотреть сообщение
Но если записать в файл и потом из него считать т.е сначала запустить ф-цию writeBits(), а потом readBits(), все ок.
???

Добавлено через 36 секунд
Ты какой код пробуешь? Тот который выложил?
0
Dima_Bro
1 / 1 / 0
Регистрация: 09.04.2014
Сообщений: 16
04.01.2015, 23:29  [ТС] #9
lss, ofs.write(&cg, 1) в старом файле не записан. Я эту метку запишу позже. Считайте что не видели этой строки кода. Извините за ввод в заблуждение. В старый файл писал только так :
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
ofstream &operator << (ofstream &ofs, const Codorgam &obj)
{
    char ch = 0xFF;
    int i=0;
    for(i=0; i<7; i++)
    {
        ofs.write(&obj.synchro[i], 1);
    }
    for(i=0; i<5; i++)
    {
        ofs.write(&obj.cods1[i], 1);
    }
    for(i=0; i<5; i++)
    {
        ofs.write(&obj.cods2[i], 1);
    }for(i=0; i<5; i++)
    {
        ofs.write(&obj.cods3[i], 1);
    }for(i=0; i<5; i++)
    {
        ofs.write(&obj.cods4[i], 1);
    }
    for(i=0; i<5; i++)
    {
        ofs.write(&obj.cods5[i], 1);
    }
    for(i=0; i<5; i++)
    {
        ofs.write(&obj.cods6[i], 1);
    }
    return ofs;
}
 
void Codorgam::writeBits(Codorgam &cod)
{
    ifstream ifs("file1.txt");
    ofstream ofs("file2.bit", ios::out|ios::binary);
    while(!ifs.eof())
    {
        if(ifs >> cod.synchro)
        {
            ifs >> cod.cods1;
            ifs >> cod.cods2;
            ifs >> cod.cods3;
            ifs >> cod.cods4;
            ifs >> cod.cods5;
            ifs >> cod.cods6;
            cout << cod << endl;
            ofs << cod;
        }
    }
    ifs.close();
    ofs.close();
}
0
lss
921 / 850 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
04.01.2015, 23:43 #10
'\0' в строках нет, вот и выводит лишний мусор. Записываете бинарным методом, без '\0'. Читаете из файла бинарным методом, по символу, откуда '\0' возьмётся?
0
Dima_Bro
1 / 1 / 0
Регистрация: 09.04.2014
Сообщений: 16
04.01.2015, 23:45  [ТС] #11
lss, предлагаете в конце каждого массива вставить '\0' ?
0
lss
921 / 850 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
04.01.2015, 23:48 #12
Цитата Сообщение от Dima_Bro Посмотреть сообщение
предлагаете в конце каждого массива вставить '\0' ?
Предлагай, не предлагай, а cout << будет выводить содержимое памяти пока '\0' не найдёт где-нибудь.
Это уж сами решайте, что делать: или ноль добавлять, или вывод массивов, по символу, в цикле делать.
1
Dima_Bro
1 / 1 / 0
Регистрация: 09.04.2014
Сообщений: 16
04.01.2015, 23:51  [ТС] #13
lss, спасибо, проблема решена добавлением '\0' последним символом в массиве.
0
04.01.2015, 23:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2015, 23:51
Привет! Вот еще темы с ответами:

Чтение бинарного файла - C++
Привет! Необходима помощь в таком вопросе - Создал программу для хранения сведений о пользователях(типа такого: введите сведения: ...

Чтение бинарного файла - C++
подскажите пожалуйста как можно из любого файла(*.bmp, *.mp3, *.avi и т.д.) получить двоичное представление этого файла или хотя бы считать...

Чтение из бинарного файла - C++
Создала Базу данных. запись в файл происходит, а чтение из файла не получается. исправьте, пожалуйста, или подскажите как? #include...

Чтение бинарного файла - C++
Подскажите пожалуйста как можно правильно открыть бинарный файл не зная структуры? С чего мне начать? Вот пример:


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

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