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

来源:互联网 发布:mac专柜价格口红 编辑:程序博客网 时间:2024/06/14 17:49

环境: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 .oCC=gccSRCS=main.cOBJS=$(SRCS:.c=.o)EXEC=mainstart: $(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]$ ./mainrc = 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]$ ./mainrc = 11rc = 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]$ ./mainrc = 5rc = 5rc = 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]$ mainrc = 2rc = 2rc = 2rc = 2rc = 2rc = 1rc = 0
一定要注意理解fread函数的返回值,防止出错。


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

0 0
原创粉丝点击