我有一个文件填充了整数(一行中的可变数量),由空格分隔。我想解析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
}
答案 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
,...)将是很多工作。如果你真正想要处理的是逻辑令牌字段分隔符和行结束,那么手动解析空格似乎是错误的方法。如果你的程序崩溃只是因为用户已经证明了输入文件中的列(因此使用了可变数量的空格),那就太遗憾了。