简单的程序:存储数据从一个文件到一个结构数组

Easy Program: Store Data from a file into a Struct Array

本文关键字:一个 文件 结构 数组 程序 简单 存储 数据      更新时间:2023-10-16

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

文件将包含:

姓名、ID号、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;

我被"while"条件语句卡住了。在那之后,我不知道我应该怎么做,从文件中逐行输入数据,并放入"结构数组"。到现在为止,我觉得我已经尝试了所有的方法!我把所有东西都删了,觉得最好重新来过。事情变得太复杂了!也许我只是没有理解这个概念。如果有人能给我指出正确的方向,请这样做!谢谢你!

你不应该使用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)

这里有一个可能的解决方案:

#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;
}
相关文章: