0

DOS で DJGPP を使用してバイナリ ファイルを読み取ると、このコードがハングします。これは、fread 呼び出しが行われたときに発生します。呼び出しが削除された場合、プログラムは正常に実行されます。同じコードが Visual C++ 2008 で正常に実行されます。 djgpp で同様の問題が発生した人はいますか? 本当に単純なことを見逃していますか?

char x; 
string Filename = "my.bin" ; 
fp = fopen(Filename.c_str(),"rb"); 

if (fp == NULL)
{
    cout << "File not found" << endl ; 
}

if (fseek (fp, 0, SEEK_END) != 0)
{
    cout <<"End of File can't be seeked"; 
    return -1; 
}

if ( (fileLength = ftell(fp)) == -1)
{
    cout <<"Can't read current position of file"; 
    return -1; 
}

if (fseek (fp, 0, SEEK_SET) != 0)
{
    cout <<"Beginning of File can't be seeked"; 
    return -1; 
} 

if (fread(&x,sizeof(x),1,fp) != sizeof(x))
{
    cout <<"file not read correctly"; 
    return -1; 
}
4

2 に答える 2

3
  • 「fp」が何であるかわかりません。「FILE * fp;」であると想定する必要があります。

  • あなたが実際に < stdio.h > をインクルードしているとは思えません。

  • あなたが実際に < iostream > をインクルードし、'using namespace std;' を宣言しているとは思いません。

  • 呼び出しが成功したかどうかを示すことができる fread() 呼び出しの後に来るものはわかりません。

エラーを再現するために、欠陥のあるコードを絶対的かつ完全な最小値まで実際に削減するプロセスを実行することは、コードの一部に唖然としたときに最初に行うべきことです。

問題は、思っていた場所にさえないことが判明する場合があります (通常は発生します)。

ということで、交換してみます

if (fread(&x,sizeof(x),1,fp) != sizeof(x))
{
    cout <<"file not read correctly"; 
    return -1; 
}

int i;
if ( ( i = fgetc( fp ) ) == EOF )
{
    perror( "File not read correctly" );
    return -1;
}
x = (char) i;
cout << "Success, read '" << x << "'." << endl;

自作の cout メッセージの代わりに「perror()」を使用すると、エラーの原因に関する追加情報が得られます。'fgetc()' を使用すると、ファイルが実際にファイルに含まれていると思われる内容が含まれていること、および問題が 1 バイトに対する fread() のやや珍しい使用によるものではないことが示されます。

その後、報告します。

于 2009-03-23T11:51:48.120 に答える
0

freadは、最初のパラメーターとしてポインターを取ります。1 文字だけ読み取る必要がある場合はchar x;問題ありませんが、代わりに x のアドレスを渡します。

fread(&x,sizeof(x),1,fp) != sizeof(x)

sizeof char は常に 1 であるため (定義により)、次のように書くことができます。

fread(&x,1,1,fp) != 1
于 2009-03-20T17:11:13.883 に答える