繁体   English   中英

读取多个结构并将其写入文件

[英]Reading and writing multiple structs into a file

我正在尝试将多个结构存储到一个文件中,我的问题是,当我尝试将 2 个结构添加到同一个文件中时,我的第二个结构会覆盖我的第一个结构,当我 go 打印出我的第一个结构时,它会打印出我的第二个结构结构。 我想在我的文件中有多个结构,我可以一次显示一个,如果需要,可以一次编辑一个。 关于我的代码有什么问题的任何线索?

int main()
{
Record record1;
Record record2;
int choice;
int choice2;

cout << "Welcome to your Records! What do you want to do today?" << endl;
cout << endl << endl;



while(choice2 != -1)
{
    cout << " " << endl;
    cout << "1) Add new records to the file" << endl;
    cout << "2) Display any record in the file" << endl;
    cout << "3) Change any record in the file" << endl;
    cout << "4) Exit" << endl;
    cout << "Your Choice: ";
    cin >> choice;

    while(choice < 1 || choice > 4)
    {
        cout << "Invalid choice! Enter again" << endl;
        cin >> choice;
    }

    if(choice == 1)
    {
        ofstream outFile("RecordFile.dat", ios::out | ios::binary);
        AddItem(outFile);
        outFile.close();

    }
    else if(choice == 2)
    {
        ifstream inFile("RecordFile.dat",ios::out | ios::binary);
        DisplayItem(inFile);
        inFile.close();

    }
    else if(choice == 3)
    {
        ofstream outFile("RecordFile.dat", ios::out | ios::binary);
        EditItem(outFile);
        outFile.close();
    }

    else if(choice == 4)
    {
        choice2 = -1;
    }

}

return 0;
}

Header文件

struct Record
{
char  name[15];
int quantity;
double wholesalecost;
double retailcost;
};

void AddItem(ofstream& outFile);
void DisplayItem(ifstream& inFile);
void EditItem(ofstream& outFile);

功能

void AddItem(ofstream& outFile)
{
  Record record;

  cout << "What is the name of this record: ";
  cin.ignore();
  cin.getline(record.name,15);
  cout << "How many do we have(quantity): ";
  cin >> record.quantity;
  cout << "Whats the whole sale cost: ";
  cin >> record.wholesalecost;
  cout << "Whats the retail cost of " << record.name << ":";
  cin >> record.retailcost;

if(outFile)
{
    outFile.write((char*)&(record),sizeof(record));

}
else
{
    cout << "File not Found" << endl;
}
}

void DisplayItem(ifstream& inFile)
{
  Record record;
  int recordnum;
  cout << "Enter what record number you want to display " << endl;
  cin >> recordnum;
  recordnum--;

if(inFile)
{
    inFile.seekg(sizeof(Record) * recordnum, ios::beg);
    inFile.read(reinterpret_cast<char *>(&record), sizeof(record));

    cout << "Name: " << record.name << endl;
    cout << "Quantity: " << record.quantity << endl;
    cout << "Whole Sale Cost: " << record.wholesalecost << endl;
    cout << "Retail Cost: " << record.retailcost << endl;
}
else
{
    cout << "File not found" << endl;
}
}

您将所有内容都写入文件的开头,因此多个写入当然会相互覆盖。

您需要定义一种可以包含多条记录的文件格式,以及一种查找写入不与先前记录重叠的新记录的位置的方法,以及一种查找现有记录位置的简单方法。

您是否考虑过仅使用 SQL(或其他类型)数据库?

如上所述,您可以将文件打开为

ofstream outFile("RecordFile.dat", std::ios::out | std::ios::app);

或者只打开一次文件并在程序结束时将其关闭。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM