私が作成しているプログラムのこの部分は、ランダム アクセス バイナリ ファイルに保存されているすべてのレコードを出力することになっています。実行するたびに、すべてのレコードが出力され、アクセス違反の例外がスローされます。
void readFile()
{
ifstream inFile("hardware.txt", ios::in | ios::binary);
if(!inFile)
{
cerr<<"File could not be opened."<<endl;
exit(1);
}
cout<<left<<setw(10)<<"Account"<<setw(16)
<<"Name"<<setw(11)<<"Quantity"<<left<<setw(10)<<"Price"<<endl;
Hardware File;
inFile.read(reinterpret_cast<char *>(&File), sizeof(Hardware));
while(inFile && !inFile.eof())
{
if(File.getAccountNumber() != 0)
outputLine(cout, File);
inFile.read(reinterpret_cast<char *>(&File), sizeof(Hardware));
}
}
明確にするために、「ハードウェア」は Hardware.h に格納されているクラスです。
ハードウェア.h
#ifndef HARDWARE_H
#define HARDWARE_H
#include <string>
using std::string;
class Hardware
{
public:
Hardware (int = 0, string = "", int = 0, double = 0);
void setAccountNumber(int);
int getAccountNumber() const;
void setName(string);
string getName() const;
void setAmount(int);
int getAmount() const;
void setPrice(double);
double getPrice() const;
private:
int accountNumber;
string name;
int amount;
double price;
};
#endif
ハードウェア.cpp
#include <string>
using std::string;
#include "hardware.h"
Hardware::Hardware(int accountNumberValue, string nameValue, int amountValue, double priceValue)
{
setAccountNumber(accountNumberValue);
setName(nameValue);
setAmount(amountValue);
setPrice(priceValue);
}
void Hardware::setAccountNumber(int accountValue)
{
accountNumber = accountValue;
}
int Hardware::getAccountNumber() const
{
return accountNumber;
}
void Hardware::setName(string nameValue)
{
name = nameValue;
}
string Hardware::getName() const
{
return name;
}
void Hardware::setAmount(int amountValue)
{
amount = amountValue;
}
int Hardware::getAmount() const
{
return amount;
}
void Hardware::setPrice(double priceValue)
{
price = priceValue;
}
double Hardware::getPrice() const
{
return price;
}