Member 13352712 Ответов: 2

Программа должна читать текстовый файл и отображать список записей, но эти списки не могут быть отображены при запуске программы.


#include <iostream>
#include <iomanip>
#include <cctype>
#include <string>
#include <cstring>
#include <fstream>
#include <cstdlib>
#include <conio.h>

using namespace std;

typedef struct
{
	char staff_name[30];
	char staff_id[10];
	char position[30];
	char IC_No[17];
	char date_joined[12];
	char address[20];
	char contact_no[14];
}RECORDS;

//function prototypes
void display_list(RECORDS record[], int rows);

int main(void)
{
	RECORDS record[200];

	int index = -1;
	char choice;
	
	//get input from the text file
	ifstream inFile("StaffRecord.txt");

	if (!inFile)//display error and exit
	{
		cout << "Error opening file\n";
		exit(100);
	}

	else
	{
		
		inFile.ignore(200, '\n');

		while (inFile)//get record in text file
		{
			inFile.getline(record[++index].staff_name, 24, '\t');
			inFile.getline(record[index].staff_id, 8, '\t');
			inFile.getline(record[index].position, 22, '\t');
			inFile.getline(record[index].IC_No, 15, '\t');
			inFile.getline(record[index].date_joined, 11, '\t');
			inFile.getline(record[index].address, 15, '\t');
			inFile.getline(record[index].contact_no, 12, '\n');


		}

		inFile.close();

		//display menu
		
			cout << "\n\t\t\t\t\t\tMenu\n\n";
			cout << "\t\t\t\t\t1 >> Display all records\n";
			cout << "\t\t\t\t\t2 >> Search by gender\n";
			cout << "\t\t\t\t\t3 >> Search by age\n";
			cout << "\t\t\t\t\t4 >> Search by keyword\n";
			cout << "\t\t\t\t\t5 >> Update records\n";
			cout << "\t\t\t\t\t6 >> Add new record\n";
			cout << "\t\t\t\t\t7 >> Delete a record\n";
			cout << "\t\t\t\t\t8 >> Exit\n\n";
			cout << "\t\t\t\t\t Enter your choice : ";
			cin >> choice;
			cout << endl;

			system("cls");

			display_list(record, index);
				
			
		
		system("cls");
	}

	return 0;
}

void display_list(RECORDS record[], int rows)
{

	for (int i = 0; i < rows; i++)
	{
		cout << left << setw(30) << record[i].staff_name
			<< left << setw(7) << record[i].staff_id
			<< left << setw(33) << record[i].position
			<< left << setw(25) << record[i].IC_No
			<< left << setw(20) << record[i].date_joined
			<< left << setw(25) << record[i].address
			<< left << setw(14) << record[i].contact_no << endl;
		system("pause");
		return;
	}
}


Что я уже пробовал:

Я пытался изменить значение размера файла , но результат все тот же, так что я думаю, что есть ошибки, которые я не заметил.

Jochen Arndt

Ваш файл содержит только одну запись?

Тогда ничего не отображается, потому что вы звоните

display_list(record, index);

где индекс - это количество записей минус одна, которое равно нулю для одной записи.

Member 13352712

у него есть список записей , я думал, что цикл while работает так, что все записи могут быть отображены

Jochen Arndt

Цикл while должен работать. Но подождите: Вы используете логический оператор потока C++11. Это будет ложно только при ошибках, но не при EOF! Таким образом, у вас будет бесконечный цикл, если не произойдет никакой ошибки!

Что касается моего предыдущего комментария: индекс инициализируется с -1 и увеличивается для каждой записи. Так каково же значение индекса, если в файле есть одна запись?

Это ноль. Затем вы передаете это значение в display_list () (которое больше не видно, потому что вы удалили его из своего вопроса).

Таким образом, display_list () вызывается с аргументом строки, равным нулю, и делает это:

for (int i = 0; i < rows; i++)

Сколько строк будет напечатано?

Никто. А если будет больше записей, то последняя никогда не будет напечатана.

Jochen Arndt

Вы спросили:
"Программа должна читать текстовый файл и отображать список записей, но эти списки не могут отображаться при запуске программы."

Так в чем же проблема, если вы тем временем получили какой-то результат?

Я просто указал на тот факт, что последняя запись не будет напечатана (что означает ничего не печатать, когда есть только одна запись) на основе кода, показанного с предыдущей версией. Проблема заключается не в инициализации с -1, а в передаче конечного значения. Так и должно быть:

display_list(record, index + 1)


И, пожалуйста, не размещайте код в комментариях. Никто здесь не будет читать это из-за отсутствующего форматирования. Разместите в своем вопросе части кода, связанные с проблемой, как уже было предложено.

2 Ответов

Рейтинг:
0

OriginalGriff

Этот код не показывает никаких попыток вывести что-либо: он просто считывает данные в цикле.
Вы не упоминаете, какую проблему вы получаете, когда запускаете этот код, но мы не можем помочь вам, даже если бы вы это сделали - для этого требуется Ваш массив, ваш файл и данные, которые он содержит, чтобы понять, что происходит при запуске кода.

Так что все будет зависеть от вас.
Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что именно то, что вы ожидали, произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас-вам пора освоить новый (и очень, очень полезный) навык: отладку!


Member 13352712

это та часть, которая читает цикл, но я должен написать часть, чтобы распечатать то , что читается, но ничего не отображается, я также отлаживаю шаг за шагом, но все равно ничего не меняется. Но спасибо за совет.

OriginalGriff

Ну, а вам не кажется, что та часть, которая их показывает, может быть здесь важна?
И когда вы использовали отладчик,что вы видели, когда входили? Отладчик не исправит проблему за вас, он дает вам инструменты, чтобы выяснить, где проблема!

OriginalGriff

Как будто вы пытаетесь сделать этот процесс как можно более медленным...

Помните, что мы не можем видеть ваш экран, получить доступ к вашему жесткому диску или прочитать ваши мысли - мы получаем только то, что вы печатаете для работы.
Так помоги же нам здесь! Когда ты это получишь? Где это написано? Что ты сделал, чтобы он так сказал? Мы даже не знаем, что вы используете для компиляции этого кода, не говоря уже о том, что вы делаете, чтобы получить сообщение.

Patrice T

Просто идея, попробуйте также показать код, который вы хотите, чтобы мы исправили.

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

Рейтинг:
0

Patrice T

Много проблем в вашем коде.
- display_list ожидает подсчет строк, когда вы высмеиваете его номер строки мачты.
- display_list никогда не будет отображаться больше 1 строки.
Используйте отладчик, чтобы увидеть, как работает ваш код, это большое подспорье для отладки.

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик-Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010-YouTube[^]
Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.