C语言利用fgetc和fputc函数实现文件的复制

要求:利用fgetc和fputc函数实现文件的复制

分析:使用指定函数实现指定功能。所以这里问题就简单化,我们弄明白fgetc和fputc两个函数如何使用即可。

函数原型函数介绍
int fgetc(FILE *stream) 从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动。
函数成功读取时返回读取的字符,若到文件末尾或者出错时返回EOF
  
int fputc(int char, FILE *stream) 把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动。
函数成功写入数据时,返回写入的字符,出错时返回EOF

这里面的流就是数据的意思,我们需要注意的是,对流进行操作,也就是对文件进行操作时,需要先打开文件,执行完程序后,还需要及时关闭文件,以免发生不可避免的错误。这里还有一个特别的地方,就是对一个文件进行度操作或者写操作的时候,文件指针会自动移位,若是想回到文件头需要我们自己处理。

 

这里引入了一个新的问题,打开和关闭文件,这里我们需要使用到fopen和fclose函数。

fopen函数:

函数原型函数介绍
FILE *fopen(const char *filename, const char *mode) 使用给定的模式 mode 打开 filename 所指向的文件。
filename:指定打开的文件
mode:打开文件的方式
成功打开时返回流指针,出错时返回NULL

mode参数具体介绍:

" r "以只读的方式打开文件,文件必须存在
" r+ "以读写的方式打开文件,文件必须存在
" w "以只写的方式打开文件,若文件存在则文件长度清除。若文件不存在则创建
" w+ "以读写方式打开文件,其他等同“ w ”
" a "以只写方式打开文件,若文件不存在则创建,向文件写入数据时是追加到文件末尾
" a+ "以读写方式打开文件,其他等同“ a ”

fclose函数:

函数原型函数介绍
 int fclose(FILE *stream) 关闭流 stream。刷新所有的缓冲区。

如果流关闭成功返回0,若失败返回EOF

实现代码如下:

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


int main(int argc, const char *argv[])
{
  FILE *fpin, *fpout;
  char ch;

  fpin = fopen(argv[1], "r");        //只读方式打开第一个文件
  fpout = fopen(argv[2], "w");       //只写方式打开第二个文件

  while((ch = fgetc(fpin)) != EOF)   //循环读取第一个文件,直到文件为空
  {
    putc(ch, fpout);
  }

  fclose(fpin);
  fclose(fpout);

  return 0;
}

 

代码测试:

linux@linux:~/Review_Linux$ gcc -c test.c -Wall
linux@linux:~/Review_Linux$ ./a.out file1.txt file2.txt 

下面两图可见,file2.txt成功创建,并且其内容与file1.txt一致,要求功能实现成功。

这里我们是使用fgetc和fputc函数每次读取/写入一个数据来实现文件的复制。

 

我们还可以使用fgets和fputs函数,每次读取/写入一行来实现文件的复制。

函数原型函数介绍
char *fgets(char *str, int n, FILE *stream) 从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。
str:指向一个字符数组的指针,该数组存储了要读取的字符串
n:要读取的最大字符数(包括最后的空字符),通常是使用以 str 传递的数组长度

stream指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流

函数成功读取返回str,若到了文件末尾或是出错时返回NULL
 
int fputs(const char *str, FILE *stream) 把字符串写入到指定的流 stream 中,但不包括空字符。
str:指向一个字符数组的指针,该数组存储着要写入的字符串
stream:指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符串的流。
函数成功写入时返回写入字符个数,失败返回EOF

 

再或者我们还可以使用fread和fwrite函数,每次读取/写入指定长度数据,实现文件复制。

函数原型函数介绍
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) 从给定流 stream 读取数据到 ptr 所指向的数组中。
ptr:指向一个字符数组的指针,该数组存储了要读取的字符串
size:读取元素的大小,按字节为单位
nmemb:读取元素的个数,元素的长度为size字节
stream:指向 FILE 对象的指针,该 FILE 对象指定了一个输入流
函数成功读取返回读取个数,失败则返回EOF
 
 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) 从给定流 stream 读取数据到 ptr 所指向的数组中。
ptr:指向一个字符数组的指针,该数组存储了要写入的字符串
size:写入元素的大小,按字节为单位
nmemb:写入元素的个数,元素的长度为size字节
stream:指向 FILE 对象的指针,该 FILE 对象指定了一个输出流
函数成功写入返回写入个数,失败则返回EOF

 

仓促成文,不当之处,尚祈方家和读者批评指正。联系邮箱1772348223@qq.com

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值