Куча C ++ и функция чтения ifstream - PullRequest
0 голосов
/ 03 ноября 2010

для моего задания я строю кучу, данные для кучи поступают из файла.Одной из функций является получение данных, но у меня возникают проблемы с пониманием функции ifstream read (), и я получаю довольно неприятную ошибку из-за этого вот что у меня есть:

template<class T, class P>
void get_list(vector<T>& v, const char* file_loc, P func) { 
   T data;
   ifstream inFile;

   inFile.open("file_loc");
   if (!inFile) {
      cerr << "Error - unable to open input file\n";
      exit(1);
   }

   inFile.read( &data, sizeof(T));

   while (inFile) {
      inFile.read( &data, sizeof(T));
      insert(v,data,func);
   }

   inFile.close();
}

ошибка IЯ получаю:

prog7.h:53: error: no matching function for call to 
‘std::basic_ifstream<char, std::char_traits<char> >::read(int*, long unsigned int)’
/usr/include/c++/4.3/istream:468: note: candidates are: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT,_Traits>::read(_CharT*, std::streamsize) 
[with _CharT = char,   _Traits = std::char_traits<char>]

любая помощь будет высоко ценится!

Ответы [ 5 ]

4 голосов
/ 03 ноября 2010

istream::read занимает char*.Вам нужно будет разыграть: (char*)&data.

Также в вашем коде есть ошибка.Чтение может завершиться ошибкой даже после прохождения потокового теста.Идиоматическое решение таково:

while (inFile.read( &data, sizeof(T))) {
   insert(v,data,func);
}

В целом ваш код может быть упрощен;Вы можете открыть файл в конструкторе и позволить деструктору закрыть его.Кроме того, меня интересует первое чтение вне цикла;Вы делаете это с намерением пропустить первую запись в файле?

template<class T, class P>
void get_list(vector<T>& v, const char* file_loc, P func) { 
   T data;
   ifstream inFile("file_loc");
   if (!inFile) {
      cerr << "Error - unable to open input file\n";
      exit(1);
   }

   inFile.read( &data, sizeof(T));

   while (inFile.read( &data, sizeof(T))) {
      insert(v,data,func);
   }
}
2 голосов
/ 03 ноября 2010

Прототип для std :: ifstream :: read равен

istream& read ( char* s, streamsize n );

Так что у вас есть

inFile.read( &data, sizeof(T));

должно быть

inFile.read( (char*) &data, sizeof(T));

Однако это предполагает, что вы читаете необработанных байтов из двоичного файла .Если вы анализируете текстовый файл с целыми числами, представленными в десятичных символах ascii, вы можете просто использовать

inFile >> data;
0 голосов
/ 03 ноября 2010

Вы должны преобразовать указатель в char*, что ожидает чтение.Вы должны использовать reinterpret_cast<char*>(&data) в read.Обратите внимание, что это всегда опасно, поскольку это преобразование вообще не проверяется, и вы должны быть уверены, что то, что вы читаете, соответствует типу T.Код не переносим между архитектурами, размерами слов и т. Д.

0 голосов
/ 03 ноября 2010

read() ожидает char* (то есть тип элемента базового потока). Так что вам нужно привести указатель данных к char*:

inFile.read( reinterpret_cast<char*>(&data), sizeof(T));
0 голосов
/ 03 ноября 2010

Вы создали экземпляр шаблона с типом int, но нет перегруженной функции для чтения, которая принимает указатель на int в качестве первого параметра.Вы можете явно привести к char * используя reinterpret_cast.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...