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

Запись введенных данных с консоли в бинарный файл

26.04.2018, 10:48. Просмотров 387. Ответов 17
Метки нет (Все метки)

Доброго времени суток. Столкнулся с такой проблемой:
Мне надо введенные данные в структуру записать в бинарный файл.
То есть у меня информация хранится не в текстовом файле, а в динамической памяти моей структуры.
Как мне вывести структуру в бинарный файл?
Вот что удалось набросать:

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
//Для хранения данных о планшетах описать структуру с именем TABLET, содержащую следующие поля:
//бренд, операционная система, название, разрешение экрана, диагональ экрана, цена,
//наличие модуля сотовой связи, наличие клавиатуры, оперативная память, встроенная память.
//Написать функцию записи в бинарный файл данных о планшете из приведенной структуры.
//Структура файла : в первых двух байтах размещается количество сделанных в файл записей;
//далее без пропусков размещаются записи о сканерах.
//Написать функцию, извлекающую данные о планшете из файла в структуру,
//описанного типа на основании определенных характеристик.
//Привести пример программы, создающей файл с данными о планшетах(данные вводятся с клавиатуры)
//и выводящей на экран запрошенные записи.
 
//  вывести записи о планшетах с определенной операционной системой;
//  вывести записи о планшетах с отсутствием модуля сотовой связи;
//  вывести записи о планшетах со встроенной памятью определенного размера.
 
 
 
 
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdlib>
using namespace std;
 
