为了避免在其他只提供C库时,无法使用cope功能时的代替操作
相关概念
1、打开文件:
fopen => FILE *open(const char *pathname,const char *mode)
功能:打开文件,返回该文件的流
参数:pathname:带路径的文件名
mode:打开的方式(r r+ w w+ a a+)
返回值:成功->返回流——>文件指针
失败->NULL,并返回错误码
2、读取字符
1>一次读一个字符:
fgetc => int fgetc(FILE *stream)
功能:根据相应的流,读取一个字符。
参数:stream:文件相对应的流
返回值:成功->读取一个字符
失败->EOF,并返回错误码
getc是fgetc的宏定义
其最大区别为:fgetc是函数,getc是宏。这两个由于功能,参数,返回值都是一样的所以在用法上是没有任何区别的。
2>一次读取一行字符:
fgets => char *fgets(char *s, int size, FILE *stream)
功能:根据相应的流读取一行数据,遇到'\n'就停止读取
参数:s:读取出来的数据所要存储的位置,char buf[50]
size:读取数据的最大限度,一次读取一行的最大多少个字节,size-1。
通常使用sizeof()。
stream:流
返回值:成功->返回读取出数据存放的地址
失败->返回NULL
gets:比较类似getchar,但gets是一个不安全的函数。由于其没有指定输入字符的大小,如果输入的字符大小大于定义的数组长度,就会发生内存越界,栈堆溢出。不建议使用!!!
gets =>char *gets(char *s)
功能:在标准输入读取一行数据
参数:s:读取出来的数据存放的位置,char buf[50]
返回值:成功->返回数据地址
失败->返回NULL
3>一次读取一块字符:
fread =>size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream)
功能:从相应的流中读取一块数据
参数:ptr:读取数据所要存放的位置
size:读取一次要读多少个字节
nmemb:运行一次fread执行多少次读操作
stream:流
返回值:成功->返回读道德次数
失败->返回0
3、写入字符
1>一次写一个字符:
fputc => int fputc(int c,FILE *stream)
功能:对相应的流写入一个字符
参数:c:需要写入的字符
stream:流
返回值:成功->返回写入的字符
失败->返回EOF,并返回错误码
putc是fputc的宏定义
其最大区别为fputc是函数,putc是宏定义。这两个由于功能,参数,返回值都是一样的所以在用法上是没有任何区别的。
2>一次写入一行字符
fputs => int fputs(const char *s,FILE *stream)
功能:写入一行数据到对应的流中
参数:s:所需要写入的数据的存储位置,char buf[50]
stream:流
返回值:成功->返回非负数
失败->返回EOF,并返回错误码
puts =>int puts(const char *s)
功能:向标准输出写入一行数据
参数:s:所需要写入的数据的存储位置,char buf[50]
返回值:成功->返回非负数
失败->返回EOF,并返回错误码
3>一次写入一块字符:
fwrite => size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
功能:将数据写入相应的流中
参数:ptr:写入数据所存放的位置
size:写入一次读取多少个字节
nmemb:运行一次fwrite执行多少次写操作
stream:流
返回值:成功->返回写入的次数
失败->返回0;
4、关闭文件
fclose=>int fclose(FILE *stream)
功能:根据相应的流关闭文件
参数:stream:流
返回值:成功->返回0
失败->返回EOF,并返回错误码
相关代码
1、利用fgetc/getc和fputc/putc实现cope功能
#include<stdio.h>
int main(int argc,char *argv[])
{
int ret,c;
if(argc < 3)
{
printf("User:%s <readfile><writefile>\n",argv[0]);
return 0;
}
//打开一个需要复制的文件和一个需要粘贴的文件
FILE *fp_r=fopen(argv[1],"r");
FILE *fp_w=fopen(argv[2],"w");
if(fp_r == NULL||fp_w == NULL)
perror("open");
// 我们要制作文件copy功能:先读后写,然后将读出来的字符,写入到写入流中
while(1)
{
c = fgetc(fp_r);//获取流
//此处fgetc可以改为getc是一样的
if(c == NULL){
preeor("fgetc");
break;
}
ret = fputc(c,fp_w);//将流给到fp_w里,返回获取的字符
//此处fputc可以改为putc是一样的
printf("%s",c);
}
fclose(fp_r);
fclose(fp_w);
return 0;
}
2、利用fgets和fputs实现cope功能
#include<stdio.h>
int main(int argc,char *argv[])
{
char *c;
char ret;
char buf[100];
if(argc < 3){
printf("User:%s <readfile><writefile>\n",argv[0]);
return 0;
}
FILE *fp_r = fopen(argv[1],"r");
FILE *fp_w = fopen(argv[2],"w");
if(fp_r == NULL||fp_w == NULL){
perror("fopen");
return 0;
}
while(1)
{
c = fgets(buf,sizeof(buf)-1,fp_r);
if(c == NULL)
{
perror("fgets");
break;
}
ret = fputs(c,fp_w);//返回非负数
}
fclose(fp_r);
fclose(fp_w);
return 0;
}
3、利用fread和fwrite实现cope功能
#include<stdio.h>
#include<string.h>
int main(int argc,char *argv[])
{
if(argc < 3)
{
printf("User:%s<read_file><write_file>\n",argv[0]);
return 0;
}
FILE *fp_r=fopen(argv[1],"r");
FILE *fp_w=fopen(argv[2],"w");
if(fp_r == NULL || fp_w == NULL);
perror("fopen");
int ret;
char buf[200];
ret = fread(buf,strlen(buf),1,fp_r);
if(ret == 0)
perror("fread");
fwrite(buf,strlen(buf),1,fp_w);
fclose(fp_r);
fclose(fp_w);
return 0;
}