繁体   English   中英

从文件读取到结构数组

[英]Reading from a file into an array of structs

首先,我想说这是我的CS161课程的作业,所以虽然直接的答案会很好,但一个很好的解释对我来说更有帮助。 我们本周已经介绍了结构,但是我的代码有些问题。 我现在的目标是从一个名为“QBInfo.txt”的文件中读取三个结构的数组。

struct QuarterBack{
    string name;
    int completions[kNumGames];
    int attempts[kNumGames];
    int yards[kNumGames];
    int touchdowns[kNumGames];
    int interceptions[kNumGames];
};

QuarterBack players[kNumPlayers] = {player1, player2, player3};

另外,如果有帮助我应该说kNumPlayers是一个设置为3的常量,而kNumGames是一个设置为10的常量。

这是我用来从我的文件中读取的代码。 虽然它似乎没有用,但我一直不知道为什么,所以我想我可能会向社区寻求帮助。

ifstream myIF;
    myIF.open("QBInfo.txt");
    string trash;
    string temp;
    getline(myIF, trash);
    for(int i = 0; i < kNumPlayers; i++){
        getline(myIF, temp);
        players[i].name = temp;
        for(int j = 0; i < kNumGames; j++){
            myIF >> players[i].completions[j];
            myIF >> players[i].attempts[j];
            myIF >> players[i].yards[j];
            myIF >> players[i].touchdowns[j];
            myIF >> players[i].interceptions[j];
        }
    }

这是我的讲师提供的测试用例文件。 第一个数字用于分配的挑战部分,由于时间限制,我将在稍后尝试。 这是我的循环开始之前getline(myIF, trash)部分代码的原因。

3
Peyton Manning              
27  42  462 7   0
30  43  307 2   0
32  37  374 3   0
28  34  327 4   0
33  42  414 4   1
28  42  295 2   1
29  49  386 3   1
30  44  354 4   3
25  36  330 4   0
24  40  323 1   0
Tom Brady               
29  52  288 2   1
19  39  185 1   0
25  36  225 2   1
20  31  316 2   0
18  38  197 0   1
25  43  269 1   1
22  46  228 0   1
13  22  116 1   1
23  33  432 4   0
29  40  296 1   1
Drew Brees              
26  35  357 2   1
26  46  322 1   2
29  46  342 3   1
30  39  413 4   0
29  35  288 2   0
17  36  236 2   1
26  34  332 5   0
30  51  382 2   2
34  41  392 4   0
30  43  305 1   1

使用istringstream使用从文件读取的数据填充结构成员。 在诸如此类的短程序中命名可能不是特别重要 - 但考虑传达意义的变量名称是一个好习惯。 数据文件似乎具有第一行中的玩家数量。 getline用来读过这一行。 通常,这将用于初始化玩家数量变量。

std::ifstream infile;
infile.open("qb.dat");
std::string nPlayers;
std::string playerName;

getline(infile, nPlayers);
getline(infile, playerName);

for (int player = 0; player < kNumPlayers; ++player)
{
  for (int game = 0; game < kNumGames; ++game)
  {
    std::string dataRow;
    getline(infile, dataRow);
    std::istringstream is(dataRow);
    is >> players[player].completions[game] >>
          players[player].attempts[game] >>
          players[player].yards[game] >>
          players[player].touchdowns[game] >>
          players[player].interceptions[game];
  }
}

究竟什么不能正确运行你的程序?

对于第二个for循环中的一件事, i < kNumGames而不是j < kNumGames

然后你应该至少检查文件是否成功打开:

if( !myIF )
{
    // open failed
    return 1;
}

然后行getline(myIF, temp); 它只会在第一次工作,因为第二次到达该行时,您的阅读位置将在您读取的最后一个数字之后和换行符之前。 这是第二个getline调用将返回一个空字符串,然后你将尝试从玩家名称中读取数字。

你可以通过添加getline(myIF, trash);来快速解决这个问题getline(myIF, trash); 在内部for循环之后。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM