0

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

我有 txt 文件数据为

地址(tab char)1420欢乐巷

当我做

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

我想要完整的《1420欢乐巷》,如何获得?

谢谢。

#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);
}

输出

/home/sr/utl

猫 abc.txt

嘿 C++ 让我发疯。

/home/sr/utl

a.out abc.txt

myvector 包含:

嘿 c++

4

3 回答 3

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
于 2010-12-14T01:57:40.323 回答
0

您正试图在抓住直到 \t 和抓住直到 \n 之间交替。但是,您发现“#”注释行的时间会打乱您的交替。

到目前为止,处理这类事情最简单、最可靠的方法是先读取每一行,然后重新解析该行。

于 2010-12-14T06:42:29.707 回答
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);
}
于 2010-12-14T01:50:40.217 回答