如何解决为什么我的程序不循环从我的数据文件提取?
我的程序应该从文件中提取数据并将其存储到三个变量中。我已经能够显示第一行数据,但是当我尝试循环它以显示其余行时,什么也没发生。
main.cpp:
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
struct Game {
string opponent;
unsigned goals_scored;
unsigned goals_lost;
};
int main() {
Game one_game;
ifstream game_data;
game_data.open("schedule.csv");
if(!game_data.is_open()){
cout << "The file cannot be opened."<< endl;
return -1;
}
getline(game_data,one_game.opponent,',');
do {
cout << one_game.opponent << endl;
game_data >> one_game.goals_scored;
cout << one_game.goals_scored << endl;
game_data >> one_game.goals_lost;
cout << one_game.goals_lost << endl;
getline(game_data,');
} while(game_data);
game_data.close();
}
一些作业的细节:
第4步:使用>>,ignore和getline的组合来处理一行数据并更新one_game对象的不同数据成员。
最好一次处理一个数据。 例如,专注于将对手的名字添加到one_game.opponent中。使用输出语句来帮助您检查并查看读取是否成功。然后,您可以将CSUSM得分的进球数计入one_game.goals_scored。使用输出语句来帮助您检查并查看是否收集了正确的数据。然后,您可以对one_game.goals_lost做同样的事情。
第5步:确保该程序适用于一行输入数据后,然后进行一次do-while操作以确保您可以循环浏览输入文件中的所有14个游戏。请注意生成的输出,以确保正确使用>>,getline和ignore来处理从一行数据到另一行数据的过渡。如果在每个对手团队的名称前看到一个额外的空白行,则您缺少对ignore方法的调用。 知道循环正常工作后,就可以删除测试输出语句。
第6步:此后,一次进行一项分析。确保关闭ifstream对象并在循环后使用适当的标签显示结果,以使其他人理解您的结果。
这是输入文件(schedule.csv):
NO. 25 FRESNO PACIFIC,3,0
NO. 11 AZUSA PACIFIC,1,2
BIOLA,2
CONCORDIA IRVINE,2,5
HAWAI'I HILO,1
POINT LOMA,1
CAL STATE MONTEREY BAY,3
CAL STATE EAST BAY,0
CAL POLY POMONA,1
HUMBOLDT STATE,3
STANISLAUS STATE,1
CHICO STATE,2
UC SAN DIEGO,2
CAL STATE DOMINGUEZ,2
解决方法
您的问题陈述中确实提到了<div class="hidden-overlays-select">
<ul class="dropdown-list">
<li class="list">Test One</li>
<li class="list">Test Two</li>
<li class="list">Test Three</li>
<li class="list">Test Four</li>
</ul>
<ul class="dropdown-list">
<li class="list">element 1</li>
<li class="list">element 2</li>
<li class="list">element 3</li>
<li class="list">element 4</li>
</ul>
</div>
<div class="selected-items d-flex align-items-center flex-fill">
<ul style="display: flex;">
<li class="select-option" style="margin-right: 1rem;">
Click Me
</li>
</ul>
</div>
方法,但是看来您选择了忽略::)
有关其规格,请参见here。
因此,在示例代码中,在输入文本的每一行上,没有消耗任何东西,分隔两个数字的','逗号字符以及第二个数字之后的换行符。
IO系统将此视为格式错误,因此,在隐式转换为布尔值时,您的ignore
文件句柄将转换为game_data
,并且循环过早退出。
还请注意,阅读完所有内容后,句柄就不会出错。它在文件末尾,但尚未 hit 文件末尾。循环测试代码必须相应地重新安排。
可以添加所需的额外代码,如下所示:
false
然后:
#include <limits>
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
struct Game {
string opponent;
unsigned goals_scored;
unsigned goals_lost;
};
上面的C ++代码按需工作。
int main()
{
Game one_game;
ifstream game_data;
auto tooBig = std::numeric_limits<std::streamsize>::max();
game_data.open("schedule.csv");
if (! game_data.is_open()) {
cout << "The file cannot be opened." << endl;
return EXIT_FAILURE;
}
getline(game_data,one_game.opponent,',');
while (! (game_data.fail() || game_data.eof())) {
//---- cout << "TOP-LOOP" << endl;
cout << "Opponent: " << one_game.opponent << endl;
game_data >> one_game.goals_scored;
game_data.ignore(tooBig,');
cout << "SCORED: " << one_game.goals_scored << endl;
game_data >> one_game.goals_lost;
game_data.ignore(tooBig,'\n');
cout << "LOST: " << one_game.goals_lost << endl << endl;
getline(game_data,');
}
game_data.close();
return EXIT_SUCCESS;
}
替代方法,基于仅使用$ g++ -std=c++14 football00.cpp -o ./football00.x && ./football00.x
Opponent: NO. 25 FRESNO PACIFIC
SCORED: 3
LOST: 0
Opponent: NO. 11 AZUSA PACIFIC
SCORED: 1
LOST: 2
Opponent: BIOLA
SCORED: 0
LOST: 2
Opponent: CONCORDIA IRVINE
SCORED: 2
LOST: 5
Opponent: HAWAI'I HILO
SCORED: 2
LOST: 1
Opponent: POINT LOMA
SCORED: 0
LOST: 1
Opponent: CAL STATE MONTEREY BAY
SCORED: 3
LOST: 3
Opponent: CAL STATE EAST BAY
SCORED: 1
LOST: 0
Opponent: CAL POLY POMONA
SCORED: 1
LOST: 1
Opponent: HUMBOLDT STATE
SCORED: 0
LOST: 3
Opponent: STANISLAUS STATE
SCORED: 3
LOST: 1
Opponent: CHICO STATE
SCORED: 1
LOST: 2
Opponent: UC SAN DIEGO
SCORED: 0
LOST: 2
Opponent: CAL STATE DOMINGUEZ
SCORED: 3
LOST: 2
$
:
SO-q56805847
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。