【问题标题】:Easy Program: Store Data from a file into a Struct Array简易程序:将文件中的数据存储到结构数组中
【发布时间】:2015-09-04 23:03:49
【问题描述】:

我是编程新手,我无法从文件中读取数据并将其输入到结构数组中,同时跟踪输入的每个数据:

该文件将包含:

姓名、身份证号和 GPA

    Courtney Love 1234569 3.5
    Bob Joe 1234570 3.0
    Dave Henry 1234571 2.9

struct Student
{
    string name;
    int id;
    float GPA;
    void printStudent();
};

声明一个 Student 类型的数组,最多可容纳 5 个成员:

    Student a_members[5];

打开文件,读入每一行并将数据存储在数组中,跟踪读入的每个学生:

    fstream file_;
    file_.open ("students.txt");
    if(file_.is_open())
    {
       while(file_.good())
        {
        }
    }
    else
    {
    cout << "File is not open"<< endl;
    }
    return 0;

我被困在“while”条件语句上。之后我不知道应该怎么做才能将文件中的数据逐行输入并放入“结构数组”中。到现在为止,我觉得我已经尝试了一切!我删除了所有内容,并认为最好重新开始。变得太复杂了!也许我只是不理解这个概念。如果有人能指出我正确的方向,请这样做!谢谢!

【问题讨论】:

标签: c++ arrays struct driver ifstream


【解决方案1】:

你不应该使用good(),就像你不应该使用eof()一样。
(在任何体面的初学者级材料中都没有使用它们,但每个初学者都设法找到它们。然后他们想知道为什么它不起作用。)

您应该依赖这样一个事实,即如果流本身处于良好状态,则它是“真实的”,并且继续阅读直到它不是。

惯用的 C++ 看起来像这样:

std::ifstream file("students.txt");
Student s;
while (file >> s.name >> s.id >> s.GPA)
{
    // Process the student
}

或者,一个花哨的版本:

std::istream& operator>> (std::istream& is, Student& s)
{
    return is >> s.name >> s.id >> s.GPA;
}

std::ifstream file("students.txt");
Student s;
while (file >> s)
{
    // Process the student
}

(在您的代码中,您还需要跟踪您阅读了多少Students。)

【讨论】:

    【解决方案2】:

    这是可能的解决方案之一:

    #include <iostream>
    #include <vector>
    #include <fstream>
    
    struct Student
    {
        Student() : first_name(), surname(){}
        char first_name[64];
        char surname[64];
        int id;
        float GPA;
        void printStudent()
        {
            std::cout << "Name: " << first_name << " " << surname << " ID: " << id << " GPA: " << this->GPA << std::endl;
        }
    };
    
    std::vector<Student>student;
    
    bool LoadFile(const char* filename)
    {
        if (filename == NULL)return false;
        std::fstream stream(filename, std::ios::in);
        if (!stream.is_open())return false;
        else
        {
            char buffer[255]; // for solution 1!
            while (!stream.eof())
            {
                memset(buffer, 0, sizeof(buffer));
                Student _student;
    
                #pragma region SOLUTION_1
                //stream.getline(buffer, sizeof(buffer));
                //sscanf(buffer, "%s %s %d %f", _student.first_name, _student.surname, &_student.id, &_student.GPA);
                #pragma endregion
    
                #pragma region SOLUTION_2
                stream >> _student.first_name >> _student.surname >> _student.id >>_student.GPA;
                #pragma endregion
    
                student.push_back(_student);
                student[student.size() - 1].printStudent();
            }
        }
        return true;
    }
    
    int main()
    {
        LoadFile("students.txt");
        getchar();
        return 0;
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 2015-07-01
    相关资源
    最近更新 更多