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