我正在尝试将文本文件读取到结构数组中。我还没有找到将其输入到结构数组中的方法,但我的代码的问题是输出一直在循环。我是C++的新手,因为这是我参加的第一门编程课程。
这是我放入的记录的文本文件,用"tab"分隔。
1 Clark Kent 012-1449326 221, Jalan Pudu, Kuala Lumpur clark_kent@gmail.com
2 Bruce Wayne 013-9817470 65, Jalan Jejaka, Kuala Lumpur bruce_wayne@hotmail.com
3 Peter Parker 017-6912495 26, Jalan Rajabot, Kuala Lumpur peterparker@zoho.net
4 Yeoman Prince 014-1374040 22, Jalan 1/109e, Kuala Lumpur yeoman_prince@yahoo.com
5 Tony Stark 016-7473151 21, Jalan Pandan, Kuala Lumpur tonystark@zoho.net
6 Selina Kyle 012-4040928 Wisma Cosway, Kuala Lumpur selina_kyle@gmail.com
7 Steve Rogers 018-9285217 Desa Pandan, Kuala Lumpur steverogers@hotmail.com
8 Alan Scott 019-5569400 2, Jalan U1/17, Shah Alam alanscott@gmail.com
9 Britt Reid 011-7876738 43, Jalan SS2/23, Petaling Jaya brittreid@yahoo.com
10 Darcy Walker 011-4042788 Blok B, Setapak, Kuala Lumpur darcywalker@gmail.com
11 Reed Richards 019-2299339 Menara U, Bangsar, Kuala Lumpur reedrichards@zoho.net
12 Barbara Gordon 017-2297980 The Boulevard, Kuala Lumpur barbaragordon@gmail.com
13 Don Diego Vega 012-4142987 10, Jalan Wangsa, Kuala Lumpur donvega@zoho.net
14 Billy Batson 013-9200151 122, Jalan Jejaka, Kuala Lumpur billybatson@hotmail.com
15 Barry Allen 017-7928822 Wisma Laxton, Kuala Lumpur barryallen@gmail.com
16 Stanley Beamish 014-9177437 203, Sunwaymas, Batu Caves stanleybeamish@yahoo.com
17 Dick Grayson 017-4023800 Pekeliling Bus, Kuala Lumpur dickgrayson@hotmail.com
18 James Howlett 012-7816910 Sri Hartamas, Kuala Lumpur jameshowlett@zoho.net
19 Hal Jordan 013-3439897 302, Jalan Ampang, Kuala Lumpur haljordan@yahoo.com
20 Scott Summers 012-9057100 Menara Summit, Subang Jaya scottsummers@zoho.net
这是我的结构:
struct Employee {
int staffId;
char fullName[30];
char phoneNum[15];
char address[40];
char email[30];
};
读取的函数调用:
int main(void) {
int choice;
int value = 0;
Employee data;
menu();
cin >> choice;
do {
if (choice == 1) {
read();
}
else if (choice == 2) {
add(value, &data);
}
else if (choice == 3) {
list(value, &data);
}
else if (choice == 4) {
search();
}
else if (choice == 5) {
update();
}
else if (choice == 6) {
deletes();
}
else if (choice == 7) {
exit();
}
else {
cout << "n **Invalid choice option. Please enter from numbers 1 to 7 : ";
cin >> choice;
}
} while (choice != 1 || choice != 2 || choice != 3 || choice != 4 || choice != 5 || choice != 6 || choice != 7);
return 0;
}
这是我读取文件的代码:
void process(string* line) {
cout << "line read: " << *line << endl;
}
void read()
{
string line;
ifstream in("list.txt");
if (!in.is_open()) {
cerr << "File can't be opened! " << endl;
}
while(getline(in,line)) {
process(&line);
}
if (in.bad()) {
cerr << "File can't be read! " << endl;
}
in.close();
return;
}
这是我的输出:
line read: 1 Clark Kent 012-1449326 221, Jalan Pudu, Kuala Lumpur clark_kent@gmail.com
line read: 2 Bruce Wayne 013-9817470 65, Jalan Jejaka, Kuala Lumpur bruce_wayne@hotmail.com
line read: 3 Peter Parker 017-6912495 26, Jalan Rajabot, Kuala Lumpur peterparker@zoho.net
line read: 4 Yeoman Prince 014-1374040 22, Jalan 1/109e, Kuala Lumpur yeoman_prince@yahoo.com
line read: 5 Tony Stark 016-7473151 21, Jalan Pandan, Kuala Lumpur tonystark@zoho.net
line read: 6 Selina Kyle 012-4040928 Wisma Cosway, Kuala Lumpur selina_kyle@gmail.com
line read: 7 Steve Rogers 018-9285217 Desa Pandan, Kuala Lumpur steverogers@hotmail.com
line read: 8 Alan Scott 019-5569400 2, Jalan U1/17, Shah Alam alanscott@gmail.com
line read: 9 Britt Reid 011-7876738 43, Jalan SS2/23, Petaling Jaya brittreid@yahoo.com
line read: 10 Darcy Walker 011-4042788 Blok B, Setapak, Kuala Lumpur darcywalker@gmail.com
line read: 11 Reed Richards 019-2299339 Menara U, Bangsar, Kuala Lumpur reedrichards@zoho.net
line read: 12 Barbara Gordon 017-2297980 The Boulevard, Kuala Lumpur barbaragordon@gmail.com
line read: 13 Don Diego Vega 012-4142987 10, Jalan Wangsa, Kuala Lumpur donvega@zoho.net
line read: 14 Billy Batson 013-9200151 122, Jalan Jejaka, Kuala Lumpur billybatson@hotmail.com
line read: 15 Barry Allen 017-7928822 Wisma Laxton, Kuala Lumpur barryallen@gmail.com
line read: 16 Stanley Beamish 014-9177437 203, Sunwaymas, Batu Caves stanleybeamish@yahoo.com
line read: 17 Dick Grayson 017-4023800 Pekeliling Bus, Kuala Lumpur dickgrayson@hotmail.com
line read: 18 James Howlett 012-7816910 Sri Hartamas, Kuala Lumpur jameshowlett@zoho.net
line read: 19 Hal Jordan 013-3439897 302, Jalan Ampang, Kuala Lumpur haljordan@yahoo.com
line read: 20 Scott Summers 012-9057100 Menara Summit, Subang Jaya scottsummers@zoho.net
line read: 1 Clark Kent 012-1449326 221, Jalan Pudu, Kuala Lumpur clark_kent@gmail.com
line read: 2 Bruce Wayne 013-9817470 65, Jalan Jejaka, Kuala Lumpur bruce_wayne@hotmail.com
line read: 3 Peter Parker 017-6912495 26, Jalan Rajabot, Kuala Lumpur peterparker@zoho.net
line read: 4 Yeoman Prince 014-1374040 22, Jalan 1/109e, Kuala Lumpur yeoman_prince@yahoo.com
line read: 5 Tony Stark 016-7473151 21, Jalan Pandan, Kuala Lumpur tonystark@zoho.net
有什么方法可以建议它停止循环吗?我尽量避免设置20这样的大小,因为在程序的另一部分,我应该添加更多的员工记录。所以,我的问题是:
- 如何阻止它无限循环
- 如何将读取的行输入到结构数组中
提前谢谢。
试试这个,逐行读取文件,然后根据分隔符t
解析每一行。
void readFile(const string& filename) {
ifstream ifs(filename);
string line;
while (getline(ifs, line)) {
istringstream iss(line);
string token;
Employee emp;
while (getline(iss, token, 't')) {
// if you just want to print the information
cout << token << 't';
// or you can store it in an Employee object
// ...
}
cout << endl;
}
}
问题是,你从来没有要求用户选择新的菜单,所以你的程序会被困在第一个选择中,并无休止地循环。
如果cin >> choice;
在do
循环中,您的循环应该是这样的。
do {
cin >> choice;
if (choice == 1) {
read();
}
...
有了这个更改,您还需要重写错误处理逻辑,但我将把它留给您。
正如Bob__在下面的评论中所说,循环条件的逻辑是错误的choice != 1 || choice != 2 || choice != 3 || choice != 4 || choice != 5 || choice != 6 || choice != 7
总是true,所以循环永远不会终止。
在任何情况下,您的整体程序逻辑中都有几个错误,在进入单个菜单项的功能之前,您应该修复这些错误。
问题的第二部分有点模糊。您是想将数据输入到结构中,还是想创建一个employee
类型的数组,并将每个员工的数据放入该数组的索引中?无论哪种情况,我都会回答后者。
至于你的第一个问题,停止无限循环很简单。while (choice != 1 || choice != 2 || choice != 3 || choice != 4 || choice != 5 || choice != 6 || choice != 7)
是你的问题。这一行的逻辑是:"如果用户输入了一个不等于1、2或3的数字……继续循环。"然而,这意味着无论用户输入什么数字,循环都将继续。假设您的目标是继续向用户请求choice
,直到他们另行指定,那么更好的循环是:
do{
cin >> choice;
...
}
while(choice != 0);
在这种情况下,如果用户输入0-7以外的数字,则程序进入cout << "n **Invalid choice option. Please enter from numbers 1 to 7 : "
,但如果用户输入0
,则程序结束。您可以将0更改为任何您喜欢的内容。
至于将数据输入到结构中,过程非常简单。通常情况下,您会使用重载的>>
运算符,但这似乎超出了您当前的范围,因此我们将以更基本的方式进行操作。除非你确切地知道你想了解的员工人数,否则你需要使用类型为employee
的向量。为了便于使用,请在结构中将char
数组更改为字符串。以下代码是关于如何读入数据的模板。
vector<employee> parse_text(){
ifstream fin("lines.txt");
vector<employee> employees;
while(!fin.eof()){
string temp_id, temp_fname, temp_lname;
employee temp;
fin >> temp_fname >> temp_lname;
temp.fullName = temp_fname + temp_lname;
fin >> temp_id;
temp.staffId = (int)temp_id;
...
employees.push_back(temp);
}
fin.close();
return employees;
}
显然,你必须添加几行,但这应该足以让你开始。它当前读取员工的名字和姓氏,将它们连接起来,并将其存储为员工的fullName
。然后,它读取员工的ID,将其强制转换为int
(因为getline
存储字符串(,然后将其存储为staffId
。对剩下的变量进行冲洗和重复,您将拥有一个员工向量。