C ++中的getline - 需要帮助

时间:2010-12-14 01:43:57

标签: c++ getline

我正在使用getline来读取换行符的结尾,但是c ++ getline让我的东西直到空间,

我有txt文件数据

地址(tab char)1420 Happy Lane

当我这样做时

getline(读者,ss,'\ t')我在ss字符串中获取地址。 当我做getline(读者,ss,'\ n')我只得到1420。

我想要完整的“1420 Happy Lane”,如何获得它?

感谢。

#include <fstream>
#include <string>
#include <iostream>
#include <vector>
#include <sstream>

using namespace std;
int main( int argc, char *argv[] )
{
        if( argc < 2 )
        {
                cout << "Missing filename as first argument" << "\n";
                exit(2);
        }

        vector<string> myvector;
        string ss;
        int i=0, j=0;

        ifstream reader(argv[1]);

        if (! reader )
        {
                cout << "Error opening input file : " << " " << argv[1] << '\n';
                return -1;
        }

        while( !reader.eof())
        {
                 if ((i+1) % 2 == 0 )
                        getline(reader, ss, '\n');
                 else
                         getline(reader, ss, '\t');
                if (ss[0] == '#')
                {
                        //Skip
                        getline(reader,ss, '\n');i=0;
                        continue;
                }

                i++;
                myvector.push_back(ss);
        }

        reader.close();

        vector<string>::iterator it;
        stringstream stream;
        int vecloc=1;
        string tag;
        string sData;

        cout << "myvector contains: \n";

        for ( it=myvector.begin() ; it < myvector.end(); it++ )
        {
                switch (vecloc)
                {
                case 1: stream << *it;  stream >> tag; vecloc++;break;
                case 2:
                                stream << *it;  stream >> sData;
                                // Do job
                                cout << tag << "   " << sData << "\n";
                                // Reset.
                                vecloc=1;       break;
                default :       break;
                }
                // Clear String stream
        stream.str(""); stream.clear();
        }

        return(0);
}

输出

/家庭/ SR / UTL

  

cat abc.txt

嘿c ++让我疯了。

/家庭/ SR / UTL

  

a.out abc.txt

myvector包含:

嘿c ++

3 个答案:

答案 0 :(得分:3)

粘贴编辑器中的实际代码,并仔细检查数据文件中是否有换行符(或其他意外的非打印字符)。

这符合预期:

#include <iostream>
#include <sstream>

using namespace std;

int main()
{
    stringstream reader("address\t1420 Happy Lane\n");

    string ss;

    getline(reader, ss, '\t');
    cout << "1: " << ss << endl;

    getline(reader, ss, '\n');
    cout << "2: " << ss << endl;
}

输出:

1: address
2: 1420 Happy Lane

答案 1 :(得分:0)

我有一个split()功能,您可以使用它。使用\t作为分隔符:

void split(std::string &string, std::vector<std::string> &tokens, const char &delim) {
    std::string ea;
    std::stringstream stream(string);
    while(getline(stream, ea, delim))
        tokens.push_back(ea);
}

答案 2 :(得分:0)

你试图在抓住直到\ t并且抓住直到\ n之间交替。但是你找到“#”注释行的时间会使你的选择失效。

到目前为止,处理此类问题的最简单,最强大的方法是首先读取每一行,然后重新解析该行。