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)で割り切れない場合は問題があります.実際にはよくこのようにして、先に料理を出します.
#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を返す問題が分かったでしょう.おめでとう