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

环境: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:根据传智播客视频学习整理得出。

  • 14
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值