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

Неправильно записывается бинарник - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Написать класс «множество» – наследник класса «массив» http://www.cyberforum.ru/cpp-beginners/thread1225655.html
Ребята может есть что-то прошу помощи. Написать класс «множество» – наследник класса «массив» (множество понимается в привычном смысле – неупорядоченный набор уникальных элементов известной мощности). В классе реализовать следующие методы: конструкторы (по умолчанию, с параметрами, копирования), деструктор, ввод с клавиатуры, вывод на экран (в виде методов...
C++ Вычисление бесконечных сумм составить программу вычисления суммы n членов ряда согласно условию задачи:cos(2x)/3+cos(4x)/15+cos(6x)/35+... http://www.cyberforum.ru/cpp-beginners/thread1225648.html
Осуществить ввод данных для файла, выполнить реализацию алгоритма обработки и создания нового файла C++
Осуществить ввод данных для файла, выполнить реализацию алгоритма обработки и создания нового файла, обеспечить вывод полученных результатов. 15) Даны два текстовых файла. Добавить в конец каждой строки первого файла соответствующую строку второго файла. Если второй файл короче первого, то оставшиеся строки первого файла не изменять. помогите решить
Написать класс «матрица» C++
Добрый день я новичок помогите мне Написать класс «матрица». В классе реализовать следующие методы: конструкторы (по умолчанию, с параметрами, копирования), деструктор, ввод с клавиатуры, поиск элемента по ключу, вывод на экран (в виде методов класса и при помощи перегруженных операций потокового ввода и вывода), перегрузить следующие операции: +, += (сложение...
C++ Структурный вывод матрицы в консоль http://www.cyberforum.ru/cpp-beginners/thread1225630.html
матрицу создать удалось, но вывести ее ровно, чтобы элемент под элементом так и не удалось. Может кто подскажет что-нибудь, лишнего не будет (я только прикоснулся к языку Си++) #include <cstdio> #include <cstdlib> #include <iostream> using namespace std;
C++ Написать рекурсивную процедуру, которая печатает ключи всех вершин двоичного дерева Необходимо написать рекурсивную процедуру, которая печатает ключи всех вершин двоичного дерева. Двоичное дерево задастся в файле в следующем виде: index/ key/ left/ right 1 12 7 3 2 15 8 NULL 3 4 10 NULL 4 10 5 9 5 2 NULL NULL 6 18 1 4 7 7 NULL NULL 8 11 6 2 подробнее

Показать сообщение отдельно
lotos580
1 / 1 / 1
Регистрация: 25.05.2012
Сообщений: 59
10.07.2014, 19:32     Неправильно записывается бинарник
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
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
#include <iostream>
#include <string>
#include <iomanip>
#include <fstream>
#include <stdlib.h>
using namespace std;
 
class Good
{
public:
    Good(const int = 0, const string = "", const int = 0, const double = 0.0);
    int getID() {return ID;}
    string getTitle() {return title;}
    int getAmount() {return amount;}
    double getPrice() {return price;}
private:
    int ID;
    string title;
    int amount;
    double price;
};
 
Good::Good(const int initID, const string _title, const int _amount, const double _price)
{
    ID = (initID > 0) ? initID : 0;
    title = _title;
    amount = _amount;
    price = _price;
}
 
void showInstruction()
{
    cout << "1 - add new good" << endl
         << "2 - delete good" << endl
         << "3 - change amount" << endl
         << "4 - change price" << endl
         << "5 - change title" << endl
         << "6 - record data base" << endl
         << "7 - end programm" << endl;
}
 
int getAction()
{
    int action;
    cout << "Enter 1 - 7: ";
    cin >> action;
    while(action > 6 && action < 1)
        cin >> action;
    return action;
}
 
bool addNewElement()
{
    ofstream myFile("file.bin", ios::binary|ios::app);
    if(!myFile)
    {
        cerr << "ERROR: can't open myFile as ifstream at << bool addNewElement() >>" << endl;
        exit(1);
    }
    cout << "Enter ID, title, amount, price: ";
    int ID;
    string title;
    int amount;
    double price;
    cin >> ID >> title >> amount >> price;
    Good product(ID, title, amount, price);
 
    myFile.seekp((ID - 1) * sizeof(product)); 
    myFile.write(reinterpret_cast<char*>(&product), sizeof(product)); // else record element
    
    myFile.close();
    return true;
}
 
void recordDataBase()
{
    ifstream myFile("file.bin", ios::binary); // открываем для чтения
    if(!myFile)
    {
        cerr << "ERROR: can't open myFile as ofstream at << void recordDataBase() >>" << endl;
        exit(1);
    }
    ofstream recordFile("recordFile.txt", ios::out);
    if(!recordFile)
    {
        cerr << "ERROR: can't open recordFile as ifstream at << void recordDataBase() >>" << endl;
        exit(1);
    }
    recordFile << setw(30) << "ID" << setw(30) << "TITLE"
            << setw(30) << "AMOUNT" << setw(30) << "PRICE\n\n";
    myFile.seekg(0);
    Good empty; // create client with no information
    while(true)
    {
        myFile.read(reinterpret_cast<char*>(&empty), sizeof(empty));
        if(myFile.eof())
            break;
        if(empty.getID() == 0)
            continue;
        recordFile << setw(30) << empty.getID() << setw(30) << empty.getTitle()
            << setw(30) << empty.getAmount() << setw(30) << fixed 
            << setprecision(2) << (double)empty.getPrice() << endl;
    }
}
 
bool deleteElement()
{
    ofstream myFileWrite("file.bin", ios::binary);
 
    if(!myFileWrite)
    {
        cerr << "ERROR: can't open myFileWrite as ifstream at << bool deleteElement() >>" << endl;
        exit(1);
    }
    ifstream myFileRead("file.bin", ios::binary);
    if(!myFileRead)
    {
        cerr << "ERROR: can't open myFileRead as ifstream at << bool deleteElement() >>" << endl;
        exit(1);
    }
    cout << "Enter ID to delete: ";
    int ID;
    cin >> ID;
    while(ID < 0)
    {
        cout << "incorrect ID, try again" << endl;
        cin >> ID;
    }
    Good empty;
    myFileRead.seekg((ID - 1) * sizeof(empty));
    myFileRead.read(reinterpret_cast<char*>(&empty), sizeof(empty));
    
    if(empty.getID() == 0)
        return false;
    
    Good noinformation(0);
    myFileWrite.seekp((ID - 1) * sizeof(empty));
    myFileWrite.write(reinterpret_cast<char*>(&noinformation), sizeof(noinformation));
    myFileRead.close();
    myFileWrite.close();
    return true;
}
 
void changeAmount()
{
}
 
void changePrice()
{
}
 
void changeTitle()
{
}
 
int main()
{
    showInstruction();
    int action = getAction();
    while(action != 7)
    {
        switch(action)
        {
        case 1:
            if(addNewElement())
                cout << setw(30) << "Record success" << endl;
            else
                cout << "This ID is already busy" << endl;
            break;
        case 2:
            if(deleteElement())
                cout << setw(30) << "Delete successfull" << endl;
            else
                cout << "Error. Can't delete" << endl;
            break;
        case 3:
            changeAmount();
            break;
        case 4:
            changePrice();
            break;
        case 5:
            changeTitle();
            break;
        case 6:
            recordDataBase();
            break;
        }
        action = getAction();
    }
    return 0; 
}
Если записываем несколько товаров, они почему-то идут по порядку(то есть друг за другом), хотя должны по порядку по ключу (ID).
Помогите, пожалуйста.

Добавлено через 25 секунд
Столкнулся в процессе написания программы...

Добавлено через 6 минут
Проблема непосредственно при создании нового товара(пункт #1 в меню) и записи в txt (п.6).
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 03:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru