要求:利用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