我正在从文本文件中读取行,其中数据按列分隔类似于以下的空格:
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
。这种方法看起来更像是K&amp; R的练习,可能不是C ++的做法。我应该提一下,数据都是正确对齐的(&#34;列&#34;都是相同的宽度)。我认为必须有一种方式来阅读&#34;对齐&#34;数据正确(基本上与cout << setw(20) << "Hello" << ...
欢迎任何想法。谢谢!
答案 0 :(得分:0)
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::regex
,std::smatch
,std::regex_match
的使用仅在您使用libc++
时有用,GNU libstdc++
(最多4.8)isn'工作。