struct TABLET
{
    char brand[10];
    char OS[10];
    char name[10];
    int ekran_x;
    int ekran_y;
    int diagonal;
    int price;
    char svyaz[5];
    char klava[5];
    int oppam;
    int pam;
};
 
 
int main()
{
    setlocale(LC_ALL, "Rus");
    int i, j, size;
    cout << "Введите количество планшетов: ";
    cin >> size;
    TABLET* tab = new TABLET[size];
 
    for (i = 0; i < size; i++)
    {
        cout << "Введите название бренда: ";
        cin >> tab[i].brand;
        cout << "Введите имя операционной системы: ";
        cin >> tab[i].OS;
        cout << "Введите название планшета: ";
        cin >> tab[i].name;
        cout << "Введите разрешение экрана: ";
        cin >> tab[i].ekran_x;
        cin >> tab[i].ekran_y;
        cout << "Введите диагональ устройства: ";
        cin >> tab[i].diagonal;
        cout << "Введите цену устройства: ";
        cin >> tab[i].price;
        cout << "Наличие модуля связи (Есть/Нету): ";
        cin >> tab[i].svyaz;
        cout << "Наличие клавиатуры (Есть/Нету): ";
        cin >> tab[i].klava;
        cout << "Введите количество оперативной памяти: ";
        cin >> tab[i].oppam;
        cout << "Введите количество встроенной памяти: ";
        cin >> tab[i].pam;
    }
    ifstream fin("BTab.bin");
    if (!fin)
    {
        cerr << "Ошибка открытия файла!";
        return 1;
    }
    for (i = 0; i < size; i++)
    {
        fin << tab[i].brand << " " << tab[i].OS << " " << tab[i].name << " "
            << tab[i].ekran_x << " " << tab[i].ekran_y << " " << tab[i].diagonal << " " << tab[i].price << " "
            << tab[i].svyaz << " " << tab[i].klava << " " << tab[i].oppam << " " << tab[i].pam << " " << endl;
    }
 
 
 
 
    system("pause");
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.04.2018, 10:48
Ответы с готовыми решениями:

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

Запись структуры (в ней есть поля типа данных char*) в бинарный файл
Всем привет! Есть такая структура: struct Telem { int key; char *mark;...

Запись в бинарный файл
По заданию требуется организовать ввод данных типа структуры в бинарных файл ,...

Запись в бинарный файл
Скажите пожалуйста, правильно ли работает моя программа? (Имеется ввиду запись...

Запись в бинарный файл
Подскажите как записать данные из StringGrid в бинарный файл и компоновка...

17
nd2
2835 / 2403 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
26.04.2018, 11:04 2
Цитата Сообщение от Newbie_MTF Посмотреть сообщение
C++
1
ifstream
Это для чтения из файла, а не для записи. Для записи: ofstream.

Добавлено через 2 минуты
Цитата Сообщение от Newbie_MTF Посмотреть сообщение
записать в бинарный файл
Для бинарной записи файл нужно открыть в бинарном режиме, и использовать бинарный метод записи: write().
http://www.cplusplus.com/reference/ostream/ostream/write/
1
Newbie_MTF
0 / 0 / 1
Регистрация: 22.02.2018
Сообщений: 31
30.04.2018, 02:47  [ТС] 3
Вот еще непонятно что:
Мне надо вывести список из определенных параметров, я пытаюсь сделать функцию для вывода, но при сравнении OS, пишет:
несовместимые типы операндов (char* и char)
Почему я не могу сравнить два типа "чар"? Из-за динамического массива при выводе?

Вот начало функции:
C++
1
2
3
4
5
6
7
8
void vivod(TABLET tabl[], int size, char OS, char pam)
{
    for (int i = 0; i < size; i++)
        if (tabl[i].OS == OS)
        {
 
        }
}
Вот считывание данных из бинарного файла:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    FILE *fin;
    if ((fin = fopen("BTab.bin", "rb")) == NULL)
    {
        cerr << "Ошибка открытия файла!" << endl;
        return 2;
    }
 
    long int n = sizeof(TABLET);
    TABLET* tabl = new TABLET[n];
    for (i = 0; i < n; i++)
    {
        fread(&(tabl[n]), sizeof(TABLET), 3, fin);
        cout << tabl[n].brand << " " << tabl[n].OS << " " << tabl[n].name << " " << tabl[n].ekran_x << "x" << tabl[n].ekran_y 
            << " " << tabl[n].diagonal << " " << tabl[n].price << " " << tabl[n].svyaz << " " << tabl[n].klava << " " << tabl[n].oppam << " " << tabl[n].pam << endl;
    }
Нужна ли вообще динамическая структура при считывании из файла?
0
nd2
2835 / 2403 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
30.04.2018, 02:53 4
Цитата Сообщение от Newbie_MTF Посмотреть сообщение
C++
1
char OS
Почему char, а не char*?
Цитата Сообщение от Newbie_MTF Посмотреть сообщение
C++
1
if (tabl[i].OS == OS)
Для сравнения Си-строк есть функция strcmp().

Добавлено через 1 минуту
Цитата Сообщение от Newbie_MTF Посмотреть сообщение
C
1
FILE *fin;
Почему Си, а не С++?
0
Newbie_MTF
0 / 0 / 1
Регистрация: 22.02.2018
Сообщений: 31
30.04.2018, 03:00  [ТС] 5
Понял, сейчас попробую.
Цитата Сообщение от nd2 Посмотреть сообщение
Почему Си, а не С++?
Еще путаюсь потому что) Только начал изучать С++, а в учебнике иногда примеры приводятся на С.
Так правильно в стиле С++ ?
C++
1
2
3
4
5
6
    ifstream fin("BTab.bin", ofstream::binary);
    if (!fin)
    {
        cerr << "Ошибка открытия файла!" << endl;
        return 2;
    }
0
nd2
2835 / 2403 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
30.04.2018, 04:01 6
C++
1
ifstream fin("BTab.bin", ios::binary);
Добавлено через 6 минут
Цитата Сообщение от Newbie_MTF Посмотреть сообщение
C++
1
tabl[n]
C++
1
tabl[i]
Добавлено через 1 минуту
Цитата Сообщение от Newbie_MTF Посмотреть сообщение
C++
1
long int n = sizeof(TABLET);
Не то.

Добавлено через 1 минуту
Если собрался бинарным методом читать, то и запись в файл должна быть бинарной.

Добавлено через 1 минуту
Цитата Сообщение от Newbie_MTF Посмотреть сообщение
Нужна ли вообще динамическая структура при считывании из файла?
Смотря что собираешься дальше делать. Лучше вектор, тогда не нужно узнавать сколько структур в файле записано.
0
Newbie_MTF
0 / 0 / 1
Регистрация: 22.02.2018
Сообщений: 31
30.04.2018, 11:20  [ТС] 7
Почти добился прогресса 2 из 3 задач выполняются, проблема только с выводом одной функции.
Ошибка: аргумент типа "char" несовместим с параметром типа "char*".
Делал указатели, тогда ошибка принимает вид: использована неинициализированная локальная переменная "OS"
Объявляю ее в самом начале. Что делать так и не разобрался.
Вот связанные с ней строки кода:

Сама функция:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void opsis(TABLET tab[], int size, char* OS)
{
    int flag = 0;
    for (int i = 0; i < size; i++)
    {
        if (strcmp(tab[i].OS, OS) == 0)
        {
            cout << tab[i].brand << " " << tab[i].OS << " " << tab[i].name << " " << tab[i].ekran_x << "x" << tab[i].ekran_y
                << " " << tab[i].diagonal << " " << tab[i].price << " " << tab[i].svyaz << " " << tab[i].klava << " " << tab[i].oppam << " " << tab[i].pam << endl;
            flag++;
        }
    }
    if (flag == 0)
    {
        cout << "Таких планшетов нет!" << endl;
    }
}
Тело программы:
C++
1
2
3
4
5
int main()
{
    setlocale(LC_ALL, "Rus");
    int i, size, pam;
    char OS; //объявляю ее
C++
1
2
    cout << "Введите операционную систему (Android/iOS): \n";
    cin >> OS; // использую для отбора
C++
1
2
    cout << "Планшеты с ОС " << OS << ":" << endl;
    opsis(tab, size, OS); // вот тут при выводе и всплывает ошибка
Часа два убил, так и не разобрался что с ней сделать.
0
nmcf
6409 / 5671 / 2581
Регистрация: 14.04.2014
Сообщений: 23,997
30.04.2018, 11:30 8
Если в структуре OS - строка, то почему здесь-то один символ?
1
nd2
2835 / 2403 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
30.04.2018, 17:39 9
Цитата Сообщение от Newbie_MTF Посмотреть сообщение
C++
1
char OS; //объявляю ее
C++
1
char OS[10];
1
Newbie_MTF
0 / 0 / 1
Регистрация: 22.02.2018
Сообщений: 31
04.05.2018, 13:26  [ТС] 10
В чем-то я накосячил и информация из файла перестала считываться.
Раньше я пытался считывать и выводить структурой, но выводило лишь ерунду или вообще не выводило. В попытках исправить чтение сделал только еще хуже.
Сейчас выглядит так, но это не правильно т.к. у меня в файле находятся и цифры и буквы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    // Чтение бинарного файла
    ifstream fin("BTab.bin", ios::in, ios::binary);
    if (!fin)
    {
        cerr << "Ошибка открытия файла!" << endl;
        return 2;
    }
    TABLET* tabl = new TABLET[i]; // Создание динамической структуры для чтения
    char sizes;
    fin.read(&sizes, sizeof(sizes));
    for (i = 0; i < size; i++) 
    {
        cout << sizes << " " <<;
        i++;
    }
    fin.close();
Может делать через reinterpret или я вообще далеко от правильного решения?
0
nd2
2835 / 2403 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
05.05.2018, 01:03 11
Цитата Сообщение от Newbie_MTF Посмотреть сообщение
// Чтение бинарного файла
Записываешь как? Чтение должно соответствовать записи.
0
Newbie_MTF
0 / 0 / 1
Регистрация: 22.02.2018
Сообщений: 31
05.05.2018, 02:57  [ТС] 12
Как гласит задание: Структура файла - в первых двух байтах размещается количество сделанных в файл записей, далее без пропусков размещаются записи о сканерах.
Выполнил в таком варианте:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    // Запись данных в бинарный файл
    ofstream fout("BTab.bin", ofstream::binary);
    if (!fout)
    {
        cerr << "Ошибка открытия файла!";
        return 1;
    }
    fout << size << " ";
    for (i = 0; i < size; i++)
    {
        fout << tab[i].brand << tab[i].OS << tab[i].name << tab[i].ekran_x << tab[i].ekran_y << tab[i].diagonal << tab[i].price << tab[i].svyaz << tab[i].klava << tab[i].oppam << tab[i].pam << endl;
    }
    fout.close();
Изначально пытался считать тоже с помощью структуры, но не вся информация правильно выводилась или часть вообще не выводилась.
0
nd2
2835 / 2403 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
05.05.2018, 05:19 13
Текстовым методом без разделителей записываешь, и как потом понять: где заканчивается одно поле и начинается другое?
И нужно как-то определиться: бинарный файл или текстовый?

Добавлено через 1 минуту
Из задания следует, что бинарный:
Цитата Сообщение от Newbie_MTF Посмотреть сообщение
в первых двух байтах
Почему тогда текстовые методы используешь?

Запись:
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
struct TABLET
{
    char brand[10];
    char OS[10];
    char name[10];
    int ekran_x;
    int ekran_y;
    int diagonal;
    int price;
    char svyaz[5];
    char klava[5];
    int oppam;
    int pam;
};
 
 
int main()
{
    setlocale(LC_ALL, "Rus");
    
    cout << "Введите количество планшетов: ";
    short int size;
    cin >> size;
    TABLET* tab = new TABLET[size];
 
    for (int i = 0; i < size; i++)
    {
        cout << "Введите название бренда: ";
        cin >> tab[i].brand;
        cout << "Введите имя операционной системы: ";
        cin >> tab[i].OS;
        cout << "Введите название планшета: ";
        cin >> tab[i].name;
        cout << "Введите разрешение экрана: ";
        cin >> tab[i].ekran_x;
        cin >> tab[i].ekran_y;
        cout << "Введите диагональ устройства: ";
        cin >> tab[i].diagonal;
        cout << "Введите цену устройства: ";
        cin >> tab[i].price;
        cout << "Наличие модуля связи (Есть/Нету): ";
        cin >> tab[i].svyaz;
        cout << "Наличие клавиатуры (Есть/Нету): ";
        cin >> tab[i].klava;
        cout << "Введите количество оперативной памяти: ";
        cin >> tab[i].oppam;
        cout << "Введите количество встроенной памяти: ";
        cin >> tab[i].pam;
    }
    
    ofstream fout("BTab.bin", ios::binary);
    if (!fout)
    {
        cerr << "Ошибка открытия файла!";
        system("pause");
        return 1;
    }
    fout.write((const char*)&size, sizeof(size));
    for (int i = 0; i < size; i++)
    {
        fout.write((const char*)&tab[i], sizeof(TABLET));
    }
    fout.close();
 
 
 
    system("pause");
    return 0;
}
Добавлено через 16 минут
Чтение (закомментированное в цикле вывода сам переделаешь под вывод):
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
    ifstream fin("BTab.bin", ios::binary);
    if (!fin)
    {
        cerr << "Ошибка открытия файла!";
        system("pause");
        return 1;
    }
    
    delete [] tab; // для чистоты эксперимента выделим новую память
    short int number;
    
    fin.read((char*)&number, sizeof(number));
    tab = new TABLET[number];
    
    for (int i = 0; i < number; i++)
    {
        fin.read((char*)&tab[i], sizeof(TABLET));
    }
    fin.close();
 
    for (int i = 0; i < number; i++)
    {
         cout << "Название бренда: " << tab[i].brand << endl;
        /*cout << "Введите имя операционной системы: ";
        cin >> tab[i].OS;
        cout << "Введите название планшета: ";
        cin >> tab[i].name;
        cout << "Введите разрешение экрана: ";
        cin >> tab[i].ekran_x;
        cin >> tab[i].ekran_y;
        cout << "Введите диагональ устройства: ";
        cin >> tab[i].diagonal;
        cout << "Введите цену устройства: ";
        cin >> tab[i].price;
        cout << "Наличие модуля связи (Есть/Нету): ";
        cin >> tab[i].svyaz;
        cout << "Наличие клавиатуры (Есть/Нету): ";
        cin >> tab[i].klava;*/
        cout << "Количество оперативной памяти: " << tab[i].oppam << endl;
        cout << "Количество встроенной памяти: " << tab[i].pam << endl;
    }
1
Newbie_MTF
0 / 0 / 1
Регистрация: 22.02.2018
Сообщений: 31
05.05.2018, 05:30  [ТС] 14
Цитата Сообщение от nd2 Посмотреть сообщение
и как потом понять: где заканчивается одно поле и начинается другое?
В бинарном файле они различаются обычной точкой. То есть между памятью и брендом следующего товара стоит точка, например, "32.ASUS"
0
nd2
2835 / 2403 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
05.05.2018, 05:32 15
Цитата Сообщение от Newbie_MTF Посмотреть сообщение
В бинарном файле они различаются обычной точкой.
Откуда такие удивительные знания? Не смеши.
0
Newbie_MTF
0 / 0 / 1
Регистрация: 22.02.2018
Сообщений: 31
05.05.2018, 05:38  [ТС] 16
Цитата Сообщение от nd2 Посмотреть сообщение
Откуда такие удивительные знания?
Когда этот файл открывал в VS там записи эти именно так представлялись.
0
nd2
2835 / 2403 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
05.05.2018, 05:53 17
Цитата Сообщение от Newbie_MTF Посмотреть сообщение
Когда этот файл открывал в VS там записи эти именно так представлялись.
У тебя полное непонимание того, что такое бинарный файл. И ещё: бинарные файлы не предназначены для рассматривания их содержимого в текстовых редакторах (особенно, если там не только текст был записан).

Добавлено через 8 минут
И ещё: файл не становится бинарным от того, что открывается в бинарном режиме. Он становится бинарным тогда, когда данные туда записываются бинарными методами.
0
Newbie_MTF
0 / 0 / 1
Регистрация: 22.02.2018
Сообщений: 31
05.05.2018, 05:54  [ТС] 18
Цитата Сообщение от nd2 Посмотреть сообщение
бинарные файлы не предназначены для рассматривания их содержимого в текстовых редакторах
Понял, спасибо за помощь.
0
05.05.2018, 05:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.05.2018, 05:54

Запись в бинарный файл
Подскажите пожалуйста,где в коде ошибка??никак найти не могу почему х не...

Запись в бинарный файл
Всем привет. Подскажите пожалста как через fstream добавить запись в бинарный...

Запись в бинарный файл
Помогите приделает функцию что бы она записывала не в обычный файл а в...


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

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

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