бинарный файл создан в c ++, но содержимое удалено после запуска - PullRequest
1 голос
/ 19 марта 2011

Предыстория: я делаю школьный проект на 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;
}

Ответы [ 3 ]

1 голос
/ 19 марта 2011

Я не уверен, какова политика в отношении домашних заданий на этом сайте; но я считаю уместным давать вам только подсказки, а не ответ.

Наблюдение : вы не проверяете ни один из своих вызовов в потоке, поэтому после, скажем, inventory.write() вы не проверяете, что запись прошла успешно. Вы можете сделать это с помощью любой из функций state , например: inventory.good(). Обнаружение сбоя доступа к файлу поможет вам определить вашу проблему.

Что произойдет, если файла нет (значит, он создан) и я ввожу запись № 23? То есть, если размер файла равен 0, как вы думаете, что произойдет с вызовом inventory.seekg(23 * sizeof (InventoryItem)).

Если это кажется загадочным: подумайте о разнице между выполнением этого вызова для уже существующего файла и вновь созданного файла. Я полагаю, что как только вы заметите существенную разницу, решение станет ясным.

Если вы изо всех сил вставляете ошибку проверки кода, как указано выше, это поможет направить ваше расследование.

Удачи.

0 голосов
/ 19 марта 2011

Может быть, вам следует позвонить

inventory.close ();//?

чтобы зафиксировать изменение

0 голосов
/ 19 марта 2011

Может быть, вам нужно очистить ручей (инвентарь)?

...