Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Kot11
0 / 0 / 0
Регистрация: 29.10.2015
Сообщений: 17
1

Запись структуры "Ноутбук" в бинарный файл

02.11.2015, 22:52. Просмотров 424. Ответов 13
Метки нет (Все метки)

Добрый вечер! Мужики дайте совет, уже все облазил. Мне дали задание (его часть) - 1. написать функцию, которая читает данные о ноутбуках из файла note.txt в структуру приведенного вида. 2. написать функцию, которая записывает содержимое структуры в конец бинарного файла. Структура бинарного файла: первые 2 байта - число записей, далее записи в формате структуры.
Первое я сделал, у меня считывает информацию из файла и выводит в консоли. Но проблема со вторым, никак не могу разобраться. Может кто натолкнет на мысль.
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
#include <iostream>
#include <fstream>
using namespace std;
struct notebook{
    struct disp_res{
        int x;
        int y;
    };
    int f;
    float d;
    int price;
    char model[21];
    };
void read(notebook &note1, notebook::disp_res &disp1){
    ifstream in("111.txt");
if(!in){
        cout<<"Невозможно открыть файл"<<endl;
    }
    cout<<"Model \t"<<"Freq \t"<<"Diag \t"<<"Scar \t\t"<<"price"<<endl;
    //for(int i=0;i<2;i++){
    while(!in.eof()){
        in>>note1.model;
        cout<<note1.model<<"\t";
        in>>note1.f;
        cout<<note1.f<<"\t";
        in>>note1.d;
        cout<<note1.d<<"\t";
        in>>disp1.x;
        in>>disp1.y;
        cout<<disp1.x<<"x"<<disp1.y<<"\t";
        in>>note1.price;
        cout<<note1.price<<endl;
    }
}
void output(notebook &note1, notebook::disp_res &disp1){
    ofstream out("111.bin",ios::binary);
    if(!out)
        cout<<"Error file"<<endl;
    //for(int i=0;i<3;i++){ 
    while(!out.eof()){
        out.write((char*) &note1.model, sizeof(note1.model));
        out.write((char*) &note1.f,sizeof(note1.f));
        out.write((char*) &note1.d,sizeof(note1.d));
        out.write((char*) &disp1.x,sizeof(disp1.x));
        out.write((char*) &disp1.y,sizeof(disp1.y));
        out.write((char*) &note1.price,sizeof(note1.price));
 
    }
}
void main(){
    
    notebook note;
    notebook::disp_res disp;
    
    read(note,disp);
    output(note,disp);
 
    system("Pause");
 
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.11.2015, 22:52
Ответы с готовыми решениями:

Функции и файлы. Чтение и запись данных в файл. Структура "Ноутбук"
Приветствую. Помогите, пожалуйста, с программой. Для хранения данных о ноутбуках описать...

Запись структуры "Студент" в файл
исправьте пожалуйста мои ошибки: 1)Error 1 error C3867:...

Запись структуры в бинарный файл
Добрый вечере,народ. Нужна функция,которая будет записывать структуру в бинарный файл.То есть...

Запись/Чтение структуры в файл (бинарный)
Всем привет! у меня такая задачка, очень простая. Нужно записать структуру в файл, а потом хочу...

Определить тип данных "Запись", имеющий поля "Фамилия", "Пол", "Зарплата"
определить тип данных запись имеющий поля фамилия пол зарплата. определить массив из 10 записей. в...

