使用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);
}