Linux环境高级编程----IO操作

使用fgetc和fputc,fgets和fputs,fread和fwrite实现文件复制。

fgetc和fputc

fgetc的用法

当fgetc读取失败,返回值是EOF

所以终止条件为ch==EOF

fputc的用法

代码实现

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


int main(int argc, char **argv)
{
   FILE *fps, *fpd;
   int ch;

   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(1)
   {	
	ch = fgetc(fps);
	if (ch == EOF) break;
	fputc(ch, fpd);
   }
   fclose(fps);
   fclose(fpd);
   exit(0);
}

fgets和fputs

fgets的用法

#define SIZE 5
char buf[SIZE];
fgets(buf, SIZE, stream);

// 读取结束有两种情况
// 第一种是读到size - 1:如abcdef
// 第二种是读到'\n':如ab

abcd:需要两次才能读完,因为最后是有一个换行
1-> a b c d '\0'
2-> '\n' '\0'

当fgets读取失败,返回值为NULL:

fputs的用法

代码实现

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

#define BUFSIZE 1024

int main(int argc, char **argv)
{
   FILE *fps, *fpd;
   char buf[BUFSIZE];

   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(fgets(buf, BUFSIZE, fps) != NULL)
	fputs(buf, fpd);

   fclose(fps);
   fclose(fpd);
   exit(0);
}

fread和fwrite

fread的用法

size是每个元素的大小,以字节为单位。nmemb是元素的个数。

fread(buf, size, nmemb, fp);

// 1->数据量足够
// 2->只有5个字节

fread(buf, 1, 10, fp);
1-> 10  -> 10字节
2-> 5   -> 5字节
fread(buf, 10, 1, fp);
1-> 1   -> 10字节
2-> 0   -> ??? (无法确定还剩多少个字节,因此一般每个元素大小为1字节。)

返回值为成功读取的元素个数,如果不成功或读到文件末尾返回0。

fwrite的用法

代码实现

因为最后一次读取,不一定还能读取BUFSIZE个元素,所以每次将成功读取的元素个数存入n中,然后写入到流里面。

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

#define BUFSIZE 1024

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

   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(fps);
   fclose(fpd);
   exit(0);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值