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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
Radgalf
0 / 0 / 0
Регистрация: 08.01.2013
Сообщений: 39
#1

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

07.06.2013, 03:47. Просмотров 1723. Ответов 14
Метки нет (Все метки)

Всем приветы.
Подскажите или помогите, пожалста.
Есть вот такая штука:
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++
Помогите, пожалуйста, научите, как правильно читать файлы! Есть бинарный файл. В нем хранятся шеснадцатиричные числа. (по 40 чисел в...

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

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

Чтение бинарного файла - C++
как получить доступ к произвольному адресу файла? Нужно отправить файл через ком порт но не с 0 а с адреса 1а000 в цикле по 0х100 байт. с 0...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5416 / 4812 / 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
5416 / 4812 / 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
5416 / 4812 / 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
5416 / 4812 / 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
5416 / 4812 / 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
5416 / 4812 / 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++
Здравствуйте. Есть код чтения бинарного файла: FILE *f; string tmp; char buff = {0}; f = fopen(&quot;data.bin&quot;, &quot;rb&quot;); if(f ==...

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

Чтение из бинарного файла - C++
Здравствуйте. У меня имеется некий класс Product, объекты которого хранятся в объекте класса Vector. Есть функция записи вектора в бинарный...

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

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


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

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

Не по теме:

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

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

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