C++ 打开文本文件并读取带空格的字符串,然后将两个独立的整数读入结构
我有一个计划,我正在开始,并已击中早期的路障。这个程序打开一个包含篮球信息的.txt文件。txt中的第一个数字是游戏数组的大小,然后下一行是名称,下面是客场和主场得分。程序应将所有信息存储到新创建的struct Gameinfo游戏数组中。 例如.txt文件C++ 打开文本文件并读取带空格的字符串,然后将两个独立的整数读入结构,c++,struct,ifstream,getline,C++,Struct,Ifstream,Getline,我有一个计划,我正在开始,并已击中早期的路障。这个程序打开一个包含篮球信息的.txt文件。txt中的第一个数字是游戏数组的大小,然后下一行是名称,下面是客场和主场得分。程序应将所有信息存储到新创建的struct Gameinfo游戏数组中。 例如.txt文件 3 SD Lancers 33 55 ND Cats 34 67 SD Big Horn 67 68 程序获取大小并正确地动态分配,但无法获取其余大小。我的循环内部一定不正确?顶部的My cout没有为名称[0]提供任何内容。
3
SD Lancers
33 55
ND Cats
34 67
SD Big Horn
67 68
程序获取大小并正确地动态分配,但无法获取其余大小。我的循环内部一定不正确?顶部的My cout没有为名称[0]提供任何内容。名称。我想我没有正确理解getline?任何帮助都将不胜感激!
谢谢
也请忽略间距。我从来没有在这里把它们格式化过
代码:
我认为,如果我可以说,另一种方法可以利用操作符重载和标准容器来创建更安全、更为C++的ISH代码。在我看来,我们期望的格式更清晰。另一件事,你应该注意的是,你的代码有一个内存泄漏游戏是永远不会删除使用向量是第一位避免这种风险
例如:#include <iostream>
#include <string>
#include <sstream>
#include <vector>
struct GameInfo
{
std::string name;
int home;
int away;
friend std::istream &operator>>(std::istream &is, GameInfo &g);
friend std::ostream &operator<<(std::ostream &os, GameInfo &g);
};
std::istream &operator>>(std::istream &is, GameInfo &g) {
std::getline(is, g.name);
is >> g.home;
is >> g.away;
is.ignore();
return is;
}
std::ostream &operator<<(std::ostream &os, GameInfo &g) {
os << "Name: " << g.name << "\n" << g.home << " " << g.away << std::endl;
return os;
}
int main()
{
std::string str = "3\nSD Lancers\n33 55\nND Cats\n34 67\nSD Big Horn\n67 68\n";
std::cout << str;
std::istringstream stream(str); // you could use ifstream instead
size_t size(0);
stream >> size; // not really nescesasry with vectors but still...
stream.ignore();
std::vector<GameInfo> gv;
for (unsigned int i = 0; i<size; ++i){
GameInfo g;
stream >> g;
gv.push_back(g);
}
std::cout << "\n-----------------\n";
for (auto& el : gv)
{
std::cout << el << "\n-----------------\n";
}
return 0;
}
我相信你的问题在这里得到了很好的回答:
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
struct GameInfo
{
std::string name;
int home;
int away;
friend std::istream &operator>>(std::istream &is, GameInfo &g);
friend std::ostream &operator<<(std::ostream &os, GameInfo &g);
};
std::istream &operator>>(std::istream &is, GameInfo &g) {
std::getline(is, g.name);
is >> g.home;
is >> g.away;
is.ignore();
return is;
}
std::ostream &operator<<(std::ostream &os, GameInfo &g) {
os << "Name: " << g.name << "\n" << g.home << " " << g.away << std::endl;
return os;
}
int main()
{
std::string str = "3\nSD Lancers\n33 55\nND Cats\n34 67\nSD Big Horn\n67 68\n";
std::cout << str;
std::istringstream stream(str); // you could use ifstream instead
size_t size(0);
stream >> size; // not really nescesasry with vectors but still...
stream.ignore();
std::vector<GameInfo> gv;
for (unsigned int i = 0; i<size; ++i){
GameInfo g;
stream >> g;
gv.push_back(g);
}
std::cout << "\n-----------------\n";
for (auto& el : gv)
{
std::cout << el << "\n-----------------\n";
}
return 0;
}