2013-10-10 3 views
0

Я открываю файл в 1 функции и пытаюсь использовать указатель этого в другой функции. Но я не знаю, почему он не работает. Ниже приведен код.Имея проблему управления памятью с файлом

void ReadFile() 
    { 
     float data; 
     int total_rows, pairs; 
     double longitude, latitude; 

     { 
      GsmFingreprintEuc *g; 
      ll.push_front(new GsmFingreprintEuc); 

      if(file_ptr.is_open()) 
       cout<<"Yes!!"<<endl; 
      else 
       cout<<"NO!!"<<endl; 
      file_ptr >> data; 
      total_rows = data; 
      cout<<"Total Rows:"<<total_rows<<endl; 

      for (int i = 0; i < total_rows; i++) 
      { 
       g = ll.front(); 
       file_ptr >> data; 
       pairs = data; 
       for (int j = 0; j < pairs; j++) 
       { 
        int id; 
        double value; 
        file_ptr >> data; 
        id = data; 
        file_ptr >> data; 
        value = data; 
        g->add_map(id, value); 

       } 
       file_ptr >> data; 
       latitude = data; 
       g->set_latitude(latitude); 
       file_ptr >> data; 
       longitude = data; 
       g->set_longitude(longitude); 

      } 

     } 

     cout<<"Size: "<<ll.size()<<endl; 

    } 

    DtFileReaderEuc(string file_path) 
    { 
     cout << "I am in Constructor" << endl; 
     cout << file_path << endl; 
     fstream file_ptr(file_path.c_str(), std::ios_base::in); 
     if (file_ptr.is_open()) { 
      cout << "Yahhy!! file Opend successfully" << endl; 

      float data; 
      file_ptr >> data; 
      double total_rows = data; 
      cout<<"Total Rows:"<<total_rows<<endl; 


      //file_ptr = myfile; 
      ReadFile(); 
      //myfile.close(); 

     } else 
      cout << "Wohoo!! Wrong path" << endl; 

     cout << "Done!!" << endl; 

    } 

}; 

и когда я RUND этот выходной код: «Я в конструкторе /home/umar/Desktop/DataFile/dha_dataset.gfp Yahhy !! файл успешно открытые компанией Всего Ряды: 7257 НЕТ! ! Всего строк: 0 Размер: 1 Done !! "

Заранее спасибо

+0

Это не должно компилироваться! 'file_ptr' (который не является указателем, кстати) локален для' DtFileReaderEuc' и не может использоваться нигде. Вы можете передать его в качестве аргумента в «ReadFile». – BoBTFish

+0

@BoBTFish, но его компиляция. есть ли еще что делать, не передавая его в качестве аргумента? – OOkhan

+0

Хорошо, я даже не могу начать превращать это во что-то, что я могу скомпилировать. Слишком большая часть реального кода отсутствует. Создайте [Short, Self Contained, Correct Example] (http://sscce.org). Кроме того, прочитайте [это] (http://kuhllib.com/2012/01/14/stop-excessive-use-of-stdendl/) и [это] (http://stackoverflow.com/q/1452721/1171191). – BoBTFish

ответ

1
fstream file_ptr(file_path.c_str(), std::ios_base::in); 

Это новый fstream локального переменный конструктора. Вы, вероятно, хотели использовать закрытую переменную с тем же именем.

+0

мм Вы правы. – OOkhan

+0

хотите открыть файл в конструкторе и хотите использовать этот файл_ptr в функции ReadFile(), можете ли вы помочь мне в этом, как это сделать? Спасибо. – OOkhan

+0

@OOkhan Рассмотрите возможность использования элемента 'std :: ifstream file_', затем откройте его в списке инициализации:' MyClass (std :: string const & filename): file_ (filename) {if (! File_) std :: cerr < <"Uh oh! \ N"} '. – BoBTFish

-1

create file_ptr член класса и инициализировать его в ctor, тогда его можно использовать в любом месте в функциях-членах.

Для получения указателя файла вне класса используйте функции getter/setter.

+0

Это не ответ. Это должен быть комментарий.(И на самом деле, я уже сделал тот же комментарий, поэтому, пожалуйста, не добавляйте к шуму). – BoBTFish

0

Возможно, для того, чтобы код компилировался, вы помещали fstream file_ptr, где бы вы его ни находились. ReadFile, но вы забыли удалить локальную копию в DtFileReaderEuc. В этом случае вы используете локальную версию в DtFileReaderEuc и «глобальную» в ReadFile, которая не открывается. Как вам уже сказали, попробуйте пройти file_ptr до ReadFile

+0

ну, я открываю файл в конструкторе, поэтому не могу вернуться. есть еще? – OOkhan

0

file_ptr Объем неясен. Вы объявили и определили file_ptr в DtFileReaderEuc, поэтому вам нужно передать его указатель на внутреннюю функцию ReadFile, в противном случае объявление file_ptr должно быть во внешней области и поместить определение в DtFileReaderEuc.

Смежные вопросы