Предыстория: я делаю школьный проект на C ++.Мне нужно написать программу, которая, помимо прочего, создает двоичный файл, если он еще не существует, позволяет пользователю изменять его и сохраняет файл, чтобы его можно было снова открыть и прочитать или изменить.Я написал основную программу отдельно, но мне не удалось заставить файл работать с вводом и выводом, чтобы работать должным образом, поэтому я экспериментировал с изменением некоторого примера кода с моего компакт-диска с учебником.Большинство примеров учебников поставляются с существующим .dat-файлом, который должен быть загружен или только создавать, только записывать или только читать.Однако наш профессор хочет, чтобы мы включили файл .cpp без файла .dat.Предполагается, что программа генерирует файл .dat и позволяет читать и писать.Итак, у меня нет хороших примеров для работы.
Основная мысль: почему эта программа создает файл, записывает в него и читает из него, а затем, когда он закрывается, я перехожу ккаталог, в котором хранится файл .dat, а файл пуст (говорит 0 байтов)?Как я могу сохранить содержимое в файле при закрытии?Это вообще правильно создается?
(Кстати, я знаю, что после запроса на ввод данных, он отображает мусор. Я просто настроил его, чтобы посмотреть, есть ли контент в записидо ввода данных.)
// This program allows the user to edit a specific record.
#include <iostream>
#include <fstream>
using namespace std;
const int DESC_SIZE = 31; // Description size
// Declaration of InventoryItem structure
struct InventoryItem
{
char desc[DESC_SIZE];
int qty;
double price;
};
int main()
{
InventoryItem record; // To hold an inventory record
long recNum; // To hold a record number
long numBytes;
fstream inventory;
// Open the file in binary mode for input and output
inventory.open("Inventory.dat",
/*ios::in | */ios::out | ios::binary);
//file.open("Inventory.dat", ios::in | ios::out | ios::binary);
if (!inventory.is_open())
{
cout << "Creating ...\n";
// Create the file.
inventory.open("Inventory.dat", ios::out);
// Close the file.
inventory.close();
// Reopen the file for input and output.
inventory.open("Inventory.dat", ios::in | ios::out | ios::binary);
}
inventory.seekg(0L, ios::end);
numBytes = inventory.tellg();
cout << "After opening: The file has " << numBytes << " bytes." << endl;
// Get the record number of the desired record.
cout << "Which record do you want to edit? ";
cin >> recNum;
// Move to the record and read it.
inventory.seekg(recNum * sizeof(record), ios::beg);
inventory.read(reinterpret_cast<char *>(&record),
sizeof(record));
// Display the record contents.
cout << "Description: ";
cout << record.desc << endl;
cout << "Quantity: ";
cout << record.qty << endl;
cout << "Price: ";
cout << record.price << endl;
// Get the new record data.
cout << "Enter the new data:\n";
cout << "Description: ";
cin.ignore();
cin.getline(record.desc, DESC_SIZE);
cout << "Quantity: ";
cin >> record.qty;
cout << "Price: ";
cin >> record.price;
// Move back to the beginning of this record's position.
inventory.seekp(recNum * sizeof(record), ios::beg);
// Write the new record over the current record.
inventory.write(reinterpret_cast<char *>(&record),
sizeof(record));
inventory.seekg(0L, ios::end);
numBytes = inventory.tellg();
cout << "The file has " << numBytes << " bytes.";
// Move to the record and read it.
inventory.seekg(recNum * sizeof(record), ios::beg);
inventory.read(reinterpret_cast<char *>(&record),
sizeof(record));
// Display the record contents.
cout << "Description: ";
cout << record.desc << endl;
cout << "Quantity: ";
cout << record.qty << endl;
cout << "Price: ";
cout << record.price << endl;
inventory.seekg(0L, ios::end);
numBytes = inventory.tellg();
cout << "The file has " << numBytes << " bytes.";
// Close the file.
inventory.close();
//Try opening the file again.
inventory.open("Inventory.dat",
ios::in | /*ios::out |*/ ios::binary);
// Move to the record and read it.
inventory.seekg(recNum * sizeof(record), ios::beg);
inventory.read(reinterpret_cast<char *>(&record),
sizeof(record));
// Display the record contents.
cout << "Description: ";
cout << record.desc << endl;
cout << "Quantity: ";
cout << record.qty << endl;
cout << "Price: ";
cout << record.price << endl;
inventory.seekg(0L, ios::end);
numBytes = inventory.tellg();
cout << "The file has " << numBytes << " bytes.";
return 0;
}