所以我有这个文件,里面有一些字符串和数字,它来自西班牙足球联赛:
Malaga 1 Levante 1
Malaga 1 Osasuna 1
Osasuna 1 Deportivo 1
Osasuna 1 Madrid 2
Osasuna 1 Levante 1
Osasuna 1 Malaga 1
#
好吧,我要做的是阅读这篇文章,然后用5个不同的变量保存不同的球队(马拉加、莱万特、奥萨苏纳、Deportivo和马德里),我还必须用一个变量保存他们为每支球队打进的球,用另一个变量存储他们为每队打进的球。这是我的代码:
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
const char FI='#';
const int MAX_EQUIPS=20;
struct Equip {
string nomEquip;
int golsf;
int golsc;
int punts;
};
typedef Equip TaulaEquip[MAX_EQUIPS];
struct EquipLliga {
TaulaEquip t;
int n;
};
int cercaEquip(EquipLliga l, string equip) {
// Pre: --
// Post: si equip no hi es a d.t, retorna -1
// altrament retorna posicio de l'equip de nom equip a d.t
int ret=l.n-1;
bool trobat= false;
while (ret>=0 and not trobat) {
if (l.t[ret].nomEquip.compare(equip)==0) trobat= true;
else ret--;
}
return ret;
}
void llegir(ifstream & f) {
string string1;
f.open("Lliga.txt");
char output;
if (f.is_open()) {
while (!f.eof()) {
getline(f,string1);
cout << string1 << endl;
}
}
f.close();
}
void actualitzacioGols(ifstream & f, EquipLliga & e) {
// Pre: f obert
// Post: ha llegit totes les dades de f, incorporat altes i traspasos a al, i els
// ingresos i despeses dels equips per altes, baixes i traspasos a d
char tipus;
string equipA, equipB;
int golsf=0, golsc=0, cerca;
e.n=0;
f >> tipus;
while (tipus!=FI) { // per cada equip
cerca=cercaEquip(e,equipA);
if (cerca=-1)
{
e[n].e.nomEquip=equipA;
e[n].e.golsf=l[n].e.golsf+golsA;
e[n].e.golsf=l[n].e.golsf+golsB;
}
else
{
e[cerca].e.golsf=l[cerca].e.golsf+golsA;
e[cerca].e.golsc=l[cerca].e.golsc+golsB;
}
lliga.n++;
cerca=cercaEquip(e,equipB);
if (cerca=-1)
{
e[n].e.nomEquip=equipB;
e[n].e.golsf=l[n].e.golsf+golsA;
e[n].e.golsf=l[n].e.golsf+golsB;
}
else
{
e[cerca].e.golsf=l[cerca].e.golsf+golsA;
e[cerca].e.golsc=l[cerca].e.golsc+golsB;
}
}
int main() {
}
我对函数"void actualtzacioGols(ifstream&f,EquipLliga&e)"有问题。我不知道如何对其进行编码,使其读取到第一个空格,然后将其保存到第一个团队变量"equipA",然后将第一个数字保存到第一目标变量"golsf",其他两个也是如此。
有什么想法或使用完整的技巧来解决这个问题吗?我对C++有点陌生。
我建议你看看这篇文章,解释如何使用delim 拆分字符串
在您的情况下,您可能需要使用空格来拆分字符串。由于您有一个固定的格式,如果您确信您的文件始终具有相同的格式,那么您可以通过将向量的元素作为数组访问,并使用硬编码索引来检索您想要的信息(团队和目标)。
我会使用Find和Substr。
您可以找到第一个空格,然后获取从0到该空格的子字符串。然后得到空格后的数字+1,然后用剩下的字符串创建一个新字符串,并对另一个名称执行相同的操作。
以下是您的问题的完整解决方案。希望它能有所帮助!
#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <algorithm>
using namespace std;
#define WIDTH 10
int main()
{
string team1, team2;
int team1goals, team2goals;
// Data structure for storing Team name and scores
map<string, pair<int, int>> scores;
while (cin >> team1 >> team1goals >> team2 >> team2goals ) {
scores[team1].first += team1goals;
scores[team2].second += team1goals;
scores[team2].first += team2goals;
scores[team1].second += team2goals;
}
cout << endl << setw (WIDTH) << "Team Name" << setw(WIDTH) << "given" << setw(WIDTH) << "received";
for_each( begin(scores), end(scores), [&]( pair<string, pair<int,int>> i ) {
cout << endl << setw(WIDTH) << i.first << setw(WIDTH) << i.second.first << setw(WIDTH) << i.second.first;
});
return 0;
}
这是的结果
/*
input file: inputFile.txt
-------------------------------
Malaga 1 Levante 1
Malaga 1 Osasuna 1
Osasuna 1 Deportivo 1
Osasuna 1 Madrid 2
Osasuna 1 Levante 1
Osasuna 1 Malaga 1
-------------------------------
runs as:
yourexename < inputFile.txt
-------------------------------
output:
Team Name given received
Deportivo 1 1
Levante 2 2
Madrid 2 2
Malaga 3 3
Osasuna 5 5
*/