C语言-文件操作-10

news2024/12/26 23:05:29

题目:

修改下列程序,用命令行界面代替交互式界面

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define BUFSIZE 4096

#define SLEN 81

void append(FILE * source,FILE * dest);

char * s_gets(char * st,int n);

int main(){

    FILE * fa, * fs;

    int files = 0;

    char file_app[SLEN];

    char file_src[SLEN];

    int ch;

    puts("Enter name of destination file: ");

    s_gets(file_app,SLEN); //输入目标文件名

    if((fa = fopen(file_app,"a+")) == NULL){

        fprintf(stderr,"cant't open %s\n",file_app);

        exit(EXIT_FAILURE);

    }

    if(setvbuf(fa,NULL,_IOFBF,BUFSIZE) != 0){

        fputs("Can't create output buffer\n",stderr);

        exit(EXIT_FAILURE);

    }

    puts("Enter name of first source file (empty line to quit): ");

    while(s_gets(file_src,SLEN) && file_src[0] != '\0'){

        if(strcmp(file_src,file_app) == 0) fputs("Can't append file to itself\n",stderr);

        else if((fs = fopen(file_src,"r")) == NULL) fprintf(stderr,"Can't open %s\n",file_src);

        else{

            if(setvbuf(fs,NULL,_IOFBF,BUFSIZE) != 0){

                fputs("Cant's append file to itself\n",stderr);

                continue;

            }

            append(fs,fa);

            if(ferror(fs) != 0) fprintf(stderr,"Error in reading file %s.\n",file_src);

            if(ferror(fa) != 0) fprintf(stderr,"Error in writing file %s.\n",file_app);

            fclose(fs);     //关闭读取文件,继续下一次的读取

            files++;

            printf("File %s appended.\n",file_src);

            puts("Next file (empty line to quit): ");

        }

    }

    printf("Done appending. %d files appended.\n",files);

    rewind(fa);

    printf("%s contents:\n",file_app);

    while((ch = getc(fa)) != EOF) putchar(ch);

    puts("Done displaying.");

    fclose(fa);

    return 0;

}

void append(FILE * source,FILE * dest){

    size_t bytes;

    static char temp[BUFSIZE];

    while(( bytes =  fread(temp,sizeof(char),BUFSIZE,source)) > 0){

        fwrite(temp,sizeof(char),bytes,dest);

    }

}

char * s_gets(char * st,int n){

    char * ret_val;

    char * find;

    ret_val = fgets(st,n,stdin);

    if(ret_val){

        find = strchr(st,'\n');

        if(find) *find = '\0';

        else{

            while(getchar() != '\n')

            continue;

        }

    }

}

源代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFSIZE 4096
#define SLEN 81
void append(FILE * source,FILE * dest);
char * s_gets(char * st,int n);
int main(int argc,char * argv[]){
    FILE * fa, * fs;
    int files = 0;
    int ch;
    if((fa = fopen(argv[1],"a+")) == NULL){
        fprintf(stderr,"cant't open %s\n",argv[1]);
        exit(EXIT_FAILURE);
    }
    if(setvbuf(fa,NULL,_IOFBF,BUFSIZE) != 0){
        fputs("Can't create output buffer\n",stderr);
        exit(EXIT_FAILURE);
    }
    for(int i = 2;i <= argc-1;i++){
            if(strcmp(argv[i],argv[1]) == 0) fputs("Can't append file to itself\n",stderr);
            else if((fs = fopen(argv[i],"r")) == NULL) fprintf(stderr,"Can't open %s\n",argv[i]);
            else{
                if(setvbuf(fs,NULL,_IOFBF,BUFSIZE) != 0){
                    fputs("Cant's append file to itself\n",stderr);
                    continue;
                }
                append(fs,fa);
                if(ferror(fs) != 0) fprintf(stderr,"Error in reading file %s.\n",argv[i]);
                if(ferror(fa) != 0) fprintf(stderr,"Error in writing file %s.\n",argv[1]);
                fclose(fs);     //关闭读取文件,继续下一次的读取
                files++;
                printf("File %s appended.\n",argv[i]);
            }       
    }
    printf("Done appending. %d files appended.\n",files);
    rewind(fa);
    printf("%s contents:\n",argv[1]);
    while((ch = getc(fa)) != EOF) putchar(ch);
    puts("\nDone displaying.");
    fclose(fa);
    return 0;
}
void append(FILE * source,FILE * dest){
    size_t bytes;
    static char temp[BUFSIZE];
    while(( bytes =  fread(temp,sizeof(char),BUFSIZE,source)) > 0){
        fwrite(temp,sizeof(char),bytes,dest);
    }
}
char * s_gets(char * st,int n){
    char * ret_val;
    char * find;
    ret_val = fgets(st,n,stdin);
    if(ret_val){
        find = strchr(st,'\n');
        if(find) *find = '\0';
        else{
            while(getchar() != '\n')
            continue;
        }
    }
}

 演示效果:


