getline в C ++ - нужна помощь - PullRequest
       3

getline в C ++ - нужна помощь

0 голосов
/ 14 декабря 2010

Я использую getline для чтения до конца новой строки, но c ++ getline выводит меня до конца,

У меня есть данные TXT-файла как

адрес (вкладка char) 1420 Happy Lane

Когда я делаю

getline (reader, 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);
}

выход

/ дом / ср / УБТ

кошка abc.txt

эй с ++ сводит меня с ума.

/ дом / стер / УБТ

a.out abc.txt

myvector содержит:

эй, с ++

Ответы [ 3 ]

3 голосов
/ 14 декабря 2010

Вставьте фактический код из вашего редактора и дважды проверьте, что в файле данных нет новой строки (или, возможно, других неожиданных непечатных символов).

Это работает, как и ожидалось:

#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
0 голосов
/ 14 декабря 2010

Вы пытаетесь чередовать захват до a \ t и захват до a \ n.Но время, когда вы находите строку комментария '#', отбрасывает ваше чередование.

Безусловно, самый простой и надежный способ справиться с подобными вещами - сначала прочитать каждую строку, а затем повторно проанализироватьлиния.

0 голосов
/ 14 декабря 2010

У меня есть функция 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);
}
...