чтение глобального istream* с ошибкой getline

Я пытаюсь прочитать глобальный istream*, используя следующий код:

/*Global Declaration*/
istream* fp;

/* in main */
ifstream iFile;
if(argc == 2)
  //open file code
  fp = &file;
else
  fp = &cin;
readFile;

/*readFile*/
readFile(){
  string line;
  while(fp.getline(line))
    cout<<line<<endl;
}

Я получаю следующий код ошибки: "запрос члена getline в fp, который имеет неклассовый тип `std::istream*'. Может ли кто-нибудь сказать мне, в чем ошибка, и есть ли лучший способ ее решить? Я попробовал getline(fp, line), но там тоже было больше ошибок.


person user2278604    schedule 03.10.2013    source источник
comment
Кстати, вы ищете std::getline, а не std::istream::getline.   -  person chris    schedule 03.10.2013
comment
. != -> , аналогично std::getline(fp, line) != std::getline(*fp, line).   -  person WhozCraig    schedule 03.10.2013
comment
Я попробовал это и получил следующую ошибку: нет соответствующей функции для вызова `getline(std::istream*&, std::string&) Я предполагаю, что есть проблема с тем, как я объявляю и назначаю указатель файла, но Я не уверен, как еще это сделать, чтобы это работало.   -  person user2278604    schedule 03.10.2013
comment
Кстати, не нужно делать указатель fp. Вы можете просто использовать ссылку как: auto & fp = argc==2? file : cin;. Теперь fp является ссылкой.   -  person Nawaz    schedule 03.10.2013
comment
Разве решение Зака ​​Хауленда не работает?   -  person demonking    schedule 03.10.2013


Ответы (1)


Вы объявляете fp указателем, но пытаетесь использовать его как экземпляр. Ваша функция readfile должна выглядеть так:

void readFile()
{
    string line;
    while(std::getline(*fp, line)) // note the de-referencing of fp
    {
        cout<<line<<endl;
    }
}

(У вас также есть несколько других синтаксических ошибок в вашем коде, которые, как я предполагаю, являются просто опечатками).

person Zac Howland    schedule 03.10.2013
comment
Понимаю. Да, я пытался вытащить только нужные фрагменты из нескольких файлов, так что получилось немного сумбурно, извините за это. Спасибо за помощь. Думаю, мне нужно снова освежить в памяти указатели. - person user2278604; 03.10.2013