0

私の割り当てでは、ヒープを構築しています。ヒープのデータはファイルから取得されます。関数の 1 つはデータを取得することですが、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));

ただし、これは、バイナリ ファイルから raw バイトを読み取ることを前提としています。10進数のASCII文字で表された整数でテキストファイルを解析している場合は、単に使用できます

inFile >> data;
于 2010-11-02T23:07:36.853 に答える
0

テンプレートを typeintでインスタンス化しましたが、最初のパラメーターとして int へのポインターを取る読み取り用のオーバーロードされた関数はありません。を使用して明示的に char* にキャストできます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 に答える