使用空格数据读取空格分隔的数据

时间:2014-04-09 23:26:48

标签: c++ file text readline

我正在从文本文件中读取行,其中数据按列分隔类似于以下的空格:

UNITED STATES OF AMERICA           WASHINGTON          9629047   291289535
CHINA                              PEKING              9596960   1273111290

我之前使用以下代码处理过类似的数据:

ifstream readThis("somefile.txt", ios::in);
while (readThis >> country >> capital >> area >> population) {
    // some code...
}

当数据没有空格时(例如"美国和#34;),这种方法很好。现在发生的是,一旦遇到空格,数据就会被保存到下一个变量(即" 2UNITED"将转到country," STATES"会去到capital等等。我要做的就是我觉得非常黑客,所以我希望他们能够更好地处理数据。这就是我现在想做的事情:

  • 使用std::getline
  • 阅读整行
  • 逐个字符地划线。
  • 将字符存储在适当的变量中,直到我们连续读取2个空格。
  • 此时忽略任何空格并阅读,直到我们找到一个角色。

这种方法看起来更像是K&amp; R的练习,可能不是C ++的做法。我应该提一下,数据都是正确对齐的(&#34;列&#34;都是相同的宽度)。我认为必须有一种方式来阅读&#34;对齐&#34;数据正确(基本上与cout << setw(20) << "Hello" << ...

相反

欢迎任何想法。谢谢!

2 个答案:

答案 0 :(得分:0)

我建议一个更好的方法是:
1.用std::getline读取整行 2.使用std::substr和字段宽度提取字段 3.根据需要修剪字段字符串 4.处理字段。 5.在步骤1重复,直到读取失败。

答案 1 :(得分:0)

如果我知道一个(live here),是正则表达式的明显案例:

#include <iostream>
#include <sstream>
#include <boost/regex.hpp>

int main() {
    std::istringstream i { "UNITED STATES OF AMERICA  WASHINGTON, DC  2233232  23232323\nPOPULAR REPUBLIC OF CHINA  BEIJING  23232323  23232323\nBRAZIL  BRASILIA  232323233  2323323\n" };
    boost::regex r { R"(^(.*?)\s\s+(.*?)\s\s+(\d+)\s\s+(\d+))", boost::regex::perl };
    std::string line;
    while( std::getline(i, line) ) {
        boost::smatch m;
        if( !boost::regex_match(line, m, r) )
            continue;
        auto country = m[1].str();
        auto capital = m[2].str();
        auto area = m[3].str();
        auto pop = m[3].str();
        std::cout << capital << ", " << country << ";\n";
    }
}

请注意

#include <regex>

并且std::regexstd::smatchstd::regex_match的使用仅在您使用libc++时有用,GNU libstdc++(最多4.8)isn'工作。