0

对于我的任务,我正在构建一个堆,堆的数据来自一个文件。其中一个功能是获取数据,但我无法理解 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();
}

我收到的错误是:

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>]

任何帮助将非常感激!

4

5 回答 5

4

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);
   }
}
于 2010-11-02T23:07:36.797 回答
2

std::ifstream::read的原型是

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

所以你在哪里

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

应该

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

但是,这假定您正在从二进制文件中读取原始字节。如果您正在解析一个以十进制 ascii 字符表示的整数的文本文件,您可以使用

inFile >> data;
于 2010-11-02T23:07:36.853 回答
0

您使用 type 实例化了模板int,但是没有用于 read 的重载函数将指向 int 的指针作为它的第一个参数。您可以使用reinterpret_cast.

于 2010-11-02T23:08:48.683 回答
0

read()需要一个char*(即底层流的元素类型)。因此,您需要将数据指针转换为char*

inFile.read( reinterpret_cast<char*>(&data), sizeof(T));
于 2010-11-02T23:08:58.677 回答
0

您必须将指针转换为char*读取所期望的值。您必须reinterpret_cast<char*>(&data)read. 请注意,这总是很危险的,因为根本不会检查此转换,并且您必须真正确定您正在阅读的内容符合T类型。代码在架构、字长等之间不可移植。

于 2010-11-02T23:10:17.370 回答