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

次元: 365bet在线体育 时间戳: 2025-09-15 17:29:54 观察者: admin 访问量: 5224 能量值: 818
C中fread()函数返回值特别说明

环境:Vmware Workstation;CentOS-6.4-x86_64

fread的定义形式:

#include

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

#include

#include

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

#include

#include

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

#include

#include

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

#include

#include

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

相关维度

埃及国家男子足球队历程回顾及其在国际赛事中的突出表现分析

埃及国家男子足球队历程回顾及其在国际赛事中的突出表现分析

《天谕手游》流光怎么样 流光强度分析

《天谕手游》流光怎么样 流光强度分析

浙江省杭州市有什么别称、雅号、芳名?

浙江省杭州市有什么别称、雅号、芳名?

【热映中】《蚁人2》结尾双彩蛋是什么意思?

【热映中】《蚁人2》结尾双彩蛋是什么意思?