freadの2番目のパラメータと3番目のパラメータは交換できますか---なぜfreadは0を返しやすいのですか?
2156 ワード
まずfread関数のプロトタイプを見てみましょう:size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
パラメータ
bufferメモリアドレス
size読み込むバイト数、単位はバイト
count何個のsizeを読み込むか
streamはファイルストリームです
戻り値
実際に読み出す要素の数.戻り値がcountと異なる場合、ファイルの最後にエラーが発生する可能性があります.ferrorとfeofからエラー情報を取得するか、ファイルの末尾に到達か否かを検出する.
簡単にsize*count=count*sizeと理解できますが、ファイルの長さがsize(例えば10000)で割り切れない場合は問題があります.実際にはよくこのようにして、先に料理を出します.
49750 1 1 1 1 0 40000 error
料理を続ける:
49750 10000 10000 10000 10000 9750 0 49750 ok
もとは、見ましたか、freadは読み取ったcountの数を返して、ファイルの末尾が不足する時、くれぐれも注意してください.同じように、皆さんが暇なら、fwriteを検討してもいいですが、私は余計なことは言いません.なぜ2番目のパラメータと3番目のパラメータが交換できないのか、freadは常に0を返す問題が分かったでしょう.おめでとう
パラメータ
bufferメモリアドレス
size読み込むバイト数、単位はバイト
count何個のsizeを読み込むか
streamはファイルストリームです
戻り値
実際に読み出す要素の数.戻り値がcountと異なる場合、ファイルの最後にエラーが発生する可能性があります.ferrorとfeofからエラー情報を取得するか、ファイルの末尾に到達か否かを検出する.
簡単にsize*count=count*sizeと理解できますが、ファイルの長さがsize(例えば10000)で割り切れない場合は問題があります.実際にはよくこのようにして、先に料理を出します.
#include <iostream>
using namespace std;
int main()
{
FILE *fp = fopen("haha", "rb");
fseek( fp, 0, SEEK_END );
int fileSize = ftell(fp);
fclose(fp);
cout << fileSize << endl << endl;
int x = 0;
fp = fopen("haha", "rb");
char buf[10000] = {0};
int totalSize = 0;
while(1)
{
x = fread(buf, sizeof(buf), 1, fp);
cout << x << endl;
totalSize += x * sizeof(buf) ;
if(x <= 0)
{
break;
}
}
fclose(fp);
cout << endl << totalSize << endl << endl;
if(fileSize != totalSize)
{
printf("error
"); //
}
else
{
printf("ok
");
}
return 0;
}
結果:49750 1 1 1 1 0 40000 error
料理を続ける:
#include <iostream>
using namespace std;
int main()
{
FILE *fp = fopen("haha", "rb");
fseek( fp, 0, SEEK_END );
int fileSize = ftell(fp);
fclose(fp);
cout << fileSize << endl << endl;
int x = 0;
fp = fopen("haha", "rb");
char buf[10000] = {0};
int totalSize = 0;
while(1)
{
x = fread(buf, 1, sizeof(buf), fp);
cout << x << endl;
totalSize += x;
if(x <= 0)
{
break;
}
}
fclose(fp);
cout << endl << totalSize << endl << endl;
if(fileSize != totalSize)
{
printf("error
");
}
else
{
printf("ok
"); //
}
return 0;
}
結果:49750 10000 10000 10000 10000 9750 0 49750 ok
もとは、見ましたか、freadは読み取ったcountの数を返して、ファイルの末尾が不足する時、くれぐれも注意してください.同じように、皆さんが暇なら、fwriteを検討してもいいですが、私は余計なことは言いません.なぜ2番目のパラメータと3番目のパラメータが交換できないのか、freadは常に0を返す問題が分かったでしょう.おめでとう