繁体   English   中英

分割字符串时出现问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM