标准I/O编程——利用读写功能实现cope功能

为了避免在其他只提供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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值