检索字符数组数据的问题
issues retrieving character array data
我是 C++ 的新手,我正在从事这个我绞尽脑汁想了一会儿的项目。
基本上,我想在这个 "database." 中有 10 条用户记录,现在我有 salary 和 year_hired 分别为 double 和 int。我想最终把它们变成一个数组。
我在这里遇到了几个问题:
- 当函数 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();
- 当我尝试使用我的程序的能力 "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
- 当提示用户"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]
.
我是 C++ 的新手,我正在从事这个我绞尽脑汁想了一会儿的项目。
基本上,我想在这个 "database." 中有 10 条用户记录,现在我有 salary 和 year_hired 分别为 double 和 int。我想最终把它们变成一个数组。
我在这里遇到了几个问题:
- 当函数 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();
- 当我尝试使用我的程序的能力 "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
- 当提示用户"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]
.