1

さまざまなファイルからunsignedchar*型のバッファにデータを常に読み取ろうとしています。ただし、次のファイルを読み込む前にバッファをNULLに設定できないようです。

関連するコードは次のとおりです。

#include <stdio.h>
#include <fstream>


int
 main (int argc, char** argv) { 

     FILE* dataFile = fopen("C:\\File1.txt", "rb");
     unsigned char *buffer = NULL;
     buffer = (unsigned char*)malloc(1000); 
     fread(buffer,1,1000,dataFile);
     fclose(dataFile);

     dataFile = fopen("C:\\File2.txt", "rb");
     buffer = NULL;
     fread(buffer,1,1000,dataFile);
     fclose(dataFile);

     system("pause");
     return 0; 

}

私が遭遇したエラーは、この行の2番目の出現です:fread(buffer、1,1000、dataFile);

私が得るエラーは次のとおりです。

デバッグアサーションに失敗しました!式:(バッファ!= NULL)

これは、基本的に次のfread.cの147行目を示しています。

/* validation */
_VALIDATE_RETURN((buffer != NULL), EINVAL, 0);
if (stream == NULL || num > (SIZE_MAX / elementSize))
{
    if (bufferSize != SIZE_MAX)
    {
        memset(buffer, _BUFFER_FILL_PATTERN, bufferSize);
    }

    _VALIDATE_RETURN((stream != NULL), EINVAL, 0);
    _VALIDATE_RETURN(num <= (SIZE_MAX / elementSize), EINVAL, 0);
}

NULLへのバッファポインタを取得する方法についてGoogleを実行し、さまざまな提案を試しましたが、どれも機能していないようです。誰でもそれをNULLに設定する正しい方法を明確にすることができますか?

4

2 に答える 2

5

間接参照しようとするbuffer = NULLので、言うことはできません。fread間接参照NULLは、C++では確かに完全に違法なものの1つです。事実上、あなたはあなたがから得たものを失っていますmalloc。おそらくあなたはmemsetバッファを探してゼロにしようとしています:

memset(buffer, 0, 1000);

ただし、を呼び出す前にこれを行う必要はありませんfread。とにかくバッファを書き込むので、理由はまったくありfreadません。ゼロにされているかどうかは関係ありません。


ちなみに、あなたはC ++(fstreamヘッダーが与えられている)だと私が思うもので非常にCっぽいコードを書いています。C++にはより適したI/Oオプションがあります。

于 2012-08-22T18:09:41.063 に答える
5

あなたbufferポインタです。

これを行うとき:

buffer = (unsigned char*)malloc(1000); 

メモリにスペースを割り当て、その開始位置をに割り当てますbufferbufferスペースの先頭のアドレスを保持していることを忘れないでください。それだけです。これを行うとき:

buffer = NULL;

あなたはそのアドレスを捨てました。

編集:

動的メモリなしのC++スタイル:

#include <fstream>    
using std:: string;
using std:: ifstream;

void readFromFile(string fname)
{
  char buffer[1000];
  ifstream fin(fname.c_str());
  fin.read(buffer, sizeof(buffer));
  // maybe do things with the data
}

int main ()
{
  readFromFile("File1.txt");
  readFromFile("File2.txt");
  return 0;
}

バッファの内容を消去する必要はありません。呼び出しごとにバッファの割り当てと割り当て解除のコストが高すぎる場合は、次を追加するだけstaticです。

  static char buffer[1000];

毎回上書きされます。

于 2012-08-22T18:11:07.177 に答える