0xDADA11C7 написав:Краще все ж константою задати, бажано за допомогою enum.
Це все, звичайно, добре, але минулого разу мене викладач насварив за використання vector, бо нам його не пояснювали, так що, думаю, не варто.
koala написав:std::string - це не послідовність байтів рядка, а спеціальна конструкція, що містить вказівник на таку послідовність. І, відповідно, його не можна читати за допомогою ifstream::read, який просто закидає послідовність байт з файлу кудись в пам'ять.
Не знаю, знову ж таки, С++ не вивчав, може бути й так, проте все начебто працює, і виводить після зчитування не адресу вказівника, а більшого я й не вимагаю. Та й викладачка теж.
koala написав:- перевизначити ofstream::operator<<(Album) і писати за допомогою не write, а <<.
Вище вже написав, чому такого робити не буду.
koala написав:І не варто відкривати/закривати файл в циклі.
Це наче прибрав.
koala написав:Так, і перевірку на доступність файла ви, мабуть, звідкись здерли, бо вона не C++, а C.
Здер Чесно кажучи, я й сам досі не можу зрозуміти, що нам пояснювали на тій єдиній парі. Ось приклад, який показав викладач:
#include <stdio.h>
int main()
{
FILE *fp; /* Покажчик на потік */
int n;
if ((fp = fopen("int.dat","w")) == NULL)
{реrror("int.dat");
return 1 ;
}
for (n=l; n<ll; n++)
fprintf(fp, "%d %d\n", n, n*n);
fclose(fp);
return 0;
}
Що це, може, ви скажете?
Коротше, ось фінальний код, наче працює, претендувати на чистоту плюсового коду не намагаюсь. Явно можна покращити, але з мене досить плюсів на сьогодні.
#define FILENAME "catalogue.dat" //имя файла с данными
#include <cstdio>
#include <time.h>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
struct Album //структура для хранения данных об альбоме
{
unsigned int position;
string media;
string title;
string singer_name;
unsigned int duration; //in seconds
unsigned int count_of_songs;
float price; //in dollars
};
const int catalogue_size = 10;
//данные для создания случайного списка
const vector<string> media_types{ "7 picture disc", "audiocassette", "CD" };
const vector<string> singers{ "Steven Tyler", "Joe Cocker", "B.B. King",
"John Lee Hooker", "Elvis Presley", "Al Green",
"Bob Dylan", "Otis Redding", "Tina Turner", "Freddie Mercury"
};
const vector<string> albums({ "Ankit", "Bohra", "Xyz", "Cheese",
"Pepperoni", "Black Olives", "foo",
"bar", "bletch", "one"
});
//конец данных для создания случайного списка
/* Функция, возвращающая случайное число с плавающей запятой в необходимом диапазоне
* Необходима для генерирования случайной цены
*/
float random_float(float min, float max)
{
if (max < min) return min;
float random = ((float)rand()) / (float)RAND_MAX;
float range = max - min;
return (random * range) + min;
}
int generate_catalogue()
{
srand(time(NULL)); //инициализация генератора случайных чисел
FILE *file;
std::ofstream out(FILENAME, ios::binary | ios::out | ios::app);
if (!out)
{
cerr << "Error reading " << FILENAME;
return 1;
}
out.clear(); //очистка предыдущего списка
for (int n = 0; n < catalogue_size; n++)
{
Album temp;
memset(&temp, 0, sizeof temp); //инициализация полей структуры нулями
temp.position = n + 1;
temp.media = media_types.at(rand() % media_types.size());
temp.count_of_songs = rand() % 15 + 1;
temp.duration = rand() % 200 + 150;
temp.singer_name = singers.at(n);
temp.price = random_float(10.0, 200.0);
temp.title = albums.at(n);
out.write((char *)&temp, sizeof temp); //запись в файл в виде массива символов
}
out.close();
return 0;
}
int main()
{
if (generate_catalogue() != 0) return 1;
Album *cp = new Album[10];
ifstream in(FILENAME, ios::binary | ios::in); //открытие фацла для чтения
for (int i = 0; i < catalogue_size; i++)
{
in.read((char *)&cp[i], sizeof cp[i]);
}
for (int i = 0; i < catalogue_size; i++)
{
cout << cp[i].position << " " << cp[i].singer_name << " " << cp[i].title << " " << cp[i].price << endl;
}
cout << "Get you budget: ";
float budget = 0;
cin >> budget;
vector<string> albums_for_buying;
int price = 0;
for (int i = 0; i < catalogue_size; i++)
{
int current_price = cp[i].price;
if (price + current_price > budget) continue;
price += current_price;
albums_for_buying.push_back(cp[i].title);
}
cout << "There is a list of albums for buying: ";
std::copy(albums_for_buying.begin(), albums_for_buying.end(), std::ostream_iterator<string>(std::cout, "; "));
cout << "\nTotal price is " << price << endl;
system("pause");
return 0;
}
Пішов до коханої Intellij Idea...