从文本文件读取到结构

时间:2016-10-21 12:57:10

标签: c++ c++11

首先,我想解释一下我要做的事情。所以,我有一个包含10个名字的文本文件,后跟他们的分数。我正在尝试使用函数(void)创建一个结构并从文件中读取信息。那是我的代码和文本文件:

代码:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

void read(struct laLiga t[]) {
    ifstream infile("info.txt");
    int i = 0;
    while(infile >> t.team[i] >> t.points[i]) {
        infile.get(t.team);
        infile >> t.points;
        i++;
    }
}

struct laLiga {
    char team[50];
    int points;
};

int main() {
    struct laLiga t[10];
    read(t);
    return 0;
}

文本文件:

Athletic Bilbao  15
Atletico Madrid  18
Barcelona  16
Alaves  10
Las Palmas  12
Real Madrid  18
Real Sociedad  10
Sevilla  17
Eibar  11
Villarreal  16

3 个答案:

答案 0 :(得分:3)

首先,您需要在{/ 1}}函数中使用之前定义结构。

其次,在read函数中,变量read是一个数组,而不是它的成员。因此,您应该使用tt[i].team

第三,您已经在循环条件中使用t[i].points运算符从文件中读取数据。你不应该在循环中再次

第四,您想要阅读的输入文件实际上比您想象的更难解析。这是因为您可以在没有的情况下使用其中包含空格的名称。输入流的>>函数和输入运算符get都在空格上分开。您应该read the whole line,然后将其拆分到最后一个空格。

最后,实际上我应该写答案的原因是你实际上没有问过问题,或者告诉我们你的代码有什么问题。有关将来的问题,请read about how to ask good questions

答案 1 :(得分:1)

您可以使用std::vector来简化操作:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>
#include <iomanip>

using namespace std;

auto file_text = 
R"(Athletic Bilbao  15
Atletico Madrid  18
Barcelona  16
Alaves  10
Las Palmas  12
Real Madrid  18
Real Sociedad  10
Sevilla  17
Eibar  11
Villarreal  16)";

struct laLiga {
    std::string team;
    int points;
};

void read(std::vector<laLiga>& t) {
    //ifstream infile("info.txt"); // would also work
    std::stringstream infile{file_text};
    while(infile) {
        laLiga laliga{};
        std::string partial_team_name{};
        while(!(infile >> laliga.points)) { // keep going until we get the points
            infile.clear(); // we could not read points, infile stream now in error; clearing to continue
            if(infile >> partial_team_name) // maybe the next string is part of a team name
                laliga.team += (laliga.team.empty() ? "" : " ") + partial_team_name; // add to team name with space if there was something already in there
            else
                return; // no points, no team, we're done
        }
        t.push_back(laliga); // after we get the points we can add the team
    }
}

int main() {
    std::vector<laLiga> t;
    read(t);
    for(auto i : t) {
        std::cout << std::setw(30) << i.team;
        std::cout << std::setw(10) << i.points << '\n';
    }
    return 0;
}

输出:

       Athletic Bilbao        15
       Atletico Madrid        18
             Barcelona        16
                Alaves        10
            Las Palmas        12
           Real Madrid        18
         Real Sociedad        10
               Sevilla        17
                 Eibar        11
            Villarreal        16

live demo

答案 2 :(得分:0)

如果您想在文本文件中读取或写入结构,那么最好使用ifstream read()函数和ofstream write()函数。以下是如何使用它们。

#include <iostream>
#include <fstream>
#include <cstring> // for strncpy()

using namespace std;

struct laLiga {
    char team[50];
    int points;
};

int main()
{
struct laLiga t;

strncpy(t.team,"Some Name",sizeof("Some Name"));
t.points = 100;

//do this for writing  a complete struct to a text file at once
ofstream output("info.txt");
output.write(reinterpret_cast<char*>(&t),sizeof(t));
output.close();

//do this for reading a complete struct from a text file at once

struct laLiga T;

ifstream input("info.txt");
input.read(reinterpret_cast<char*>(&T),sizeof(T));
input.close();

//now T will hold both the name and points fields from the text file without doing it individually

cout << "Name = " <<T.team << endl;
cout << "Points = " << T.points << endl;

return 0;
}

OUTPUT(控制台)

   Name = Some Name

   Points = 100

read()write()函数的第一个参数应该是char*,这就是我们使用reinterpret_cast将完整结构转换为字节序列然后写入文件的原因。 这样做的唯一缺点是,在Windows中打开时文本文件将无法读取,因为它不是普通文本,但读写更容易。