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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
Radgalf
0 / 0 / 0
Регистрация: 08.01.2013
Сообщений: 39
07.06.2013, 03:47     Чтение из бинарного файла #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
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
#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
fstream writ;    // чтение
ofstream out;    //  запись
int vsego=0;
struct NOTEBOOK {
     
    int x;          //разрешающая способность дисплея по горизонтали
    int y;        //  по вертикали
    float massa;        // масса
    float ix,iy,is;        // габаритные размеры ноутбука в дюймах ВЫСОТАхДЛИНАхШИРИНА
    int mb;        //   максимальный объем ОЗУ в мегабайтах
    int sv;        //   размер видеопамяти в мегабайтах
    float mg;    //   частота процессора в МГц
    float ggb;        // объем HDD в гигабайтах
    int f;                              //  частота регенерации
    float d;                          //  размер диагонали дисплея
    int price;                        //  цена
    char model[20];            //  наименование
}not[3],n[3];;
NOTEBOOK inStruct (NOTEBOOK not[], int i )
{    // Функция чтения данных из файла в структуру
    char c;
    for ( int j = 0; j<19; j++ )
    {
        writ.get(c);
        not[i].model[j] = c;
    }
    not[i].model[19] = '\0';
    writ>>not[i].price;
    writ>>not[i].massa;
    writ>>not[i].ix;
    writ>>c;
    writ>>not[i].iy;
    writ>>c;
    writ>>not[i].is;
    writ>>not[i].mg;
    writ>>not[i].mb;
    writ>>not[i].d;
    writ>>not[i].sv;
    writ>>not[i].x;
    writ>>c;
    writ>>not[i].y;
    writ>>not[i].f;
    writ>>not[i].ggb;
    return not[i];
};
void fprint(NOTEBOOK n[], int i)
{    //  функция записи в файл "note.dat"
out.write((char*)(&not[i]),sizeof(NOTEBOOK));
};
 
void main()
{ const int X=3;
    writ.open("note.txt");
    NOTEBOOK not[X],n[X];
    for (int i=0; i<X; i++ )
        inStruct( not,i );
    writ.close();
    writ.clear();
 
    out.open( "note.dat", ios_base::binary|ios_base::in|ios_base::out);
    out.seekp(ios::beg);
    out.write(reinterpret_cast<char*>(&vsego),sizeof(int));
    
    for ( int i=0; i<X; i++ )
    {
        if ( not[i].massa < 7 ){
            vsego++;
            fprint( not, i );
    }
    }
    out.seekp(ios::beg);
    out.write(reinterpret_cast<char*>(&vsego),sizeof(int));
    out<<endl;
    out.close();
 
 
    vsego=0;
    writ.open("note.dat", ios_base::binary|ios_base::in|ios_base::out );
    writ.read(reinterpret_cast<char*>(&vsego),sizeof(int));
    for (int i=0;i<vsego;i++){
    writ.read((char*)(&not[i]),sizeof(NOTEBOOK));
    }
 
    for (int i=0;i<vsego;i++){
        cout<<not[i].x<<" ";
        cout<<not[i].y<<" ";
        cout<<not[i].massa<<" ";
        cout<<not[i].ix<<" ";
        cout<<not[i].iy<<" ";
        cout<<not[i].is<<" ";
        cout<<not[i].mb<<" ";
        cout<<not[i].sv<<" ";
        cout<<not[i].mg<<" ";
        cout<<not[i].ggb<<" ";  
        cout<<not[i].f<<" ";
        cout<<not[i].d<<" ";        
        cout<<not[i].price<<" ";
        cout<<not[i].model[19]<<" ";
    }
 
    cin.get();        // ожидание нажатия кл. Enter
}

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