如果朋友你感觉文章的内容对你有帮助,可以点赞关注文章和专栏以及关注我哈,嘿嘿嘿我会定期更新文章的,谢谢朋友你的支持哈

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/351485.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring3定时任务

简介 Spring 内部有一个 task 是 Spring 自带的一个设定时间自动任务调度&#xff0c;提供了两种方式进行配置&#xff0c;一种是注解的方式&#xff0c;而另外一种就是 XML 配置方式了;注解方式比较简洁&#xff0c;XML 配置方式相对而言有些繁琐&#xff0c;但是应用场景的不…

借助 APISIX Ingress,实现与注册中心的无缝集成

作者张晋涛&#xff0c;API7.ai 云原生技术专家&#xff0c;Apache APISIX PMC 成员&#xff0c;Apache APISIX Ingress Controller 项目维护者。 原文链接 云原生场景下是否需要服务发现 背景 微服务架构是当前最为流行的应用架构之一。 应用被拆分为多个服务组件&#xff…

流批一体架构在快手的实践和思考

摘要&#xff1a;本文整理自快手技术专家、Apache Flink & Apache Calcite Committer 张静&#xff0c;在 FFA 流批一体专场的分享。本篇内容主要分为四个部分&#xff1a;Flink 在快手的发展流批一体在快手的规划第一阶段&#xff08;加强批能力&#xff09;的进展第二阶段…

什么是refresh?Spring refresh 流程

refresh 是 AbstractApplicationContext 中的一个方法&#xff0c;负责初始化 ApplicationContext 容器&#xff0c;容器必须调用 refresh 才能正常工作。它的内部主要会调用 12 个方法&#xff0c;我们把它们称为 refresh 的 12 个步骤&#xff1a;1. prepareRefresh2. obtain…

js将数字转十进制+十六进制(联动el-ui下拉选择框)

十进制与十六进制的整数转化一、十进制转十六进制二、十六进制转十进制三、联动demo一、十进制转十六进制 正则表达式&#xff1a; /^([0-9]||([1-9][0-9]{0,}))$/解析&#xff1a;[0-9]代表个位数&#xff0c;([1-9][0-9]{0,})代表十位及以上 二、十六进制转十进制 正则表达…

问卷数据分析流程

文章目录一、数据合并1. 读取数据2. 数据预览二、数据清洗1. 检验ID是否重复&#xff0c;剔除ID重复项2. 剔除填写时间小于xx分钟的值3.处理 量表题 一直选一个选项的问题三、数据清洗1.1 将问卷单选题的选项code解码&#xff0c;还原成原来的选项1.2 自动获取单选题旧的选项列…

object类的equals和hashCode

Object类–基类 equals方法 Object类中的equals方法,底层是用的是""来实现的, 如果比较的两个数是基本类型,就是在比较其值是否相等; 如果比较的两个数是引用数据类型,那么就是比较其地址是否相等 如果输出语句是System.out.println(ab) 输出的是false ,因为a和b …

AcWing 841. 字符串哈希

题目描述 分析&#xff1a; 字符串 hash 小试牛刀 我们在之前模拟散列时&#xff0c;设置的哈希函数为将一个元素(element, e)输入哈希函数中&#xff0c;输出是一个整数&#xff0c;而那时的 eee 为一个有范围的整数。现在我们考虑更复杂的情形&#xff0c;eee 为一个字符串…

论文笔记NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis

NeRF使用神经网络来表示场景。给定一个场景&#xff0c;输入该场景稀疏的视角图片&#xff0c;NeRF可以合成该场景新的视角的图片。 神经辐射场 神经辐射场&#xff08;neural radiance field&#xff0c;NeRF&#xff09;使用5D的向量值函数表示一个场景。 输入是连续的5D坐…

