[英]Reading space-separated data with spaces data
我正在从文本文件中读取行,其中的数据以类似以下的空格分隔成列:
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...
}
当数据没有空格(例如“美国”)时,此方法效果很好。 现在发生的事情是,一旦遇到空格,数据就会保存到下一个变量(即“ 2UNITED”将进入country
,“ STATES”将进入capital
,依此类推)。 我要做的是感觉很乱,所以我希望它们是处理数据的更好方法。 这是我现在想做的:
std::getline
阅读整行。 这种方法看起来更像是K&R的练习,并且可能不是C ++的方法。 我应该提到数据全部正确对齐(“列”的宽度都相同)。 我在想必须要有一种方法来正确读取“对齐的”数据(基本上是cout << setw(20) << "Hello" << ...
任何想法都欢迎。 谢谢!
我建议一个更好的方法是:
1.使用std::getline
阅读整行。
2.使用std::substr
和字段宽度提取字段。
3.根据需要修剪字段字符串。
4.处理字段。 5.在步骤1重复,直到读取失败。
如果我知道一个正则表达式, 这是一个明显的例子( 住在这里 ):
#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>
并且只有在使用libc++
,才可以使用std::regex
, std::smatch
, std::regex_match
,但GNU libstdc++
(最高4.8)无法正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.