首先,我想解释一下我要做的事情。所以,我有一个包含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
答案 0 :(得分:3)
首先,您需要在{/ 1}}函数中使用之前定义结构。
其次,在read
函数中,变量read
是一个数组,而不是它的成员。因此,您应该使用t
和t[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
答案 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中打开时文本文件将无法读取,因为它不是普通文本,但读写更容易。