需要解析一串int并获得空白区域

时间:2014-03-20 20:31:06

标签: c++ parsing int whitespace stringstream

我有一个文件填充了整数(一行中的可变数量),由空格分隔。我想解析int,然后是空格,然后是int,然后是空格......直到换行符然后从新行开始直到eof。示例文件看起来像这样:

1 1 324 234 12 123 
2 2 312 403 234 234 123 125 23 34
...

要抓住整数,我可以做这样的事情:

std::ifstream inStream(file.txt);
std::string line;
int myInt = 0;
while(getline(inStream, line)) {
    std::stringstream ss(line);
    while(ss) {
        ss >> myInt;
        //process...
    }
}

我的问题是,是否有一种简单的方法可以从ss获取空白和结束字符?或者我最好的选择是编写我的程序,假设每个索引后面有一个空格,并且在ss结尾处有换行符?像这样的东西:

std::ifstream inStream(file.txt);
std::string line;
int myInt = 0;
while(getline(inStream, line)) {
    std::stringstream ss(line);
    while(ss) {
        ss >> myInt;
        // process...
        // done with myInt
        char mySpace = ' ';
        // now process mySpace
    }
    char myNewLine = '\n';
    // now process myNewLine
}

2 个答案:

答案 0 :(得分:0)

尝试这样的事情:

std::ifstream inStream(file.txt);
std::string line;
int myInt;
while (std::getline(inStream, line))
{
    std::stringstream ss(line);
    ss >> myInt;
    if (ss)
    {
        do
        {
            // process...
            // done with myInt

            ss >> myInt;
            if (!ss) break;

            char mySpace = ' ';
            // now process mySpace
        }
        while (true);
    }

    char myNewLine = '\n';
    // now process myNewLine
}

答案 1 :(得分:0)

如果性能不是最重要的问题,则以下内容将是您输入格式的通用标记器。这是否是一个可行的解决方案当然取决于您实际想要对输入做什么。

#include <fstream>
#include <iostream>
#include <sstream>
#include <string>

static void handle_number_string(std::string& literal) {
  if (!literal.empty()) {
    std::istringstream iss {literal};
    int value;
    if (iss >> value) {
      std::clog << "<" << value << ">";
    } else {
      // TODO: Handle malformed integer literal
    }
    literal.clear();
  }
}

int main(int argc, char** argv) {
  for (int i = 1; i < argc; i++) {
    std::string aux;
    std::ifstream istr {argv[i]};
    std::clog << argv[i] << ": ";
    while (istr.good()) {
      const int next = istr.get();
      switch (next) {
      case ' ':
        handle_number_string(aux);
        std::clog << "<SPC>";
        break;
      case '\n':
        handle_number_string(aux);
        std::clog << "<EOL>";
        break;
      default:
        aux.push_back(next);
      }
    }
    // Handle case that the last line was not terminated with '\n'.
    handle_number_string(aux);
    std::clog << std::endl;
  }
  return 0;
}

附录:我只会这样做,如果我绝对不得不这样做的话。正确处理所有可能性(多个空格,不间断空格,制表符,\r\n,...)将是很多工作。如果你真正想要处理的是逻辑令牌字段分隔符行结束,那么手动解析空格似乎是错误的方法。如果你的程序崩溃只是因为用户已经证明了输入文件中的列(因此使用了可变数量的空格),那就太遗憾了。