LeetCode 160. 相交链表

原题链接 难度&#xff1a;easy\color{Green}{easy}easy 题目描述 给你两个单链表的头节点 headAheadAheadA 和 headBheadBheadB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 nullnullnull 。 图示两个链表在节点 c1…

分享12款我常用的开源免费软件

嗨,大家好, 我是徐小夕, 在一个劳动力追求高性价的时代, 我们无时无刻不在追寻更高的工作学习效率, 提高工作舒适度,接下来我就和大家分享一下我之前用过的, 能提高工作效率的开源免费工具.1. 修图&#xff1a;Krita 【开源】image.png地址: https://krita.org/zh/Krita 是一款…

CK-GW06-E03与欧姆龙PLC配置指南

CK-GW06-E03与欧姆龙PLC配置指南CK-GW06-E03是一款支持标准工业EtherCAT协议的网关控制器,方便用户集成到PLC等控制系统中。本控制器提供了网络 POE 供电和直流电源供电两种方式&#xff0c;确保用户在使用无POE供电功能的交换机时可采用外接电源供电&#xff1b;系统还集成了六…

Mac环境下安装MongoDB数据库

一、下载安装 1.1 下载MongoDB 首先&#xff0c;从MongoDB官网下载自己想要使用的版本。 解压缩下载的压缩包重命名为mongodb&#xff0c;将mongodb文件夹复制到/usr/local目录下。 brew tap mongodb/brew brew install mongodb-community4.41.2 配置环境变量 打开.zshrc…

python 获取chrome浏览器的安装目录,即chrome的绝对路径

实现目标需要使用到&#xff08;引包|倒包&#xff09; 2 个 python 模块&#xff0c; import win32api import win32con 引言&#xff08;扉页&#xff09;&#xff1a; 也适用于查找安装在Windows中的应用程序的绝对路径&#xff0c; 譬如&#xff1a;微信&#xff08;WeChat…

APP自动化(1)-Appium中adb常用命令

1.建立Appium与手机模拟器的连接环境 首先确定的是Appium已经打开和手机模拟器已经打开并且appium点击了开始的按钮&#xff0c;然后用cmd进去win的dos系统&#xff0c; 输入tasklist找到这个进程号&#xff0c;每台电脑都是不一样的进程号要按照你自己的来 查询pid地址netst…

Git 构建分布式版本控制系统

版本控制概念Gitlab部署1.版本控制概念 1.1分类 &#xff08;一&#xff09;1 本地版本控制系统&#xff08;传统模式&#xff09; &#xff08;二&#xff09;2 集中化的版本控制系统 CVS、Subversion&#xff08;SVN&#xff09; &#xff08;三&#xff09;3 分布式…

linux程序分析工具

嵌入式调试工具1. nm2. addr2line3. readelf3.1 ELF 文件分类3.2 ELF文件组成3.3使用1. nm nm源于name&#xff0c;是linux下一个文本分析工具&#xff0c;可以罗列指定文件中的符号(函数名、变量&#xff0c;以及符号类型)。 nm命令参数如下&#xff1a; 用法&#xff1a;nm …

深入理解MySQLⅢ -- 锁与InnoDB引擎

文章目录锁概述全局锁表级锁表锁元数据锁意向锁行级锁行锁间隙锁&临键锁InnoDB引擎逻辑存储结构架构内存结构磁盘结构后台线程事务原理redo logundo logMVCC锁 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#x…

Fiddler安装教程、工具图解

目录 一、Fiddler是什么&#xff1f; 二、Fiddler原理 三、Fiddler安装 Fiddler界面介绍 四、常用的工具图解 4.1会话列表 4.2状态栏 4.3内容显示区 一、Fiddler是什么&#xff1f; Fiddler是客户端与服务器之间的HTTP代理&#xff0c;是当前最常用的HTTP协议抓包工具。 …

谈谈 《 JavaScript - DOM编程艺术 》这本书

前言 好吧&#xff0c;现在已经2023年了&#xff0c;对于这本书&#xff08;第二版&#xff09;来说可能有点老了&#xff0c;这本书不是很难理解&#xff0c;但也不是很适合新手读&#xff0c;当然&#xff0c;这本书并不是百宝书 &#x1f4d5; &#xff0c;它更注重于编程的…