Я пытаюсь прочитать текстовый файл в массив структуры. Я еще не нашел способ ввода его в массив структуры, но проблема с моим кодом заключается в том, что вывод продолжает зацикливаться. Я новичок в C ++, так как это первый курс программирования, который я прохожу.
Это текстовый файл записей, которые я поместил в разделенных «табуляцией».
1 Clark Kent 012-1449326 221, Jalan Pudu, Kuala Lumpur [email protected]
2 Bruce Wayne 013-9817470 65, Jalan Jejaka, Kuala Lumpur [email protected]
3 Peter Parker 017-6912495 26, Jalan Rajabot, Kuala Lumpur [email protected]
4 Yeoman Prince 014-1374040 22, Jalan 1/109e, Kuala Lumpur [email protected]
5 Tony Stark 016-7473151 21, Jalan Pandan, Kuala Lumpur [email protected]
6 Selina Kyle 012-4040928 Wisma Cosway, Kuala Lumpur [email protected]
7 Steve Rogers 018-9285217 Desa Pandan, Kuala Lumpur [email protected]
8 Alan Scott 019-5569400 2, Jalan U1/17, Shah Alam [email protected]
9 Britt Reid 011-7876738 43, Jalan SS2/23, Petaling Jaya [email protected]
10 Darcy Walker 011-4042788 Blok B, Setapak, Kuala Lumpur [email protected]
11 Reed Richards 019-2299339 Menara U, Bangsar, Kuala Lumpur [email protected]
12 Barbara Gordon 017-2297980 The Boulevard, Kuala Lumpur [email protected]
13 Don Diego Vega 012-4142987 10, Jalan Wangsa, Kuala Lumpur [email protected]
14 Billy Batson 013-9200151 122, Jalan Jejaka, Kuala Lumpur [email protected]
15 Barry Allen 017-7928822 Wisma Laxton, Kuala Lumpur [email protected]
16 Stanley Beamish 014-9177437 203, Sunwaymas, Batu Caves [email protected]
17 Dick Grayson 017-4023800 Pekeliling Bus, Kuala Lumpur [email protected]
18 James Howlett 012-7816910 Sri Hartamas, Kuala Lumpur [email protected]
19 Hal Jordan 013-3439897 302, Jalan Ampang, Kuala Lumpur [email protected]
20 Scott Summers 012-9057100 Menara Summit, Subang Jaya [email protected]
Это моя структура:
struct Employee {
int staffId;
char fullName[30];
char phoneNum[15];
char address[40];
char email[30];
};
Вызов функции read:
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 [email protected]
line read: 2 Bruce Wayne 013-9817470 65, Jalan Jejaka, Kuala Lumpur [email protected]
line read: 3 Peter Parker 017-6912495 26, Jalan Rajabot, Kuala Lumpur [email protected]
line read: 4 Yeoman Prince 014-1374040 22, Jalan 1/109e, Kuala Lumpur [email protected]
line read: 5 Tony Stark 016-7473151 21, Jalan Pandan, Kuala Lumpur [email protected]
line read: 6 Selina Kyle 012-4040928 Wisma Cosway, Kuala Lumpur [email protected]
line read: 7 Steve Rogers 018-9285217 Desa Pandan, Kuala Lumpur [email protected]
line read: 8 Alan Scott 019-5569400 2, Jalan U1/17, Shah Alam [email protected]
line read: 9 Britt Reid 011-7876738 43, Jalan SS2/23, Petaling Jaya [email protected]
line read: 10 Darcy Walker 011-4042788 Blok B, Setapak, Kuala Lumpur [email protected]
line read: 11 Reed Richards 019-2299339 Menara U, Bangsar, Kuala Lumpur [email protected]
line read: 12 Barbara Gordon 017-2297980 The Boulevard, Kuala Lumpur [email protected]
line read: 13 Don Diego Vega 012-4142987 10, Jalan Wangsa, Kuala Lumpur [email protected]
line read: 14 Billy Batson 013-9200151 122, Jalan Jejaka, Kuala Lumpur [email protected]
line read: 15 Barry Allen 017-7928822 Wisma Laxton, Kuala Lumpur [email protected]
line read: 16 Stanley Beamish 014-9177437 203, Sunwaymas, Batu Caves [email protected]
line read: 17 Dick Grayson 017-4023800 Pekeliling Bus, Kuala Lumpur [email protected]
line read: 18 James Howlett 012-7816910 Sri Hartamas, Kuala Lumpur [email protected]
line read: 19 Hal Jordan 013-3439897 302, Jalan Ampang, Kuala Lumpur [email protected]
line read: 20 Scott Summers 012-9057100 Menara Summit, Subang Jaya [email protected]
line read: 1 Clark Kent 012-1449326 221, Jalan Pudu, Kuala Lumpur [email protected]
line read: 2 Bruce Wayne 013-9817470 65, Jalan Jejaka, Kuala Lumpur [email protected]
line read: 3 Peter Parker 017-6912495 26, Jalan Rajabot, Kuala Lumpur [email protected]
line read: 4 Yeoman Prince 014-1374040 22, Jalan 1/109e, Kuala Lumpur [email protected]
line read: 5 Tony Stark 016-7473151 21, Jalan Pandan, Kuala Lumpur [email protected]
Любые способы предложить это прекратить зацикливание? Я пытаюсь воздержаться от установки установленного размера, например, 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
является всегда истина, поэтому ваш цикл никогда не закончится.
В любом случае в общей логике программы есть несколько ошибок, и это то, что вы должны исправить, прежде чем углубляться в функциональность отдельных пунктов меню.
Вторая часть вашего вопроса немного расплывчата. Вы пытаетесь ввести данные в свою структуру, или вы пытаетесь создать массив типа 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
, Промойте и повторите для оставшихся переменных, и вы получите себе вектор сотрудников.