我正在尝试制作一个基本的 REPL 来解析用户输入的特殊字符。这篇文章展示了如何在空格上进行拆分,但是当我尝试将字符串流存储到字符串向量中时,我遇到了这个编译错误。
repl.cpp: In function ‘int main(int, char**)’:
repl.cpp:52:25: error: range-based ‘for’ expression of type ‘std::__cxx11::basic_istringstream<char>’ has an ‘end’ member but not a ‘begin’
for (string s : iss)
^~~
repl.cpp:52:25: error: ‘std::ios_base::end’ cannot be used as a function
make: *** [repl.o] Error 1
下面是完整的代码:
#include <cstdlib>
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <fstream>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h>
using namespace std;
int main(int argc, char *argv[])
{
size_t pos;
int pipe = 0;
int pid = 0;
vector <size_t> positions;
vector <string> arguements;
do
{
cout << "repl$ ";
getline(cin, cmd);
pos = cmd.find( "|", 0);
while ( pos != string::npos )
{
positions.push_back(pos);
pos = cmd.find( "|", pos+1);
pipe += 1;
pid += 1;
}
istringstream iss(cmd);
while (iss >> cmd)
arguements.push_back(cmd);
for (string s : iss)
cout << s << endl;
} while (cmd != "q");
return EXIT_SUCCESS;
}
您需要使用 astd::istream_iterator<std::string>
来读取连续的字符串。Boost 有一个包装器来创建一个伪容器,表示从istream
;读取的对象序列;例如:
for (const auto& s : boost::range::istream_range<std::string>(iss))
std::cout << s << '\n';
在这种特定情况下,另一种方法是直接复制到输出迭代器:
std::copy(std::istream_iterator<std::string>{iss},
std::istream_iterator<std::string>{},
std::ostream_iterator<std::string>{std::cout, '\n'});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句