Для чтения из текстового файла и ввода в структуру массива с последующим отображением данных прочитайте Stack Overflow

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

Это моя структура:

struct Employee {
char staffId[5];
char fullName[30];
char phoneNum[15];
char address[40];
char email[30];
};

Это мой текстовый файл (столбцы разделены «табуляцией»):

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]

Мой код для чтения из текстового файла:

ifstream in("list.txtwith extension");
Employee *totaldata = new Employee[value + 1];
string line;
while (getline(in, line)) {
istringstream iss(line);
string token;

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
in.getline(totaldata[value].staffId, 5, '\t');
in.getline(totaldata[value].fullName, 30, '\t');
in.getline(totaldata[value].phoneNum, 15, '\t');
in.getline(totaldata[value].address, 40,'\t');
in.getline(totaldata[value].email, 30, '\t');
value++;
}
cout << endl;

for (int i = 0; i < value; i++)
{
cout << totaldata[value].staffId << "\t"<< totaldata[value].fullName << "\t"<< totaldata[value].phoneNum << "\t"<< totaldata[value].address << "\t"<< totaldata[value].email << endl;
}

Я не могу ввести его в массив структуры и не могу отобразить его?

-2

Решение

У вас длинный список ошибок в вашей проге!

1) предоставленные вами данные не имеют вкладок (возможно, только проблема с копированием & приклеить к ТАК)
так что будьте уверены, что ваш следующий пост, так что ваши данные отформатированы, как описано!

2) Ваше поле «номер телефона» должно быть коротким. В записях данных присутствуют более длинные номера телефонов

3) вы должны использовать константы вместо жестко закодированных значений для размера полей. Если вы измените размер поля в одном месте, вы рискуете пропустить это в других местах! смотри пример!

4) последний элемент каждой строки не будет содержать вкладку в конце, я верю! Так что последний getline в строке должен читаться до конца, а не до табуляции!

5) Ваш цикл для печати данных должен использовать цикл var i и не value который является номером первого элемента ЗАДНИМ! ваши данные!

6) Ваш цикл чтения был полностью сбит с толку. Я немного уменьшил это;)

7) вы используете фиксированный размер элементов / записей. Но вы не проверяете на переполнение! Так что, если значение становится 11, ваша программа падает!

8) Как общее замечание: ваша программа на С-коде! Вы используете не объекты, а простые структуры данных и функции, которые непосредственно записывают эти структуры данных. Это не объектно-ориентированное и имеет много проблем, таких как перезапись размера поля, отсутствие проверки диапазонов и наличие противоречивых данных!

В конце я добавил еще один пример стиля c ++. Этот пример также не очень совершенен, так как он требует много копий строк во время обработки, что делает его медленнее, чем старый добрый код в стиле c. Но это должно помочь вам дать представление об использовании объектов, которые знают, как выполнять такие действия, как чтение / запись собственных данных. Как сказано: только в качестве отправной точки и далеко от действительно хорошо!

struct Employee {
static const unsigned int staffIdLen = 5;
static const unsigned int fullNameLen = 30;
static const unsigned int phoneNumLen = 20;
static const unsigned int addressLen = 40;
static const unsigned int emailLen = 30;

char staffId[staffIdLen];
char fullName[fullNameLen];
char phoneNum[phoneNumLen];
char address[addressLen];
char email[emailLen];
};int main()
{
const unsigned int maxRecords = 10;
std::ifstream in("f.txt");
Employee *totaldata = new Employee[ maxRecords ];
std::string line;
unsigned int value = 0;

while ( std::getline(in, line) )
{
std::cout << "Read from file:" << line << std::endl;

std::istringstream iss(line);

iss.getline(totaldata[value].staffId, Employee::staffIdLen, '\t');
iss.getline(totaldata[value].fullName, Employee::fullNameLen, '\t');
iss.getline(totaldata[value].phoneNum, Employee::phoneNumLen, '\t');
iss.getline(totaldata[value].address, Employee::addressLen,'\t');
iss.getline(totaldata[value].email, Employee::emailLen);
value++;
if ( value == maxRecords ) break;
}

std::cout << "Finish reading file " << std::endl;

for (int i = 0; i < value; i++)
{
std::cout << "----------------start-----------" << std::endl;
std::cout << totaldata[i].staffId << "\t"<< totaldata[i].fullName << "\t"<< totaldata[i].phoneNum << "\t"<< totaldata[i].address << "\t"<< totaldata[i].email << std::endl;

std::cout << "--------------end--------------" << std::endl;

}
}

Пример с ++:

class Employee {
private:
std::string staffId;
std::string fullName;
std::string phoneNum;
std::string address;
std::string email;

public:
friend std::istream& operator>>( std::istream&, Employee& );
friend std::ostream& operator<<( std::ostream&, const Employee& );
};

std::istream& operator>>( std::istream& is, Employee& e)
{
std::getline( is, e.staffId, '\t');
std::getline( is, e.fullName, '\t');
std::getline( is, e.phoneNum, '\t');
std::getline( is, e.address, '\t');
std::getline( is, e.email );

return is;
}

std::ostream& operator<<( std::ostream& os, const Employee& e)
{
os << e.staffId << e.fullName << e.phoneNum << e.address << e.email << std::endl;

return os;
}

int main()
{
std::ifstream in("f.txt");
std::vector<Employee> employees;

do
{
Employee e;
in >> e;

if ( in.fail() ) break;
employees.push_back( e );
} while( 1 );

for ( auto& e: employees)
{
std::cout << e << std::endl;
}

}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]