Все успешно работает но в 86 строчке ( writ.read((char*)(&not[i]),sizeof(NOTEBOOK)); ) программа почему то обнуляет все считанные данные =(
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2013, 03:47     Чтение из бинарного файла
Посмотрите здесь:

C++ Чтение из бинарного файла
чтение бинарного файла C++
чтение бинарного файла C++
C++ Чтение из бинарного файла
C++ Чтение бинарного файла
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.06.2013, 04:59     Чтение из бинарного файла #2
C++
1
2
3
4
void fprint(NOTEBOOK n[], int i)
{    //  функция записи в файл "note.dat"
    out.write((char*)&n[i], sizeof(NOTEBOOK));
};
Radgalf
0 / 0 / 0
Регистрация: 08.01.2013
Сообщений: 39
07.06.2013, 05:35  [ТС]     Чтение из бинарного файла #3
Спасибо и правда заработало все.
Но теперь всплыла новая проблема, к первой извлекаемой записи
C++
1
cout<<not[i].x<<" ";
в первом случае прибавляется 10,
в следующем случае все нормально.

Я так понимаю прибавка 10 делается из-за записи vsego в начало файла...
Можно это каким-либо образом исправить?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.06.2013, 05:39     Чтение из бинарного файла #4
В 78 строке:
C++
1
out<<endl;
Это и есть те 10. Нужно убрать. При бинарной записи так не делается.
Radgalf
0 / 0 / 0
Регистрация: 08.01.2013
Сообщений: 39
07.06.2013, 12:35  [ТС]     Чтение из бинарного файла #5
alsav22, спасибо, все работает!

Добавлено через 3 минуты
Ахтунг! Программа перестала адекватно работать. Не создается бинарный файл "note.dat" вообще =(

Причем ни в старом коде, ни в коде с поправками.
Создавал новый проект, запускал от админа и все равно не работает (
Как можно исправить?

Добавлено через 58 минут
А теперь все робит.
Radgalf
0 / 0 / 0
Регистрация: 08.01.2013
Сообщений: 39
08.06.2013, 18:08  [ТС]     Чтение из бинарного файла #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
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
// 53y636.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
fstream writ;    // чтение
ofstream out;    //  запись
ifstream prov;
int vsego=0;
struct NOTEBOOK {
     
    int x;          //разрешающая способность дисплея по горизонтали
    int y;        //  по вертикали
    float massa;        // масса
    float ix,iy,is;        // габаритные размеры ноутбука в дюймах ВЫСОТАхДЛИНАхШИРИНА
    int mb;        //   максимальный объем ОЗУ в мегабайтах
    int sv;        //   размер видеопамяти в мегабайтах
    float mg;    //   частота процессора в МГц
    float ggb;        // объем HDD в гигабайтах
    int f;                              //  частота регенерации
    float d;                          //  размер диагонали дисплея
    int price;                        //  цена
    char model[20];            //  наименование
}not[3],n[3],y[3];
NOTEBOOK inStruct (NOTEBOOK not[], int i )
{    // Функция чтения данных из файла в структуру
    char c;
    for ( int j = 0; j<19; j++ )
    {
        writ.get(c);
        not[i].model[j] = c;
    }
    not[i].model[19] = '\0';
    writ>>not[i].price;
    writ>>not[i].massa;
    writ>>not[i].ix;
    writ>>c;
    writ>>not[i].iy;
    writ>>c;
    writ>>not[i].is;
    writ>>not[i].mg;
    writ>>not[i].mb;
    writ>>not[i].d;
    writ>>not[i].sv;
    writ>>not[i].x;
    writ>>c;
    writ>>not[i].y;
    writ>>not[i].f;
    writ>>not[i].ggb;
    return not[i];
};
void fprint(NOTEBOOK n[], int i)
{    //  функция записи в файл "note.dat"
out.write(reinterpret_cast<char*>(&n[i]),sizeof(NOTEBOOK));
};
 
void main()
{ const int X=3;
int select=0;
int a=0,b=0;
    writ.open("note.txt");
    NOTEBOOK not[X],n[X],y[X];
    for (int i=0; i<X; i++ )
        inStruct( not,i );
    writ.close();
    writ.clear();
 
    ifstream in("note.dat", ios_base::binary);
    if (!in)
    {b++;}
    else{a++;}
    in.close();
 
    if (b==1){
        out.open("note.dat", ios_base::binary|ios_base::out);
        out.write(reinterpret_cast<char*>(&vsego),sizeof(int));
        out.close();
    }
    if (a==1){
        writ.open("note.dat", ios_base::binary|ios_base::in );
        writ.read(reinterpret_cast<char*>(&vsego),sizeof(int));
        writ.close();
    }
 
 
cout<<"M E N U\n-------------------\n";
cout<<"1. Perevod dannih v note.dat\n";
cout<<"2. Vivod dannih iz note.dat na ekran\n";
cout<<"3. Vihod";
while (1)
    {
        cout<<"\nVash vibor? ";
        cin>>select;
 
        switch (select)
        {
        case 1:         
            for ( int i=0; i<X; i++ ){
                if ( not[i].massa < 7 ){
                    vsego++;
                }
            }
            out.open("note.dat", ios_base::binary|ios_base::out);
            out.write(reinterpret_cast<char*>(&vsego),sizeof(int));
            out.close();
 
            out.open("note.dat", ios_base::binary|ios_base::out|ios_base::app);
            for ( int i=0; i<X; i++ ){
                if ( not[i].massa < 7 ){
                    fprint( not, i );
                }
            }
            out.close();
            break;
        
        case 2:
            writ.open("note.dat", ios_base::binary|ios_base::in);
            writ.seekp(ios::beg);
            writ.read(reinterpret_cast<char*>(&vsego),sizeof(int));
            for (int i=0;i<vsego;i++){
                writ.read(reinterpret_cast<char*>(&y[i]),sizeof(NOTEBOOK));
            }
 
            for (int i=0;i<vsego;i++){
                cout<<y[i].x<<"x";
                cout<<y[i].y<<" ";
                cout<<y[i].massa<<" ";
                cout<<y[i].ix<<"x";
                cout<<y[i].iy<<"x";
                cout<<y[i].is<<" ";
                cout<<y[i].mb<<" ";
                cout<<y[i].sv<<" ";
                cout<<y[i].mg<<" ";
                cout<<y[i].ggb<<" ";  
                cout<<y[i].f<<" ";
                cout<<y[i].d<<" ";        
                cout<<y[i].price<<" ";
                cout<<y[i].model<<" \n";
            }
            break;
        case 3:
            exit(0);
            break; 
        }
}
 
}
Но в нем появилась новая фича:
когда мы запускаем программу, жмем 1, затем 2. Все норм. на консоле видны 2 объекта, как и положено, но стоит еще раз нажать 1 и 2, как появляются еще 2 объекта, и почему то не такие же как предыдущие...

При втором выполнении:
C++
1
2
3
for (int i=0;i<vsego;i++){
writ.read(reinterpret_cast<char*>(&y[i]),sizeof(NOTEBOOK));
}
первые два объекта считываются нормально, а вот последние, отвратительно(набор цифр и символов), хотя при записи в файл все происходит ровно...

В этот раз прилагаю текстовый файл с объектами.

Надеюсь кто-нибудь да поможет, уже устал с этими потоками возиться =(
Вложения
Тип файла: txt note.txt (229 байт, 8 просмотров)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.06.2013, 18:22     Чтение из бинарного файла #7
Почему данные в файле не в бинарном режиме записаны?
Radgalf
0 / 0 / 0
Регистрация: 08.01.2013
Сообщений: 39
08.06.2013, 18:28  [ТС]     Чтение из бинарного файла #8
alsav22, потому что это изначальный файл, который нужно считать, найти в нем ноуты с весом меньше 7 кг, и записать эти самые ноуты в бинарный файл, а затем из бинарного считать все записи и вывести их на экран.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.06.2013, 22:00     Чтение из бинарного файла #9
Зачем вам три глобальных массива структур:
C++
1
not[3], n[3], y[3];
и три в main() с теми же именами:
C++
1
NOTEBOOK not[X], n[X], y[X];
Добавлено через 1 минуту
C++
1
2
writ.close();
writ.clear();
После close и так будет clear.

Добавлено через 12 минут
Зачем делать в структуре (или в файле) другой порядок следования полей? Чтобы потом путаться?

Добавлено через 14 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
...
switch (select)
        {
        case 1:         
            vsego = 0; // !!!
            
            for ( int i=0; i<X; i++ )
            {
                if ( not[i].massa < 7 )
                {
                    vsego++;
                }
            }
...
Добавлено через 32 минуты
Функцию чтения из текстового файла (после каждой строки в файле должен быть '\n') дописать:
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
NOTEBOOK inStruct (NOTEBOOK not[], int i )
{    // Функция чтения данных из файла в структуру
    char c;
    for ( int j = 0; j<19; j++ )
    {
        writ.get(c);
        not[i].model[j] = c;
    }
    not[i].model[19] = '\0';
    writ>>not[i].price;
    writ>>not[i].massa;
    writ>>not[i].ix;
    writ>>c;
    writ>>not[i].iy;
    writ>>c;
    writ>>not[i].is;
    writ>>not[i].mg;
    writ>>not[i].mb;
    writ>>not[i].d;
    writ>>not[i].sv;
    writ>>not[i].x;
    writ>>c;
    writ>>not[i].y;
    writ>>not[i].f;
    writ>>not[i].ggb;
    
    writ.get(); // !!!
    
    return not[i];
};
Иначе символ новой строки попадает в файл .dat, потом, при выводе строк после первой, виден. В выложенном текстовом файле добавить в конец последней строки - '\n' (хотя и так будет работать, но лучше, чтобы строки в тексте были одинакового формата).

Добавлено через 13 минут
Подгонять размер наименования под 19 символов - не хорошо. Лучше так сделать. Файл должен быть такого вида:
Acer Note Light
2699 5.6 02.0x11.8x08.3 100 40 10.4 1 1024x0768 60 0.774
ASW ND5123T
3489 6.9 02.3x11.8x10.1 133 32 12.1 2 1024x0768 70 1.300
ARMNote TS80CD
3699 7.5 02.0x11.5x08.8 133 64 11.3 1 1024x0768 75 1.300
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
...
const int N = 30; // максимальное количество символов в наименовании N - 1
...
char model[N]; //  наименование
...
NOTEBOOK inStruct (NOTEBOOK not[], int i )
{    // Функция чтения данных из файла в структуру
    
    char c;
    
    writ.getline(not[i].model, N);
    
    writ>>not[i].price;
    writ>>not[i].massa;
    writ>>not[i].ix;
    writ>>c;
    writ>>not[i].iy;
    writ>>c;
    writ>>not[i].is;
    writ>>not[i].mg;
    writ>>not[i].mb;
    writ>>not[i].d;
    writ>>not[i].sv;
    writ>>not[i].x;
    writ>>c;
    writ>>not[i].y;
    writ>>not[i].f;
    writ>>not[i].ggb;
    writ.get(); 
    
    return not[i];
}
...
Radgalf
0 / 0 / 0
Регистрация: 08.01.2013
Сообщений: 39
09.06.2013, 14:52  [ТС]     Чтение из бинарного файла #10
Цитата Сообщение от alsav22 Посмотреть сообщение
Подгонять размер наименования под 19 символов - не хорошо.
Не сказал бы что это есть плохо, в задаче четко указано что с 1 по 20 поле в файле записано наименование.

Остальные поправки сейчас применю.

Добавлено через 22 минуты
Цитата Сообщение от alsav22 Посмотреть сообщение
Зачем делать в структуре (или в файле) другой порядок следования полей? Чтобы потом путаться?
Так необходимо по заданию, в текстовом файле один порядок данных, в структуре и в бинарном - обратный.

Цитата Сообщение от alsav22 Посмотреть сообщение
C++
1
vsego = 0; // !!!
Вот этого откровенно не понял, мне необходимо, что бы выводились ВСЕ данные, а так получается что выходят только те, которые были добавлены сейчас.
Radgalf
0 / 0 / 0
Регистрация: 08.01.2013
Сообщений: 39
09.06.2013, 15:05  [ТС]     Чтение из бинарного файла #11
Ну и вот, все что подходило к заданию я добавил, получил следующее:
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
// 53y636.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
fstream writ;    // чтение
ofstream out;    //  запись
ifstream prov;
int vsego=0;
const int X=3;
const int N = 30; 
struct NOTEBOOK {
     
    int x;          //разрешающая способность дисплея по горизонтали
    int y;        //  по вертикали
    float massa;        // масса
    float ix,iy,is;        // габаритные размеры ноутбука в дюймах ВЫСОТАхДЛИНАхШИРИНА
    int mb;        //   максимальный объем ОЗУ в мегабайтах
    int sv;        //   размер видеопамяти в мегабайтах
    float mg;    //   частота процессора в МГц
    float ggb;        // объем HDD в гигабайтах
    int f;                              //  частота регенерации
    float d;                          //  размер диагонали дисплея
    int price;                        //  цена
    char model[N];            //  наименование
}not[X],n[X],y[X];
NOTEBOOK inStruct (NOTEBOOK not[], int i )
{    // Функция чтения данных из файла в структуру
    
    char c;
    
    writ.getline(not[i].model, N);
    
    writ>>not[i].price;
    writ>>not[i].massa;
    writ>>not[i].ix;
    writ>>c;
    writ>>not[i].iy;
    writ>>c;
    writ>>not[i].is;
    writ>>not[i].mg;
    writ>>not[i].mb;
    writ>>not[i].d;
    writ>>not[i].sv;
    writ>>not[i].x;
    writ>>c;
    writ>>not[i].y;
    writ>>not[i].f;
    writ>>not[i].ggb;
    writ.get(); 
    
    return not[i];
}
void fprint(NOTEBOOK n[], int i)
{    //  функция записи в файл "note.dat"
out.write(reinterpret_cast<char*>(&n[i]),sizeof(NOTEBOOK));
};
 
void main()
{int select=0;
int a=0,b=0;
    writ.open("note.txt");
    for (int i=0; i<X; i++ )
        inStruct( not,i );
    writ.close();
 
    ifstream in("note.dat", ios_base::binary);
    if (!in)
    {b++;}
    else{a++;}
    in.close();
 
    if (b==1){
        out.open("note.dat", ios_base::binary|ios_base::out);
        out.write(reinterpret_cast<char*>(&vsego),sizeof(int));
        out.close();
    }
    if (a==1){
        writ.open("note.dat", ios_base::binary|ios_base::in );
        writ.read(reinterpret_cast<char*>(&vsego),sizeof(int));
        writ.close();
    }
 
 
cout<<"M E N U\n-------------------\n";
cout<<"1. Perevod dannih v note.dat\n";
cout<<"2. Vivod dannih iz note.dat na ekran\n";
cout<<"3. Vihod";
while (1)
    {
        cout<<"\nVash vibor? ";
        cin>>select;
 
   switch (select)
        {
        case 1:         
            
            for ( int i=0; i<X; i++ )
            {
                if ( not[i].massa < 7 )
                {
                    vsego++;
                }
            }
 
            out.open("note.dat", ios_base::binary|ios_base::out);
            out.write(reinterpret_cast<char*>(&vsego),sizeof(int));
            out.close();
 
            out.open("note.dat", ios_base::binary|ios_base::out|ios_base::app);
            for ( int i=0; i<X; i++ ){
                if ( not[i].massa < 7 ){
                    fprint( not, i );
                }
            }
            out.close();
            break;
        
        case 2:
            writ.open("note.dat", ios_base::binary|ios_base::in);
            writ.seekp(ios::beg);
            writ.read(reinterpret_cast<char*>(&vsego),sizeof(int));
            writ.seekp(sizeof(int));
            for (int i=0;i<vsego;i++){
                writ.read(reinterpret_cast<char*>(&n[i]),sizeof(NOTEBOOK));
            }
 
            for (int i=0;i<vsego;i++){
                cout<<n[i].x<<"x";
                cout<<n[i].y<<" ";
                cout<<n[i].massa<<" ";
                cout<<n[i].ix<<"x";
                cout<<n[i].iy<<"x";
                cout<<n[i].is<<" ";
                cout<<n[i].mb<<" ";
                cout<<n[i].sv<<" ";
                cout<<n[i].mg<<" ";
                cout<<n[i].ggb<<" ";  
                cout<<n[i].f<<" ";
                cout<<n[i].d<<" ";        
                cout<<n[i].price<<" ";
                cout<<n[i].model<<" \n";
            }
            break;
        case 3:
            exit(0);
            break; 
        }
}
 
}
И вновь появился старый баг, который я описывал в самом первом посте:
при втором процессе записи и чтения, в чтении первые две строки верные, следующие 1 полностью нулевая, через пару таких процессов снова получаю верные данные, а так же простой набор символов.

Так же как вы и советовали, все же изменил текстовый файл и установил размер char до N=30.
Но ситуации это не исправило =(
Миниатюры
Чтение из бинарного файла  
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.06.2013, 21:08     Чтение из бинарного файла #12
Цитата Сообщение от Radgalf Посмотреть сообщение
мне необходимо, что бы выводились ВСЕ данные
Все это какие? Из файла? В файл вы записываете только то, что соответствует условию. Входной файл у вас не меняется, поэтому никаких новых данных нет. При повторном нажатии 1 и 2 всё будет повторяться. Будет снова перебираться тот же массив, считаться количество нужных записей, делаться запись в файл (того же), потом это выводится (при нажатии 2).
C++
1
vsego = 0; // !!!
Цитата Сообщение от Radgalf Посмотреть сообщение
Вот этого откровенно не понял
vsego у вас объявлена глобвльно, при каждом новом нажатии на 1 к старому значению vsego будут прибавляться новое. Эта переменная записывается в файл и потом используется при чтении из файл и выводе в циклах for(). Получается вывод мусора. Поэтому, при каждом новом нажатии на 1, эту переменную нужно обнулять.

Добавлено через 4 минуты
К тому же, если увеличивать размер vsego, и записывать новые данные в файл, то у вас, количество читаемых данных , перестаёт соответствовать размеру массива куда данные читаются из файла перед выводом.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.06.2013, 21:15     Чтение из бинарного файла #13
Если так переписать, то будет так выводить (добавлять то же самое, и выводить с добавленным):
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
// 53y636.cpp: определяет точку входа для консольного приложения.
//
 
 
#include <iostream>
#include <fstream>
using namespace std;
fstream writ;    // чтение
ofstream out;    //  запись
ifstream prov;
int vsego=0;
const int X=3;
const int N = 30; 
struct NOTEBOOK {
     
    int x;          //разрешающая способность дисплея по горизонтали
    int y;        //  по вертикали
    float massa;        // масса
    float ix,iy,is;        // габаритные размеры ноутбука в дюймах ВЫСОТАхДЛИНАхШИРИНА
    int mb;        //   максимальный объем ОЗУ в мегабайтах
    int sv;        //   размер видеопамяти в мегабайтах
    float mg;    //   частота процессора в МГц
    float ggb;        // объем HDD в гигабайтах
    int f;                              //  частота регенерации
    float d;                          //  размер диагонали дисплея
    int price;                        //  цена
    char model[N];            //  наименование
}not[X],n[X],y[X];
NOTEBOOK inStruct (NOTEBOOK not[], int i )
{    // Функция чтения данных из файла в структуру
    
    char c;
    
    writ.getline(not[i].model, N);
    
    writ>>not[i].price;
    writ>>not[i].massa;
    writ>>not[i].ix;
    writ>>c;
    writ>>not[i].iy;
    writ>>c;
    writ>>not[i].is;
    writ>>not[i].mg;
    writ>>not[i].mb;
    writ>>not[i].d;
    writ>>not[i].sv;
    writ>>not[i].x;
    writ>>c;
    writ>>not[i].y;
    writ>>not[i].f;
    writ>>not[i].ggb;
    writ.get(); 
    
    return not[i];
}
void fprint(NOTEBOOK n[], int i)
{    //  функция записи в файл "note.dat"
out.write(reinterpret_cast<char*>(&n[i]),sizeof(NOTEBOOK));
};
 
void main()
{int select=0;
int a=0,b=0;
    writ.open("note.txt");
    for (int i=0; i<X; i++ )
        inStruct( not,i );
    writ.close();
 
    ifstream in("note.dat", ios_base::binary);
    if (!in)
    {b++;}
    else{a++;}
    in.close();
 
    if (b==1){
        out.open("note.dat", ios_base::binary|ios_base::out);
        out.write(reinterpret_cast<char*>(&vsego),sizeof(int));
        out.close();
    }
    if (a==1){
        writ.open("note.dat", ios_base::binary|ios_base::in );
        writ.read(reinterpret_cast<char*>(&vsego),sizeof(int));
        writ.close();
    }
 
 
cout<<"M E N U\n-------------------\n";
cout<<"1. Perevod dannih v note.dat\n";
cout<<"2. Vivod dannih iz note.dat na ekran\n";
cout<<"3. Vihod";
while (1)
    {
        cout<<"\nVash vibor? ";
        cin>>select;
 
   switch (select)
        {
        case 1:         
            //vsego = 0;
            for ( int i=0; i<X; i++ )
            {
                if ( not[i].massa < 7 )
                {
                    vsego++;
                }
            }
 
            out.open("note.dat", ios_base::binary|ios_base::out|ios_base::in);
            out.write(reinterpret_cast<char*>(&vsego),sizeof(int));
            out.close();
 
            out.open("note.dat", ios_base::binary|ios_base::out|ios_base::app);
            for ( int i=0; i<X; i++ ){
                if ( not[i].massa < 7 ){
                    fprint( not, i );
                }
            }
            out.close();
            break;
        
        case 2:
            writ.open("note.dat", ios_base::binary|ios_base::in);
            writ.read(reinterpret_cast<char*>(&vsego),sizeof(int));
            
            NOTEBOOK temp;
            for (int i=0;i<vsego;i++)
            {
                writ.read(reinterpret_cast<char*>(&temp),sizeof(NOTEBOOK));
            
                cout<<temp.x<<"x";
                cout<<temp.y<<" ";
                cout<<temp.massa<<" ";
                cout<<temp.ix<<"x";
                cout<<temp.iy<<"x";
                cout<<temp.is<<" ";
                cout<<temp.mb<<" ";
                cout<<temp.sv<<" ";
                cout<<temp.mg<<" ";
                cout<<temp.ggb<<" ";  
                cout<<temp.f<<" ";
                cout<<temp.d<<" ";        
                cout<<temp.price<<" ";
                cout<<temp.model<<" \n";
            }
            writ.close();
            break;
        case 3:
            exit(0);
            break; 
        }
}
 
}
Миниатюры
Чтение из бинарного файла  
Radgalf
0 / 0 / 0
Регистрация: 08.01.2013
Сообщений: 39
12.06.2013, 16:11  [ТС]     Чтение из бинарного файла #14
alsav22, огромное спасибо!
Все прекрасно работает, надеюсь препод тоже оценит=)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.06.2013, 20:08     Чтение из бинарного файла
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
alsav22
12.06.2013, 20:08     Чтение из бинарного файла
  #15

Не по теме:

Цитата Сообщение от Radgalf Посмотреть сообщение
огромное спасибо!
Я плюсы коллекционирую.

Yandex
Объявления
12.06.2013, 20:08     Чтение из бинарного файла
Ответ Создать тему
Опции темы

Текущее время: 17:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru