检索字符数组数据的问题

issues retrieving character array data

我是 C++ 的新手,我正在从事这个我绞尽脑汁想了一会儿的项目。

基本上,我想在这个 "database." 中有 10 条用户记录,现在我有 salary 和 year_hired 分别为 double 和 int。我想最终把它们变成一个数组。

我在这里遇到了几个问题:

  1. 当函数 outputLine 调用要从一名员工查看的数据时,除了出现乱码的 "name section" 之外,一切都显示得很好。见下文:

Enter employee ID (1-10) or 0 to end input:
5
Enter name, salary, then year hired:
test
130000
2009
Enter employee ID (1-10) or 0 to end input:
0
Enter choice 2 to choose employees:
2

Enter your choice:
1 - update an account
2 - add a new account
3 - end program
1
Enter account to update(1-10): 5
5
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
130000
2009

显示名字的代码如下。我还包含了我的洞察力结构:

struct employee {
int year_hired;
double salary;
char name[30];
int ID;
void outputLine(ostream &output, employee &employed)
{
output << employed.getId() << endl
    << employed.getName() << endl
    << employed.getsal() << endl
    << employed.getYearHired() << endl;

}
void setname(string n) {
    const char *ptr = &name[30];

    ptr = n.c_str();
  1. 当我尝试使用我的程序的能力 "update" 一个帐户时,我输入的工资不会改变存储的工资。 请参阅下面的复制和粘贴数据以供参考:

Enter account to update(1-10): 5
5
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
130000
2009

Enter salary: 20

Enter your choice:
1 - update an account
2 - add a new account
3 - end program
1
Enter account to update(1-10): 5
5
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
130000
2009
  1. 当提示用户"add" 一个新帐户时,它会检查该帐户是否有信息。即使我还没有设置该帐户,程序也会告诉我该帐户已存储信息。我有一段代码专门用于构造 10 个空白记录以供输入,但它似乎并没有真正做任何事情。

创建 10 条空白记录的部分:

            ofstream outdatabase("database.dat", ios::out | 
ios::binary);
            for (int i = 0; i < 10; i++) {
                outdatabase.write(reinterpret_cast <const char *> 
(&blankelist), sizeof(employee));
            }

添加新记录的部分:

void newrecord(fstream &insertinfile) {

int id = getid("Enter new employee ID");

insertinfile.seekg((id - 1) * sizeof(employee));

employee employed;
insertinfile.read(reinterpret_cast <char *>(&employed), sizeof(employee));

if (employed.getId() == 0)
{
    string name;
    double salary;
    int year_hired;

    cout << "Enter name, balance, and year hired: " << endl;
    cin >> name;
    cin >> salary;
    cin >> year_hired;

    employed.setname(name);
    employed.setSalary(salary);
    employed.setYearHired(year_hired);

    employed.setId(id);

    insertinfile.seekp((id- 1) * sizeof(employee));

    insertinfile.write(reinterpret_cast<const char *> (&employed), 
sizeof(employee));
}
else {
    cerr << "Employee ID: " << id
        << " already contains information." << endl;
}

}

我希望能够将 struct 下的 year_hired 变成一个字符串,最终用一个字符串存储一个 hire_date 。我也想把工资改成字符串也能显示出来

但是,现在我在从帐户输出姓名时遇到问题。

你们有什么关于如何解决字符数组问题的提示吗?我已经提供了到目前为止的代码。提前致谢!

编辑:我能够使用下面的答案解决数组问题

if (n.size() >= sizeof name) {
        cout << "Name " << n << " is too long\n";
    }
    else {
        strcpy_s(name, n.c_str());
    }

我仍在努力解决更新新记录和保存更改的问题。感谢您到目前为止的回复!

编辑 2:嘿!我解决了更新帐户的问题。

这是上面的问题 #2。我的代码是

void updaterecord(fstream &updateFile) {

int id = getid("Enter account to update");
{

    updateFile.seekg((id - 1) * sizeof(employee));
    employee employed;
    updateFile.read(reinterpret_cast <char *> (&employed), sizeof(employee));

    if (employed.getId() != 0)
    {
        outputLine(cout, employed);

        cout << "\nEnter the new name, salary, and year hired: ";
        double salary;
        string name;
        int year_hired;
        cin >> name >> salary >> year_hired;

        double oldsalary = employed.getsal();

        employed.setname(name);
        employed.setSalary(salary);
        employed.setYearHired(year_hired);

        updateFile.seekp((id) * sizeof(employed));

    }
    else
    {
        cerr << "Account # " << id << " has no information." << endl;
    }
}
}

修复:我在函数末尾更改并添加了以下内容:

updateFile.seekp((id - 1) * sizeof(employee));
updateFile.write(reinterpret_cast <const char*> (&employed), 
sizeof(employee));

不能使用指针赋值来复制 C 字符串,您需要使用 strcpy()

void setname(string n) {
    if (n.size() >= sizeof name) {
        cout << "Name " << n << " is too long\n";
    } else {
        strcpy(name, n.c_str());
    }
}

此外,

ptr = &name[30];

是指向 name 数组末尾之外的指针。数组的最后一个元素是 name[29].