简易程序:将文件中的数据存储到结构阵列中

时间:2015-09-04 23:03:50

标签: c++ arrays struct driver ifstream

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

该文件将包含:

姓名,身份证号码和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();
};

声明一个学生类型数组,最多可容纳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;

我被困在&#34;而#34;条件陈述。之后,我不知道应该怎样做才能逐行输入文件中的数据并放入&#34; struct array&#34;。截至目前,我觉得我已经尝试了一切!我删除了所有内容,并认为最好重新开始。它变得太复杂了!也许我只是不理解这个概念。如果有人能指出我正确的方向,请这样做!谢谢!

2 个答案:

答案 0 :(得分: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
}

(在您的代码中,您还需要跟踪您已阅读过多少Student。)

答案 1 :(得分:1)

以下是可能的解决方案之一:

#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;
}