我想从txt文件中读取分数。分数将进入结构。
struct playerScore
{
char name[32];
int score, difficulty;
float time;
};
文本文件如下所示
Seth 26.255 40 7
作为一行,其中每个项目后跟一个选项卡。 (姓名\ t时间\ t得分\ t难度\ n)
当我开始阅读文本时,我不知道如何告诉程序何时停止。分数文件可以是任意数量的行或分数条目。这就是我的尝试。
hs.open("scores.txt", ios_base::in);
hs.seekg(0, hs.beg);
if (hs.is_open())
{
int currpos = 0;
while (int(hs.tellg()) != int(hs.end));
{
hs>> inScore.name;
hs >> inScore.time;
hs >> inScore.score;
hs >> inScore.difficulty;
hs.ignore(INT_MAX, '\n');
AllScores.push_back(inScore);
currpos = (int)hs.tellg();
}
}
我正在尝试创建一个循环,将一行代码读入数据的临时结构中,然后将该结构推送到结构的向量中。然后使用输入指针的当前位置更新currpos变量。然而,循环只是卡在条件上并冻结。
答案 0 :(得分:1)
有很多种方法可以做到这一点,但以下内容很可能就是你要找的。声明一个自由运算符,用于提取玩家得分的单行定义:
std::istream& operator >>(std::istream& inf, playerScore& ps)
{
// read a single line.
std::string line;
if (std::getline(inf, line))
{
// use a string stream to parse line by line.
std::istringstream iss(line);
if (!(iss.getline(ps.name, sizeof(ps.name)/sizeof(*ps.name), '\t') &&
(iss >> ps.time >> ps.score >> ps.difficulty)))
{
// fails to parse a full record. set the top-stream fail-bit.
inf.setstate(std::ios::failbit);
}
}
return inf;
}
这样,您的读取代码现在可以执行此操作:
std::istream_iterator<playerScore> hs_it(hs), hs_eof;
std::vector<playerScore> scores(hs_it, hs_eof);
答案 1 :(得分:0)
我不认为你可以只是&gt;&gt;从你的文件。你认为它会花费一切直到\ t? :)
您可以尝试使用strtok()作为示例标记 我猜它可以使用'\ t'来分割字符串并通过此函数获取每个变量所需的字符串部分 如果strtok()不能正常工作,我猜你可以直接复制到子循环中的'\ t'
答案 2 :(得分:0)
你可以这样做
playerScore s1;
fstream file;
file.open("scores.txt", ios::in | ios::out);
while(!file.eof()) //For end of while loop
{
file.read(s1, sizeof(playerScore));//read data in one structure.
AllScores.push_back(s1);
}