13
nmcf
6525 / 5749 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
02.11.2015, 23:17 2
Записываешь структуру целиком:
C++
1
out.write(reinterpret_cast<char *>(&note1), sizeof(notebook));
Файл открывать в режиме добавления:
C++
1
ofstream out("111.bin", ios::binary | ios::ate);
0
Kot11
0 / 0 / 0
Регистрация: 29.10.2015
Сообщений: 17
04.11.2015, 13:55  [ТС] 3
Пробовал так делать, но в таком случае оно бесконечно записывает в бинарный файл 111.bin последнюю строку
0
nmcf
6525 / 5749 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
04.11.2015, 15:03 4
Показывай.
0
Kot11
0 / 0 / 0
Регистрация: 29.10.2015
Сообщений: 17
04.11.2015, 19:16  [ТС] 5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void output(notebook &note1, notebook::disp_res &disp1){
    ofstream out("111.bin",ios::binary|ios::ate);
    if(!out)
        cout<<"Error file"<<endl;
    //for(int i=0;i<3;i++){ 
    while(!out.eof()){
        out.write(reinterpret_cast<char*> (&note1), sizeof(notebook));
        /*out.write((char*) &note1.f,sizeof(note1.f));
        out.write((char*) &note1.d,sizeof(note1.d));
        out.write((char*) &disp1.x,sizeof(disp1.x));
        out.write((char*) &disp1.y,sizeof(disp1.y));
        out.write((char*) &note1.price,sizeof(note1.price));*/
 
    }
}
как один из методов, пытался разобраться с перегрузками операторов ввода-вывода, но уж больно там все запутано
0
nmcf
6525 / 5749 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
04.11.2015, 19:32 6
Для чего здесь 6-я строка? Ты записываешь, какой смысл в проверке eof()? У тебя всего одна структура на входе, значит цикл не нужен.
0
Kot11
0 / 0 / 0
Регистрация: 29.10.2015
Сообщений: 17
04.11.2015, 19:46  [ТС] 7
согласен, тоже над этим думал. Но и без цикла запись ведет себя странно
А это исходные данные файла 111.txt :
Note1 10 13.2 1000 1100 1000
Note2 20 15.6 1200 1300 2000
Note3 30 17.2 1400 1500 3000
0
Миниатюры
Запись структуры "Ноутбук" в бинарный файл   Запись структуры "Ноутбук" в бинарный файл  
nmcf
6525 / 5749 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
04.11.2015, 22:51 8
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
#include <iostream>
#include <fstream>
using namespace std;
struct notebook{
    struct disp_res{
        int x;
        int y;
    } dr;
    int f;
    float d;
    int price;
    char model[21];
    };
 
int read(notebook note[])
{
    int i;
    ifstream in("111.txt");
if(!in){
        cout<<"Невозможно открыть файл"<<endl;
    }
    cout<<"Model \t"<<"Freq \t"<<"Diag \t"<<"Scar \t\t"<<"price"<<endl;
 
    for (i = 0; !in.eof(); ++i)
    {
        in>>note[i].model;
        cout<<note[i].model<<"\t";
        in>>note[i].f;
        cout<<note[i].f<<"\t";
        in>>note[i].d;
        cout<<note[i].d<<"\t";
        in>>note[i].dr.x;
        in>>note[i].dr.y;
        cout<<note[i].dr.x<<"x"<<note[i].dr.y<<"\t";
        in>>note[i].price;
        cout<<note[i].price<<endl;
    }
    return i;
}
void output(notebook note[], int count)
{
    ofstream out("111.bin",ios::binary | ios::ate);
    if(!out)
        cout<<"Error file"<<endl;
    out.write(reinterpret_cast<char*> (note), sizeof(notebook) * count);
}
 
int main(){
    
    notebook note[100];
    
    int count = read(note);
    output(note, count);
 
    system("Pause");
 
}
0
Kot11
0 / 0 / 0
Регистрация: 29.10.2015
Сообщений: 17
05.11.2015, 20:28  [ТС] 9
Спасибо большое за помощь!! Но в Вашем коде тоже были ошибки, при записи.
Вот готовый рабочий код, если кому пригодится
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
#include <iostream>
#include <fstream>
 
using namespace std;
struct notebook{
    struct disp_res{
        int x;
        int y;
    } dr;
    int f;
    float d;
    int price;
    char model[21];
    };
