使用 类、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 函数的一些事情:

  • 您正在重新定义变量 namessalaries。你可能不想要那个。
  • 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++ 不是最容易入门的语言,它有助于尽早分配指针。坚持下去,你会成功的!