对分段错误的不正确理解

时间:2017-05-23 04:32:41

标签: c++ segmentation-fault fstream binaryfiles

我遇到了分段错误,而且从我读过的内容来看,由于我试图访问我不被允许的部分内存。

我几乎可以肯定我的问题出现在我的ShowAccounts函数内的while循环中。

while (input.read((char *) &account, sizeof(BankAccount)))

在多次尝试了解此阅读权如何发挥作用后,我认为我没有正确理解它。

我已经创建了3个BankAccount类型的帐户,它们存储在二进制文件AccountDetails.dat中,但是,我无法访问它们。

如果你无法帮助我解决为什么我会收到这个分段错误的整体推理,也许你可以解释一下读取功能是如何工作的以及它试图做的所有事情然后我可以做一些更多的评估?欢迎任何和所有回复。

#include <iostream>
#include <fstream>
using namespace std;

class BankAccount
{
public:
    void CreateAccount();
    void ShowAccount();
private:
    int accountNumber;
    string firstName;
    string lastName;
    char accountType;
    double balance;
};

void MakeAccount();
void ShowAccounts();

int main()
{
    ShowAccounts();

    return 0;
}

void BankAccount::CreateAccount()
{
    cout << "Enter the account number.\n";
    cin >> accountNumber;
    cout << "Enter the first and last name of the account holder.\n";
    cin >> firstName >> lastName;
    cout << "What kind of account is it? S for savings or C for checking.\n";
    cin >> accountType;
    cout << "How much are you depositing into the account?\n";
    cin >> balance;
    cout << "CREATED\n";
}

void BankAccount::ShowAccount()
{
    cout << "Account Number:  " << accountNumber << endl;
    cout << "Name:  " << firstName << " " << lastName << endl;
    cout << "Account Type:  " << accountType << endl;
    cout << "Current Balance:  $" << balance << endl;
}

void MakeAccount()
{
    BankAccount account;
    ofstream output;
    output.open("AccountDetails.dat", ios::binary|ios::app);
    if (!output)
        cerr << "Failed to open file.\n";
    account.CreateAccount();
    output.write((char *) &account, sizeof(BankAccount));
    output.close();
}

void ShowAccounts()
{
    BankAccount account;
    ifstream input;
    input.open("AccountDetails.dat", ios::binary);
    if (!input)
        cerr << "Failed to open file.\n";
    while (input.read((char *) &account, sizeof(BankAccount)))
    {
        account.ShowAccount();
    }
    input.close();
}

1 个答案:

答案 0 :(得分:0)

当您尝试将输入流中的字节直接读取到包含指针或字符串的结构上时,您将其包含的指针设置为garbage。 (字符数组将起作用。)尝试使用指针和字符串将导致未定义的行为,可能导致分段错误发生。或其他任何事情。

要检查这一点,请在调试器中加载程序,在该行上设置断点,然后运行。当你到达那里时,检查结构及其成员,看看它们包含的数据是否有效。

尝试将BankAccount::CreateAccount()功能调整为非交互式。