C中fread()函数返回值特别说明
2015-09-20 08:14
941 查看
环境: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 / (200 * 2) = 0 ............. 119,此时商为0,进入下一步
119 / 200 = 0 ..................... 119,此时商为0,0作为返回值返回,119个字节舍弃
返回值:
0
情况2:
说明:
119 / (10 * 50) = 0 ................... 119,此时商为0,进行下一步
119 / 10 = 11 ........................... 9,此时商为11,作为返回值,另外,返回值最后再补充一个0,9个字节舍弃
返回值:
11
0
情况3:
说明:
119 / (11 * 5) = 2 ..................... 9,此时商为2,返回两个5,进行下一步
9 / 11 = 0 ................................. 9,此时商为0,返回值为0,9个字节舍弃
返回值:
5
5
0
情况4:
说明:
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;
}
返回值:
情况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:根据传智播客视频学习整理得出。
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:根据传智播客视频学习整理得出。
相关文章推荐
- 第92讲:Akka第一个案例动手实战开发环境的搭建
- 贝塞尔曲线练习之弹性的圆
- Spring该讲座
- SQL Server 2008 阻止保存要求重新创建表的更改问题的设置方法
- Android Context MODE的四种模式解析(转)
- 简单的无锁队列环形实现
- JAVA 数据权限设计
- C#笔记
- Eclipse智能提示及快捷键
- 使用Spring MVC统一异常处理实战
- Html程序结构
- Spring实现AOP的4种方式
- Entity Framework学习二:定义数据结构
- java字符串的各种编码转换
- Unique Binary Search Trees 解答
- 黑马程序员------进制转换
- 黑马程序员-----排序算法总结
- LeetCode-Move Zeroes
- 子类继承的父类的protected方法能否被其他类调用深度解析
- android多点触控统一的原理(使用 event.getAction()&MotionEvent.ACTION_MASK的原因)