[英]problem splitting a string
有人可以告诉我这段代码的问题吗? 我正在使用getline
函数读取每一行,并再次使用相同的函数来分割字符串:
定界符。
string line,item;
ifstream myfile("hello.txt");
if(myfile.is_open()) {
string delim =":";
while(!myfile.eof()) {
vector<string> tokens;
getline(myfile,line);
stringstream iss(line);
while(getline(iss,item,delim)) {
tokens.push_back(item);
}
}
myfile.close();
}
错误消息是:
C2780: 'std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &,std::basic_string<_Elem,_Traits,_Alloc> &)' : expects 2 arguments - 3 provided 1> c:\program files\microsoft visual studio 8\vc\include\string(528) : see declaration of 'std::getline'
使用char delim = ':';
而且我还建议使用istringstream
代替stringstream
。 另外,循环是错误的:
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
...
char delim = ':';
while (std::getline(myfile,line))
{
vector<string> tokens;
istringstream iss(line);
while(std::getline(iss,item,delim))
{
tokens.push_back(item);
}
}
myfile.close();
另外,请注意, tokens
将在每行上重置。 如果您打算跨行累积tokens
,请在外部循环之前声明它。
这段代码编译良好:
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <algorithm>
#include <iterator>
#include <vector>
using namespace std;
int main(int argc, char **argv)
{
string line,item;
ifstream myfile("hello.txt");
if(myfile.is_open()) {
char delim =':'; // use char instead of string as Marcelo Cantos said
while(!myfile.eof()) {
vector<string> tokens;
getline(myfile,line);
stringstream iss(line);
while(getline(iss,item,delim)) {
tokens.push_back(item);
}
}
}
myfile.close();
return 0;
}
您读取文件的每一行,直到出现第一个delim为止-而不是完整的行。 参见http://www.cplusplus.com/reference/iostream/istream/getline/ :
提取字符,直到提取(n-1)个字符或找到定界字符为止(如果指定了此参数,则为delim;否则,指定为'\\ n';否则为'\\ n')
我倾向于使用迭代器接口包装std :: getline,以便它与其他基于迭代的算法配合使用。 这是一种简单的方法。
/** Proxy class to help the LineStreamIterator
* consume lines.
*/
class LineString {
std::string buffer;
public:
friend std::istream & operator>>(std::istream &is, LineString &li) {
std::getline(is, li.buffer);
return is;
}
friend std::ostream & operator<<(std::ostream &os, const LineString &li){
os << li.buffer;
return os;
}
operator std::string () const { return buffer; }
};
/** Base class of the LineIterator */
typedef std::istream_iterator<LineString> LineIteratorBase;
/** An input iterator that yields lines from the
* istream it is constructed with.
* @code
* LineIterator it(cin);
* for (; it !=LineIterator(); ++it){
* std::cout << *it << " --- " << std::endl;
* }
* @endcode
*/
class LineIterator : public LineIteratorBase {
public:
LineIterator() : LineIteratorBase()
{}
LineIterator(std::istream & is): LineIteratorBase(is)
{}
/** Implement the dereference so that a string is
* returned
*/
const std::string operator * (){
return (std::string) this->LineIteratorBase::operator *();
}
/** value_type trait */
typedef std::string value_type;
/** pointer type trait */
typedef std::string* pointer;
/** reference type trait */
typedef std::string& reference;
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.