为什么我可以在函数内部打印结构,而不能在外部打印?

时间:2021-04-11 17:46:50

标签: c++

我已经为此工作了一个星期,但仍然找不到解决方案,当我在函数“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);
}

2 个答案:

答案 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;
    }
}
相关问题