c++ - 如何在不清除文件的情况下使用 ofstream 多次写入文件?

标签 c++ fstream file-handling ofstream

我正在尝试制作一个银行账户管理系统,但在尝试将多个账户的信息写入文件时遇到问题。

//Globals
class Account
{
public:
    Account() { "\n\tConstructing Account"; }
    ~Account() { "\n\tDeconstructing Account"; }

    //Accessor Methods
    void setPersonName(string X) { personName = X; }
    void setAccType(string X) { accType = X; }
    void setaccBalance(string X) { accBalance = X; }
    string getPersonName() { return personName; }
    string getAccType() { return accType; }
    string getAccBalance() { return accBalance; }


private:
    string personName;
    string accType;
    int accNumber[25];
    string accBalance;
};

//Function Prototypes
void createAcc();
void editAcc();
void saveAcc();
void closeAcc();
void dispAcc();
void loadAcc();

Account * CH;

int main()
{
    char choice[10];
    CH = new Account();

    cout << "\n\t Banking Management System 1.0\n";

    while (choice[0] != 'q')
    {
        cout << "\n\t---------------Main Menu---------------------";
        cout << "\n\t|                                            |";
        cout << "\n\t|          (O)PEN NEW ACCOUNT                |";
        cout << "\n\t|          (E)DIT ACCOUNT INFO               |";
        cout << "\n\t|          (D)ISPLAY ACCOUNT INFO            |";
        cout << "\n\t|          (L)OAD FILE                       |";
        cout << "\n\t|          (S)AVE ACCOUNT TO FILE            |";
        cout << "\n\t|          (C)LOSE ACCOUNT                   |";
        cout << "\n\t|          (Q)UIT                            |";
        cout << "\n\t|                                            |";
        cout << "\n\t----------------------------------------------\n\n\t";

        cin >> choice;

        switch (choice[0])
        {
        case 'o': createAcc();  break;
        case 'e': editAcc();  break;
        case 'd': dispAcc();  break;
        case 'l': loadAcc();  break;
        case 's': saveAcc();  break;
        case 'c': closeAcc();  break;
        case 'q': break;
        }
    }


    system("PAUSE");
    return 0;
}
//-----------------------------------------------------------------------------------------
void createAcc()
{
    CH = new Account();
}
//-----------------------------------------------------------------------------------------
void editAcc()
{
    string temp;
    system("CLS");
    cout << "\n\t---------------EDIT ACCOUNT---------------";

    cout << "\n\tName: ";
    cin.ignore();
    getline(cin, temp);
    CH->setPersonName(temp);

    cout << "\n\tAccount Type: ";
    getline(cin, temp);
    CH->setAccType(temp);

    cout << "\n\tAccount Balance: ";
    getline(cin, temp);
    CH->setaccBalance(temp);
}
//-----------------------------------------------------------------------------------------
void dispAcc()
{
    system("CLS");
    cout << "\n\n\t----------ACCOUNT INFORMATION-----------";
    cout << "\n\tName: " << CH->getPersonName();
    cout << "\n\tAccount Type: " << CH->getAccType();
    cout << "\n\tBalance: " << CH->getAccBalance();
    cout << "\n\t-----------------------------------------\n\n";
}
//-----------------------------------------------------------------------------------------
void loadAcc() {
    try
    {
        string temp;
        ifstream accFile;
        accFile.open("credentials.file", ios::in);

        getline(accFile, temp);
        CH->setPersonName(temp);

        getline(accFile, temp);
        CH->setAccType(temp);

        getline(accFile, temp);
        CH->setaccBalance(temp);

        accFile.close();
    }
    catch (exception X) {
        cout << "\n\tFile ERROR! Unable to load data.";
    }
}

//-----------------------------------------------------------------------------------------
void saveAcc()
{
try
    {
        ofstream accFile;
        accFile.open("credentials.file", ios::out);

        accFile << CH->getPersonName() << "\n";
        accFile << CH->getAccType() << "\n";
        accFile << CH->getAccBalance() << "\n";

        accFile.close();
        cout << "\n\tSuccess! Data was saved to file";
    }
    catch (exception X)
    {
        cout << "\n\tError! Could not save account details";
    }
}

当我创建一个新帐户并在我保存文件后编辑它的信息时,它会覆盖文件中的其他帐户。我希望能够创建多个帐户并将所有数据写入一个文件,这样我就可以拍照并选择要查看的帐户。我怎样才能做到这一点?如果需要,我可以让程序将每个新帐户写入一个单独命名的文件并以这种方式加载它们吗?真的坚持这一点将不胜感激我能得到的任何帮助!

最佳答案

看看ios::app ,你可能想做这样的事情:

accFile.open("credentials.file", ios::out | ios::app);

这将确保在每次写入之前查找到文件末尾。仅使用 ios::out,它也会重写任何你寻找的地方(如果你不明确的话,这是文件的开头)。

关于c++ - 如何在不清除文件的情况下使用 ofstream 多次写入文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49961985/

相关文章:

c++ - 初始化 C++ 线程并稍后运行

c++ - fstream 没有在文件上写任何东西

c++ - 防止 std::ifstream 创建空文件

C语言使用文件操作创建数据库

java - 如何用java读取txt文件的某些行?

c++ - 获取 CImage 的子图像

c++ - 为什么是0x7FFFFFFFull | (1 << 31) 在 C++ 中返回 0xFFFFFFFFFFFFFFFF?

c++ - C++ 复制构造函数有什么大惊小怪的?

c++ - 从对象C++中的文件读取内容时发生段错误

c - 尝试从文件中获取字符串并访问字符串中的各个字母时程序崩溃