C中fread()函数返回值特别说明

  • Post author:
  • Post category:其他


环境:Vmware Workstation;CentOS-6.4-x86_64

fread的定义形式:

#include <stdio.h>

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

参数说明:

void *ptr:指向缓冲区保存或读取的数据

size_t size:控制记录的大小,要读取的每个数据项的字节数

size_t nmemb:记录的数量,要读的数据项的个数

FILE *stream:文件的指针

返回值:

返回读取或回写的记录数,数据项的个数

fread是一个函数。从一个文件流中读数据,最多读取count个元素,每个元素size字节,如果调用成功返回实际读取到的元素个数,如果不成功或读到文件末尾返回 0。

图解说明:

文件a.txt,大小为119个字节:

12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789


情况1:

文件大小:119字节

size_t rc = fread(buf, 200, 2, p);

说明:

119 / (200 * 2) = 0 …………. 119,此时商为0,进入下一步

119 / 200 = 0 ………………… 119,此时商为0,0作为返回值返回,119个字节舍弃

返回值:

0


情况2:

文件大小:119字节

size_t rc = fread(buf, 10, 50, p);

说明:

119 / (10 * 50) = 0 ………………. 119,此时商为0,进行下一步

119 / 10 = 11 ……………………… 9,此时商为11,作为返回值,另外,返回值最后再补充一个0,9个字节舍弃

返回值:

11

0


情况3:

文件大小:119字节

size_t rc = fread(buf, 11, 5, p);

说明:

119 / (11 * 5) = 2 ………………… 9,此时商为2,返回两个5,进行下一步

9 / 11 = 0 …………………………… 9,此时商为0,返回值为0,9个字节舍弃

返回值:

5

5

0


情况4:

文件大小:119字节

size_t rc = fread(buf, 10, 2, p);

说明:

119 / (10 * 2) = 5 ………………………………. 19,此时商为5,返回5个2,进行下一步

19 / 10 = 1 ……………………………………….. 9,此时商为1,返回值为1,另外增加一个0为返回值,9个字节舍弃

返回值:

2

2

2

2

2

1

0

所使用的makefile文件:

.SUFFIXES:.c .o

CC=gcc

SRCS=main.c
OBJS=$(SRCS:.c=.o)
EXEC=main

start: $(OBJS)
	$(CC) -o $(EXEC) $(OBJS)
	@echo "-----------------------------OK-----------------------"

.c.o:
	$(CC) -Wall -o $@ -c $<

clean:
	rm -rf $(EXEC) $(OBJS)


情况1:

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main(int argc, char *args[])
{
	// 创建文件指针,以只读的方式打开文件
	FILE *p = fopen("a.txt", "r");
	// 判断打开文件是否成功
	if (p == NULL)
	{
		printf("Message : %s\n", strerror(errno));
		return -1;
	}
	// 定义读取文件的缓冲区
	char buf[1024];
	// 循环读取文件
	while (1)
	{
		// 定义函数返回值
		size_t rc = fread(buf, 200, 2, p);
		// 64位操作系统中size_t数据类型是长整形
		printf("rc = %ld\n", rc);
		// 读取到文件的结束,退出循环
		if (rc <= 0)
			break;
	}
	// 关闭文件
	fclose(p);
	
	return 0;
}

返回值:

[negivup@negivup mycode]$ ./main
rc = 0


情况2:

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main(int argc, char *args[])
{
	// 创建文件指针,以只读的方式打开文件
	FILE *p = fopen("a.txt", "r");
	// 判断打开文件是否成功
	if (p == NULL)
	{
		printf("Message : %s\n", strerror(errno));
		return -1;
	}
	// 定义读取文件的缓冲区
	char buf[1024];
	// 循环读取文件
	while (1)
	{
		// 定义函数返回值
		size_t rc = fread(buf, 10, 50, p);
		// 64位操作系统中size_t数据类型是长整形
		printf("rc = %ld\n", rc);
		// 读取到文件的结束,退出循环
		if (rc <= 0)
			break;
	}
	// 关闭文件
	fclose(p);
	
	return 0;
}

返回值:

[negivup@negivup mycode]$ ./main
rc = 11
rc = 0


情况3:

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main(int argc, char *args[])
{
	// 创建文件指针,以只读的方式打开文件
	FILE *p = fopen("a.txt", "r");
	// 判断打开文件是否成功
	if (p == NULL)
	{
		printf("Message : %s\n", strerror(errno));
		return -1;
	}
	// 定义读取文件的缓冲区
	char buf[1024];
	// 循环读取文件
	while (1)
	{
		// 定义函数返回值
		size_t rc = fread(buf, 11, 5, p);
		// 64位操作系统中size_t数据类型是长整形
		printf("rc = %ld\n", rc);
		// 读取到文件的结束,退出循环
		if (rc <= 0)
			break;
	}
	// 关闭文件
	fclose(p);
	
	return 0;
}

返回值:


[negivup@negivup mycode]$ ./main
rc = 5
rc = 5
rc = 0


情况4:

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main(int argc, char *args[])
{
	// 创建文件指针,以只读的方式打开文件
	FILE *p = fopen("a.txt", "r");
	// 判断打开文件是否成功
	if (p == NULL)
	{
		printf("Message : %s\n", strerror(errno));
		return -1;
	}
	// 定义读取文件的缓冲区
	char buf[1024];
	// 循环读取文件
	while (1)
	{
		// 定义函数返回值
		size_t rc = fread(buf, 10, 2, p);
		// 64位操作系统中size_t数据类型是长整形
		printf("rc = %ld\n", rc);
		// 读取到文件的结束,退出循环
		if (rc <= 0)
			break;
	}
	// 关闭文件
	fclose(p);
	
	return 0;
}

返回值:

[negivup@negivup mycode]$ main
rc = 2
rc = 2
rc = 2
rc = 2
rc = 2
rc = 1
rc = 0

一定要注意理解fread函数的返回值,防止出错。


PS:根据传智播客视频学习整理得出。



版权声明:本文为sinat_25457161原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。