Linux系统编程6标准IO - fread和fwrite

学习自李慧琴老师


实验1 : fread(buf,size.nmemb,fb) 注意项
实验2 :以 fread().fwrite() 实现 cp 命令


NAME
fread, fwrite - binary stream input/output,二进制流的输入和输出,其实文本流也可以读。

   #include <stdio.h>

/*
从 FILE *stream 读
存到 void *pt
一个对象的大小size
nmemb 个对象
读多少: 读 nmemb 个 size大小, 一个对象size大小,读nmemb 个对象
*/
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

/*
从 const void *ptr 读
写到 FILE *stream
一个对象的大小size
nmemb 个对象
写多少: 写 nmemb 个 size大小, 一个对象size大小,写nmemb 个对象
*/
size_t fwrite(const void *ptr, size_t size, size_t nmemb,
                     FILE *stream);

RETURN VALUE
On success, fread() and fwrite() return the number of items read or written. This number equals the number of bytes transferred only when size is 1. If an error occurs, or the end of the file is reached, the return value is a short item count (or zero).

fread() does not distinguish between end-of-file and error, and callers must use feof(3) and ferror(3) to determine which occurred.

返回值是成功的读写到的对象的个数、如果读写的操作个数小于一个对象 则失败,返回失败(短项计数),如果 到达文件末尾,那么返回0

很多人喜欢用 fread() fwrite(),是因为在进行成块的数据操作的时候,就喜欢用这两个函数,比如 学校的人员管理,假如一个学生的资料占用100个字节,我需读写100个学生的资料,就可以一块一块的读写,很方便。但是这两个函数有一个致命缺陷,就是他们不会做边界的验证,假如我们在读写上述学生信息的时候,读写过程中只要有一个字节出错,会导致整个过程出错。

实验1 : fread(buf,size.nmemb,fb) 注意项
假如 buf 大小是10个字节的char型数组,那么我们有许多中读法,如下,现有如下两种情况

第一种情况:fb文件中的数据量足够

方法1 fread(buf,1.10,fb);//一个对象1个字节,读10个对象
使用 fread(buf,1.10,fb),即一个对象1个字节,读10个对象。读一次
成功即返回10

方法2 fread(buf,10.1,fb) //一个对象10个字节,读1个对象
使用 fread(buf,10.1,fb) ,即一个对象10个字节,读1个对象。读一次
成功即返回1

第二种情况:fb文件中的数据量只有5个字节

情况1 使用 fread(buf,1.10,fb),即一个对象1个字节,读10个对象。读一次
会成功读到5个对象,返回5

情况2 使用 fread(buf,10.1,fb) ,即一个对象10个字节,读1个对象。读一次
文件中不够一个对象,返回0,那么此时文件中剩余多少字节呢??

实验2 :以 fread().fwrite() 实现 cp 命令

#include<stdio.h>
#include<stdlib.h>

#define BUFSIZE 5

int main(int argc,char *argv[])
//int main(int argc,char **argv)
{
	FILE *fps = NULL;
	FILE *fpd = NULL;
	char buf[BUFSIZE];
	int n=0;

	if(argc < 3)
	{
	fprintf(stderr,"Usage:%s <src_file> <dest_file>\n",argv[0]);
	exit(1);
	}

	fps = fopen(argv[1],"r");
	if(fps == NULL)
	{
		perror("fopen()");
		exit(1);
	}

	fpd = fopen(argv[2],"w");
	if(fpd == NULL)
	{
		fclose(fps);
		perror("fopen()");
		exit(1);
	}

	while((n = fread(buf,1,BUFSIZE,fps)) > 0)
		fwrite(buf,1,n,fpd);

fclose(fpd);
fclose(fps);
}

注意 如下代码,

while((n = fread(buf,1,BUFSIZE,fps)) > 0)
	fwrite(buf,1,n,fpd);

一定不能写成

while((n = fread(buf,1,BUFSIZE,fps)) > 0)
		fwrite(buf,1,BUFSIZE,fpd);

因为谁也不知道fread 成功读到了多少个对象,只能先得到读到的对象数,再以得到的对象数为准写到目标流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux老A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值