2016-10-16 9 views
-3

Я новичок в C++ и в то время как я работал с потоками я увидел следующий код:ifstream-IStream и вызов функции

#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <vector> 
#include <string> 
using namespace std; 

class Results 
{ 
    public: 

     string const& operator[](int index) const 
     { 
      return m_data[index]; 
     } 
     int size() const 
     { 
      return m_data.size(); 
     } 
     void readnext(istream& str) 
     { 
      string line; 
      getline(str, line); 
      cout << "line :" << line <<endl; 

      stringstream lineStream(line); 
      string cell; 

      m_data.clear(); 
      while(getline(lineStream, cell, ',')) 
      { 
       m_data.push_back(cell); 
       cout << cell<<endl; 
      } 

     } 
    private: 
     vector<string> m_data; 
}; 



istream& operator>>(istream& str, Results & data) 
{ 

    data.readnext(str); 
    return str; 
} 



int main() 
{ 
    ifstream file("filename.txt"); 
    Results r1; 
    while(file >> r1) 
    { 
     cout << "1st element: " << r1[3] << "\n"; 
    } 
} 

Когда вызов data.readnext(str) сделан: 1) какова величина str который передается в качестве аргумента? Когда я распечатываю его и получаю 0x7ffd30f01b10, который является адресом. 2) в функции getline(str, line); задает значение первой строки файла. Я не понимаю почему. Не должен ли это быть getline(file, line); я вообще не понимаю, как это работает, так что любая помощь будет высоко оценен

+0

Правильный инструмент для решения таких проблем - ваш отладчик. Перед тем, как просить о переполнении стека, вы должны пропустить свой код по очереди *. Для получения дополнительной информации, пожалуйста, прочтите [Как отлаживать небольшие программы (Эрик Липперт)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Как минимум, вы должны \ [изменить] ваш вопрос, чтобы включить пример [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve), который воспроизводит вашу проблему, а также замечания, сделанные вами в отладчик. –

+0

Спросите того, кто это написал. –

ответ

1
  1. значением является ссылкой на std::istream суперкласс реализованного std::ifstream file объекта.

  2. No. Нет file объект, видимый в рамках функции readnext(). Код правильный. str - это параметр std::istream &, равный readnext(), и соответствует типу первого параметра std::getline().

+0

«подобъект» может быть лучше –

+0

поэтому str является ссылкой на файл std :: ifstream? –

+0

Если вы посмотрите на то, что объявлено как 'str', как параметр функции' readnext() ', вы должны быть способны ответить на собственный вопрос. –