【问题标题】:C++ Exercise in Parsing with Classes, getline, and stringstream使用类、getline 和 stringstream 进行解析的 C++ 练习
【发布时间】:2017-04-11 00:59:21
【问题描述】:

我一直在努力弄清楚如何同时使用 getline 和 stringstream 来解析文件。如果有人可以帮助解释,我将非常感激。极其。

我真的在尝试构建函数 ReadFile,它是一个读取包含 50 个姓名和薪水的“姓名、薪水”格式文本的文件名的函数。我想把它分成名为:names[]salary[]的数组。

到目前为止我的内容如下,根据提示,我认为我的类结构没问题,但是有人可以帮助我正确地将文件读入单独的数组吗?谢谢!

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() {

    }
};

【问题讨论】:

  • 请删除提示并将您的问题重新集中在您遇到问题的代码示例中的特定部分。
  • 没问题!完毕。抱歉,虽然提示可能有助于消除混乱。

标签: c++ parsing getline stringstream


【解决方案1】:

此代码不应编译。将来请确保您的代码示例无需修改即可编译,并包含您所有的#includes。

关于你的ReadFile 函数的一些事情:

  • 您正在重新定义变量namessalaries。你可能不希望这样。
  • index ++ 应该是 index++;
  • ifstream::open 接受 C 字符串,所以需要传入 filename.c_str()
  • 您的第一个getline 很好,但您的第二个尝试将字符串直接复制到浮点数中。您需要显式地进行类型转换。一种方法是创建一个临时字符串变量,将其传递给getline,然后使用std::stof 将该字符串转换为浮点数。这需要 C++11。如果你不能使用 C++11,你可以使用 strtof from &lt;cstdilib&gt;
  • 不确定ss &gt;&gt; ... 的目的是什么,但您可能不想要它。如果你想打印你的结果,你想要像cout &lt;&lt; names[index] &lt;&lt; ": " &lt;&lt; salaries[index] &lt;&lt; "\n";这样的东西

关于Players() 构造函数的一些事情:

  • 您正在重新定义您的成员变量,因为您在变量名前面包含了类型。删除类型。
  • 默认的字符串构造函数会创建一个空字符串,所以不需要用空字符串初始化。
  • 您可以放心地将{} 放在初始化值周围。

大多数问题都可以通过查看编译器错误然后查找相应的 C++ 文档来发现。也就是说,我知道 C++ 并不是最容易上手的语言,它有助于尽早分配指针。坚持下去,你会得到它!

【讨论】:

  • 非常感谢您提供这些!我已经全部实现了。我不想打印出名称[index] 或salary[index],而是将文件中的值正确存储在这些数组中。一位导师告诉我 ss >> 名称 >> 薪水是一个正确的结构,但我真的不明白它在做什么。我只想将 filname 文件解析为这两个数组。
  • 您已经使用getline 函数将值读入数组。您可以通过打印出变量的值并确保它们与预期值匹配来进行检查。
  • 好的。我试图让它打印出来,但我发现我不太明白的错误。 prog.cpp:在成员函数'void Players::ReadFile(std::__cxx11::string)'中:prog.cpp:32:40:错误:没有匹配函数调用'getline(std::stringstream&,float&) ' getline(ss, 工资[索引]);
  • 啊,我想我明白了。我会继续调整它。
  • 如果我的回答有助于解决您的问题,请点击复选标记将其标记为已接受。
猜你喜欢
  • 2013-04-28
  • 2017-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
  • 1970-01-01
  • 2013-06-30
  • 2021-04-19
相关资源
最近更新 更多