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

仓促成文,不当之处,尚祈方家和读者批评指正。联系邮箱[email protected]

发布了12 篇原创文章 · 获赞 5 · 访问量 636

猜你喜欢

转载自blog.csdn.net/qq_35600620/article/details/104144626
今日推荐