使用 类、getline 和 stringstream 进行解析的 C++ 练习
C++ Exercise in Parsing with Classes, getline, and stringstream
我一直在努力弄清楚如何一起使用 getline 和 stringstream 来解析文件。如果有人可以帮助解释,我将不胜感激。极其。
我真的在尝试构建 ReadFile 函数,该函数读取由 "name, salary" 格式文本组成的文件名,其中包含 50 个姓名和薪水。我想把它分成名为:names[] salary[].
的数组
我目前的情况如下,根据提示我认为我的 class 结构没问题,但是有人可以帮助我正确地将文件读入单独的数组吗?谢谢!
class Players {
public:
//Initialize
float salaries[50];
string names[50];
Players(){
for (int i=0; i<50; i++) {
float salaries[i]={-1.0};
string names[i]= {""} ; }
}
void ReadFile(string filename) {
ifstream file;
file.open(filename);
string line;
int index=0;
while (getline(file, line)) {
stringstream ss(line);
getline(ss, names[index], ',');
getline(ss, salaries[index]);
index ++
string names;
float salaries;
ss >> names >> salaries >> ',';
}
}
float MaxSalary() {
}
string MaxSalaryName() {
}
};
此代码不应编译。将来请确保您的代码示例无需修改即可编译,并包含所有#includes。
关于您的 ReadFile
函数的一些事情:
- 您正在重新定义变量
names
和 salaries
。你可能不想要那个。
index ++
应该是 index++;
.
ifstream::open
取C字符串,所以需要传入filename.c_str()
.
- 你的第一个
getline
没问题,但你的第二个试图将字符串直接复制到浮点数中。您需要明确地进行类型转换。一种方法是创建一个临时字符串变量,将其传递给 getline
,然后使用 std::stof
将该字符串转换为浮点数。这需要 C++11。如果你不能使用 C++11,你可以使用 <cstdilib>
. 中的 strtof
- 不确定
ss >> ...
的目的是什么,但您可能不想要它。如果你想打印你的结果,你需要像 cout << names[index] << ": " << salaries[index] << "\n";
这样的东西
关于您的 Players()
构造函数的一些事情:
- 您正在重新定义您的成员变量,因为您在变量名称前面包含了类型。删除类型。
- 默认的字符串构造函数会创建一个空字符串,因此无需使用空字符串对其进行初始化。
- 您可以安全地删除初始化值周围的
{}
。
大多数这些问题都可以通过查看编译器错误然后查找相应的 C++ 文档来发现。也就是说,我知道 C++ 不是最容易入门的语言,它有助于尽早分配指针。坚持下去,你会成功的!
我一直在努力弄清楚如何一起使用 getline 和 stringstream 来解析文件。如果有人可以帮助解释,我将不胜感激。极其。
我真的在尝试构建 ReadFile 函数,该函数读取由 "name, salary" 格式文本组成的文件名,其中包含 50 个姓名和薪水。我想把它分成名为:names[] salary[].
的数组我目前的情况如下,根据提示我认为我的 class 结构没问题,但是有人可以帮助我正确地将文件读入单独的数组吗?谢谢!
class Players {
public:
//Initialize
float salaries[50];
string names[50];
Players(){
for (int i=0; i<50; i++) {
float salaries[i]={-1.0};
string names[i]= {""} ; }
}
void ReadFile(string filename) {
ifstream file;
file.open(filename);
string line;
int index=0;
while (getline(file, line)) {
stringstream ss(line);
getline(ss, names[index], ',');
getline(ss, salaries[index]);
index ++
string names;
float salaries;
ss >> names >> salaries >> ',';
}
}
float MaxSalary() {
}
string MaxSalaryName() {
}
};
此代码不应编译。将来请确保您的代码示例无需修改即可编译,并包含所有#includes。
关于您的 ReadFile
函数的一些事情:
- 您正在重新定义变量
names
和salaries
。你可能不想要那个。 index ++
应该是index++;
.ifstream::open
取C字符串,所以需要传入filename.c_str()
.- 你的第一个
getline
没问题,但你的第二个试图将字符串直接复制到浮点数中。您需要明确地进行类型转换。一种方法是创建一个临时字符串变量,将其传递给getline
,然后使用std::stof
将该字符串转换为浮点数。这需要 C++11。如果你不能使用 C++11,你可以使用<cstdilib>
. 中的 - 不确定
ss >> ...
的目的是什么,但您可能不想要它。如果你想打印你的结果,你需要像cout << names[index] << ": " << salaries[index] << "\n";
这样的东西
strtof
关于您的 Players()
构造函数的一些事情:
- 您正在重新定义您的成员变量,因为您在变量名称前面包含了类型。删除类型。
- 默认的字符串构造函数会创建一个空字符串,因此无需使用空字符串对其进行初始化。
- 您可以安全地删除初始化值周围的
{}
。
大多数这些问题都可以通过查看编译器错误然后查找相应的 C++ 文档来发现。也就是说,我知道 C++ 不是最容易入门的语言,它有助于尽早分配指针。坚持下去,你会成功的!