【问题标题】:how to ignore/skip white spaces when reading from a textfile using string getline in c++在 C++ 中使用字符串 getline 从文本文件中读取时如何忽略/跳过空格
【发布时间】:2016-08-23 13:54:18
【问题描述】:

您好,我正在尝试开发一个可以从文本文件中读取的程序,例如

Edward Elric : 2000 300 3000 300
Super Trunks : 100 300 4000 900
Saitama Genos:
Goku Black: 12 333 33 

我希望程序开始读取每一行中的分数,但跳过空格,例如每条记录最多有 4 个分数,但是有些记录的分数少于 4 个,由我希望程序读取的空格表示这些跳过空格的记录我希望重复直到下面的文件末尾是我为此部分编写的代码我很困惑我将如何继续这样做

【问题讨论】:

  • ``std::getline(file, line);) 这是什么?另外,如果你想用 getline 跳过空格,你可以说 std::getline(file>>std::ws, line); 这一定是一个重复的问题,我会看看我能不能把它挖出来。
  • @AndyG std::getline(file>>std::ws, line); 不只修剪前导空白吗?我认为它不会消除名称和 :. 之间的空格。
  • @NathanOliver:没错。我想 OP 应该决定是使用像 boost 这样的修剪方法,还是将记录传递到 std::stringstream 并继续 stream >> std::ws 模式。编辑:或者我可能不完全理解“跳过空白”的 OP 要求
  • 你的文件中真的有空行吗?
  • @NathanOliver:对不起,如果我在描述中不清楚,上面给出的代码读取上面的分数,每行最多 4,但是有些行少于 4,并且留空采取 saitama genos和悟空黑例如我希望程序跳过这些空格但是上面的程序用最后读取的分数替换这些空格

标签: c++ string whitespace getline


【解决方案1】:

我认为您可以使用std::getline 获得更大的优势,因为它不仅会获取行,还会读取到您指定的字符。例如冒号(:):

for(std::string line; std::getline(file, line);)
{
    // turn the line into a stream
    std::istringstream f(line);

    std::getline(f, line, ':'); // skip past ':'

    // read all the numbers one at a time
    for(int v; f >> v;)
        std::cout << v << ' ';

    std::cout << '\n';
}

输出:

2000 300 3000 300 

100 300 4000 900 



12 333 33 

【讨论】:

    【解决方案2】:

    我会改变一些关于你的程序的事情

    • 使用std::ws 在读取到std::getline 之间有效地丢弃换行符:

      for(std::string line; std::getline(file&gt;&gt; std::ws, line);)

    • 跟踪您能够读入value 的值的数量:

      std::istringstream f(scores);
      size_t values_read = 0;
      while(f >> values[values_read] && ++values_read < 4)
      {
      }
      for (size_t i = 0; i < values_read; ++i)
          std::cout << values[i] << " ";
      std::cout << std::endl;
      

    Live Demo

    输出:

    2000 300 3000 300
    100 300 4000 900

    12 333 33

    【讨论】:

      【解决方案3】:

      也许使用来自#include &lt;vector&gt; 的很棒的std::vector,如下所示:

      int main()
      {
          string SampleStr = "2000 300 3000 300";
          vector<string> valuesSeperated;
          string temp;
      
          for(int i = 0; i < SampleStr.size(); i++)
          {
              if(SampleStr[i] == ' '|| SampleStr[i] == '\n')
              {
                  valuesSeperated.push_back(temp);
                  temp.clear();
              }
              else
                  temp.push_back(SampleStr[i]);
          }
          return 0;   
      }
      

      【讨论】:

      • 然后将整个内容放入您的 for 循环中。在每个getline() 上执行此操作,您将获得每行的valuesSeperated
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-04
      • 1970-01-01
      相关资源
      最近更新 更多