我已经为此工作了一个星期,但仍然找不到解决方案,当我在函数“LoadPerson”中打印结构人的元素时,它可以正常运行,但是当我在 main 中尝试时,却一团糟。我知道元素的存储方式一定有问题,但我不知道出了什么问题。提前感谢您的帮助
PS:文本文件只包含名称;姓氏;年龄的行
#include <iostream>
using namespace std;
struct TOsoba {
char name[20];
char surname[20];
int age;
};
void LoadPerson(FILE* file, TOsoba person)
{
char str[20];
char tempAge[5];
fgets(str, 20, file);
char *token1, *next_token1;
token1 = strtok_s(str, ";", &next_token1);
int order_in_lane = 0;
while (token1 != NULL)
{
if (order_in_lane == 0)
{
memcpy(person.name, token1, strlen(token1) + 1);
//cout << person.name << endl;
token1 = strtok_s(NULL, ";", &next_token1);
}
else if (order_in_lane == 1)
{
memcpy(person.surname, token1, strlen(token1) + 1);
//cout << person.surname << endl;
token1 = strtok_s(NULL, ";", &next_token1);
}
else if (order_in_lane == 2)
{
memcpy(tempAge, token1, strlen(token1) + 1);
person.age = atoi(tempAge);
//cout << person.age << endl;
token1 = strtok_s(NULL, ";", &next_token1);
}
order_in_lane++;
}
}
int LoadManyHuman(TOsoba osoby[], const char* jmeno_souboru)
{
FILE* file;
int pocet = 0;
fopen_s(&file, jmeno_souboru, "r");
if (file == NULL) {
perror("Error opening file");
return (-1);
}
while (!feof(file)) {
LoadPerson(file, osoby[pocet]);
pocet++;
}
fclose(file);
return (pocet);
}
void OutputHumans(TOsoba persons[], int amount)
{
// vypise osoby - prijmeni jmeno Vek
for (int i = 0; i < amount; i++)
{
cout << persons[amount].name;
cout << persons[amount].surname;
cout << persons[amount].age << endl;
}
}
int main()
{
TOsoba ManyHumans[50];
int pocet_osob = LoadManyHuman(ManyHumans, "osoby.txt");
OutputHumans(ManyHumans, pocet_osob);
}
答案 0 :(得分:1)
在 LoadPerson 中你传递一个值:
void LoadPerson(FILE* file, TOsoba person)
所以你不能修改它的内容。您必须有一个指向 TOsoba 的指针才能对其进行修改。
void LoadPerson(FILE* file, TOsoba *person)
或参考(感谢@Thomas Matthews
void LoadPerson(FILE* file, TOsoba &person)
然后根据此更改其他部分代码。
答案 1 :(得分:1)
您尝试使用 amount
作为索引访问人员。试试这个:
void OutputHumans(TOsoba persons[], int amount)
{
// vypise osoby - prijmeni jmeno Vek
for (int i = 0; i < amount; i++)
{
cout << persons[i].name;
cout << persons[i].surname;
cout << persons[i].age << endl;
}
}