void input(){
    int  rec=0;
 
    ofstream out("111.txt",ios::out|ios::in|ios::app);
if(!out){
        cout<<"Невозможно открыть файл"<<endl;
    }
 
    cout<<"Enter size ";
    cin>>rec;
 
 
    notebook *New_Data=(notebook*)malloc(rec*sizeof(notebook));
    for(int j=0;j<rec;j++){
        cout<<"note.model \t";
        cin.getline(New_Data[j].model,21);
        cin.getline(New_Data[j].model,21);
        cout<<"note.f \t";
        cin>>New_Data[j].f;
        
        cout<<"note.d \t";
        cin>>New_Data[j].d;
        
        cout<<"note.dr.x \t";
        cin>>New_Data[j].dr.x;
        
        cout<<"note.dr.y \t";
        cin>>New_Data[j].dr.y;
        
        cout<<"note.price \t";
        cin>>New_Data[j].price;
        
    }
    for(int j=0;j<rec;j++){
        out<<endl;
        out<<New_Data[j].model<<" ";
        out<<New_Data[j].f<<" ";
        out<<New_Data[j].d<<" ";
        out<<New_Data[j].dr.x<<" ";
        out<<New_Data[j].dr.y<<" ";
        out<<New_Data[j].price;
    }
    out.close();
    //return *New_Data;
}
int read(notebook note[])
{
    int i;
    ifstream in("111.txt");
if(!in){
        cout<<"Невозможно открыть файл"<<endl;
    }
 
    cout<<"Model \t"<<"Weight \t"<<"Diag \t"<<"Scar \t\t"<<"price"<<endl;
    for (i = 0; !in.eof(); i++)
    {
        in>>note[i].model;
        cout<<note[i].model<<"\t";
        in>>note[i].f;
        cout<<note[i].f<<"\t";
        in>>note[i].d;
        cout<<note[i].d<<"\t";
        in>>note[i].dr.x;
        in>>note[i].dr.y;
        cout<<note[i].dr.x<<"x"<<note[i].dr.y<<"\t";
        in>>note[i].price;
        cout<<note[i].price<<endl;
        
    }
 
    in.close();
    return i;
}
void output(notebook note[], int count)
{
    ofstream out("111.bin",ios::binary | ios::ate);
    if(!out)
        cout<<"Error file"<<endl;
    for(int i=0;i<count;i++){
        if(note[i].f!=7){
        out<<note[i].model<<" ";
        out<<note[i].f<<" ";
        out<<note[i].d<<" ";
        out<<note[i].dr.x<<" ";
        out<<note[i].dr.y<<" ";
        out<<note[i].price<<endl;
        }
    }
    out.close();
}
 
int main(){
    
    notebook note[100];
    input();
    int count = read(note);
    output(note, count);
 
    system("Pause");
 
}
0
nmcf
6525 / 5749 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
05.11.2015, 22:58 10
В чём у меня ошибки? Ты по сути текстовый файл записал.
0
Kot11
0 / 0 / 0
Регистрация: 29.10.2015
Сообщений: 17
06.11.2015, 08:50  [ТС] 11
Да, задание такое. Были ошибки в записи бинарного файла, при компиляции ошибок не возникало, но при открытии bin часть данных была записана неправильно
0
nmcf
6525 / 5749 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
06.11.2015, 10:05 12
Цитата Сообщение от Kot11 Посмотреть сообщение
но при открытии bin часть данных была записана неправильно
Ты это "на глаз" определил?
0
Kot11
0 / 0 / 0
Регистрация: 29.10.2015
Сообщений: 17
06.11.2015, 21:23  [ТС] 13
C чего ты взял что на глаз? Нет, открыл с помощью hex editor, посмотрел файл, было Note1, числа вперемешку, мусор, и опять числа. Возможно при компиляции что то произошло, ведь не говорю что все не так)
0
nmcf
6525 / 5749 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
06.11.2015, 21:38 14
Во-первых у тебя выравнивание не отключено, плюс порядок байтов будет обратный. Это надо учитывать, когда hex смотришь.
0
06.11.2015, 21:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.11.2015, 21:38

Чтения структуры из файла (описать структуру с именем "ORDER": "счет плательщика"; "счет получателя"; "сумма, переводится банковской операцией")
Описать структуру с именем &quot;ORDER&quot;, содержащий следующие поля: &quot;Счет плательщика&quot;; &quot;Счет...

Как записать структуру в бинарный файл одним "блоком"
Как записать структуру в бинарный файл одним &quot;блоком&quot;, если в структуре есть private данные? ...

Как откомпилировать программу на C++ так, чтобы получить "чистый бинарный файл"?
возникла такая задача-из кода на C++ получить чистый бинарный файл. В случае с ассемблером, у...


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

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

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