С++; Использование строк getline() не работает с вводом файла

Я могу заставить getline() работать с cin (getline(cin,line)), но когда я открываю поток, он не читает строку из файла. Файл содержит список элементов периодической таблицы.

например:
H
He
O
и т.д....

РЕДАКТИРОВАТЬ:

Однако, когда я пытаюсь вычислить только что прочитанную строку, она не помещается в символ var в строке:
cout ‹‹ "symbol: " ‹‹ symbol ‹‹ endl;

Это ничего мне не дает, но должно вернуть первый элемент (H).

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

using namespace std;

void print(vector <string> x)
{
    cout << "list of elements:" << endl;
    for (int i = 0; i < x.size(); ++i)
    {
        cout << x[i] << endl;
    }
}

int main(int argc, char** argv) 
{
    string symbol;
    vector <string> elementlist;
    ifstream readin;

    readin.open("Elements.txt");
    getline(readin,symbol);
    cout << "symbol: " << symbol << endl;
    while (!readin.good())
    {
        elementlist.push_back(symbol);
        getline(readin,symbol);
    }
    print (elementlist);
    return 0;
}

person Cerealkiller050    schedule 30.08.2012    source источник
comment
Я случайно нажал Enter, прежде чем закончил свой пост. Я прошу прощения.   -  person Cerealkiller050    schedule 30.08.2012
comment
@user1634904 user1634904 ваше условие цикла !readin.good(), которое в конечном итоге становится false, поэтому вы никогда ничего не читаете. Инвертируйте это.   -  person obataku    schedule 30.08.2012
comment
Кроме того, строка не помещается в символ для getline. что там происходит?   -  person Cerealkiller050    schedule 30.08.2012
comment
указать, что это было введено, не сработало. Использование его с cin по какой-то причине работает, просто не пытаясь получить первую строку файла. Хмммммм   -  person Cerealkiller050    schedule 30.08.2012
comment
@ Cerealkiller050, можешь поделиться файлом, который используешь?   -  person obataku    schedule 30.08.2012
comment
Хорошо, вот оно: filedropper.com/elements_1   -  person Cerealkiller050    schedule 30.08.2012


Ответы (2)


Я бы сделал что-то вроде этого:

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

class line {
    std::string data;
public:
    friend std::istream &operator>>(std::istream &is, line &l) {
        std::getline(is, l.data);
        return is;
    }
    operator std::string() const { return data; }    
};

int main() {
    std::ifstream readin("Elements.txt");

    // Initialize vector from data in stream:
    //
    std::vector<std::string> 
        element_list((std::istream_iterator<line>(readin)),
                      std::istream_iterator<line>());

    // write data from vector to cout:
    //
    std::copy(element_list.begin(), element_list.end(),
             std::ostream_iterator<std::string>(std::cout, "\n"));

    return 0;
}                              
person Jerry Coffin    schedule 30.08.2012
comment
Разве вы не хотите, чтобы std::istream_iterator можно было использовать с настраиваемым разделителем? :-( - person obataku; 30.08.2012
comment
@veer: Да, иногда. И с некоторыми усилиями это возможно. По крайней мере, для этого класс line все же проще. - person Jerry Coffin; 30.08.2012

Как я уже говорил в моем комментарии , ваше условие цикла неверно.

while (!readin.good())
{
    elementlist.push_back(symbol);
    getline(readin,symbol);
}

Как оказалось, вы хотели зациклиться, используя условие readin.good(). Поскольку !readin.good() оценивается как false, вы никогда не входите в цикл.

person obataku    schedule 30.08.2012
comment
Как правило, вы также не хотите использовать while (x.good()). Некоторое время назад я опубликовал запись в блоге о том, как это сделать. это может быть полезно. - person Jerry Coffin; 30.08.2012
comment
@JerryCoffin правильно. В примере, который я первоначально использовал, я продемонстрировал while (std::getline(std::cin, line) && std::cin.good()) { ... }. Что-то не так с этим? PS std::getline никогда не закоротит. - person obataku; 30.08.2012
comment
Да, while (std::getline(...)) обычно хороший способ сделать что-то. - person Jerry Coffin; 30.08.2012
comment
@JerryCoffin а, теперь понятно. Я проглядел ios::operator void* :-) - person obataku; 30.08.2012