《Linux编程》上机作业 ·004【文件I/O操作】

article/2025/9/27 12:11:08

注:前言、目录见 https://blog.csdn.net/qq_44220418/article/details/108428971

友情提醒:仅供参考理解,请勿直接复制粘贴

友情提醒:仅供参考理解,请勿直接复制粘贴

友情提醒:仅供参考理解,请勿直接复制粘贴

文章目录

  • 第一题
  • 第二题
  • 第三题

第一题

模拟Linux的cp命令
编写一个C语言程序,该程序产生的可执行文件名为cpx,其功能类似于cp命令。


当执行cpx A BAB为任意两个文件名)时,会将文件A复制为文件B
cpx后面没有跟文件名做参数,或是没有跟两个文件名,则报错

/** 思路:一边读一边写,模拟复制* */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>#define LEN 10005
#define RD_ONCE 100char error[LEN] = "";
char buf[RD_ONCE] = "";int main(int argc, char *argv[])
{// 如果没有传入的参数少于2个,则报错if (argc < 3){perror("错误:传入的参数个数少于2个");exit(1);}// 测试复制的目标文件是否存在if (access(argv[2], F_OK) != -1){sprintf(error, "错误:目标文件 %s 已存在", argv[2]);perror(error);exit(2);}// 打开文件int fd1 = open(argv[1], O_RDONLY);int fd2 = open(argv[2], O_RDWR | O_CREAT, 0755);if (fd1 == -1){sprintf(error, "错误:源文件 %s 打开失败", argv[1]);perror(error);exit(3);}if (fd2 == -1){sprintf(error, "错误:目标文件 %s 创建失败", argv[2]);perror(error);exit(4);}// 读取文件,同时写入while (read(fd1, buf, sizeof(buf) - 1)){write(fd2, buf, strlen(buf));// 每次操作完成使用memset函数把字符串清空// 避免读取字节数少于字符串容量时报错memset(buf, 0, RD_ONCE);}// 关闭文件close(fd1);close(fd2);return 0;
}

示例截图
在这里插入图片描述

第二题

编写C程序sortx.c,完成将一个无序的数据文件userdata.txt递增(A)或递减(D)排序后输出到指定的磁盘文件中。


如:
\qquad userdata.txt内容为:34 -3 8 -12 6
\qquad 执行sortx D myorder.txt后,myorder.txt文件的内容为:34 8 6 -3 -12

/** 生成输入字符串后,思路同【作业003】第2、3题* */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>#define N 1000      // 假定文件总的输入的整数个数少于1000
#define I_N 10      // 假定文件总的输入的整数长度少于10
#define LEN 500     // 假定文件每个的输入的整数字符串长度少于500假定文件总的输入的整数长度少于10
#define ERR_LEN 500 // 假定文件每个的输入的整数字符串长度少于500char file_str[LEN]; // 文件读取的输入字符串int a[N];           // 存储整数的数组
int cnt = 0;        // 存储输入整数的个数size_t len = 0;     // 切割字符串长度参数
char *part;         // 存储切割部分的字符串char num[N];        // 存储要每次写入的内容字符串char error[ERR_LEN] = "";   // 报错字符串// 比较函数1(用于降序排列)
int cmp1(const void*a, const void*b)
{return *(int*)(b)-*(int*)(a);
}// 比较函数2(用于升序排列)
int cmp2(const void*a, const void*b)
{return *(int*)(a)-*(int*)(b);
}int main(int argc, char *argv[])
{// 参数获取、判断if (argc < 3){perror("错误:参数个数少于2个");exit(1);}// 读取参数文件的数组字符串int fd1 = open("userdata.txt", O_RDONLY);if (fd1 == -1){perror("错误:文件 userdata.txt 打开失败");exit(2);}read(fd1, file_str, sizeof(file_str) - 1);close(fd1);// 用strsep函数切割C式字符串char* buff = file_str;while ((part = strsep(&buff, " ")) != NULL)a[cnt++] = atoi(part);  // 用atoi函数将C式字符串转换为int并存入数组// 根据第一个参数A/D,用qsort函数降序排列if (strcmp(argv[1], "A") == 0)qsort(a, cnt, sizeof(int), cmp2);else if (strcmp(argv[1], "D") == 0)qsort(a, cnt, sizeof(int), cmp1);else{sprintf(error, "错误:排序选项参数 %s 有误", argv[1]);perror(error);exit(3);}// 将数组写入文件int fd = open(argv[2], O_RDWR | O_CREAT | O_TRUNC, 0755);if (fd == -1){sprintf(error, "错误:文件 %s 打开失败", argv[2]);perror(error);exit(2);}for (int i = 0; i < cnt; ++i){int bytes = sprintf(num, "%d ", a[i]);write(fd, num, bytes);}write(fd, "\n", strlen("\n"));close(fd);return 0;
}

示例截图
在这里插入图片描述

第三题

编写C程序listdir.c,执行listdir sub1完成将当前目录下子目录如sub1中的所有文件名列出(列表字段为:权限码 文件名 长度)

/** 思路同【作业003】的第4题* 不过当时写的思路2直接切换工作目录并没有与考虑到目录不存在不会产生错误,现在已纠正*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>#define LEN 1000  // 假定路径字符串长度少于1000char path[LEN] = "";
char acc[11];  // 全局变量(堆区)存储函数 getAccess 要返回的字符串
const char acc_init[11] = "----------";   // 每次用acc_init初始化accchar error[LEN] = "";   // 错误字符串// 获取文件类型对应字符
char getType(__mode_t mode)
{if (S_ISDIR(mode)) return 'd';if (S_ISCHR(mode)) return 'c';if (S_ISBLK(mode)) return 'b';if (S_ISSOCK(mode)) return 's';if (S_ISFIFO(mode)) return 'p';if (S_ISLNK(mode)) return 'l';return '-';
}// 获取文件权限字符串
const char* getAccess(__mode_t mode)
{// 文件类型strcpy(acc, acc_init);acc[0] = getType(mode);// 文件权限// 判断用户权限if (mode & S_IRUSR) acc[1] = 'r';if (mode & S_IWUSR) acc[2] = 'w';if (mode & S_IXUSR) acc[3] = 'x';// 判断组权限if (mode & S_IRGRP) acc[4] = 'r';if (mode & S_IWGRP) acc[5] = 'w';if (mode & S_IXGRP) acc[6] = 'x';// 判断其他用户权限if (mode & S_IROTH) acc[7] = 'r';if (mode & S_IWOTH) acc[8] = 'w';if (mode & S_IXOTH) acc[9] = 'x';return acc;
}int main(int argc, char *argv[])
{// 如果没有传入参数,则默认选择当前目录if (argc < 2)strcpy(path, ".");elsestrcpy(path, argv[1]);// 判断目录是否存在if (access(path, F_OK) == -1){sprintf(error, "错误:目标目录 %s 不存在", path);perror(error);exit(1);}// 切换当前工作目录int res = chdir(path);// 打开指定目录DIR * dir_ptr = opendir(".");struct dirent * dir;if (dir_ptr == NULL){sprintf(error, "错误:目标目录 %s 打开失败", path);perror(error);exit(2);}// 读取每一个目录项,构造stat获取其属性struct stat buf;printf("%-20s%-30s%-30s\n", "access", "filename", "length(Byte)");printf("----------------------------------------------------------------------\n");while ((dir = readdir(dir_ptr)) != NULL){// 构造stat,读取文件属性int res = lstat(dir->d_name, &buf);if (res == -1){sprintf(error, "错误:读取目标文件 %s 的属性失败", dir->d_name);perror(error);exit(3);}printf("%-20s%-30s%-30ld\n", getAccess(buf.st_mode), dir->d_name, buf.st_size);}return 0;
}

示例截图
在这里插入图片描述


http://chatgpt.dhexx.cn/article/X3H1b8xA.shtml

相关文章

CPU比GPU训练神经网络快十几倍,英特尔:别用矩阵运算了

来源丨机器之心 神经网络训练通常是 GPU 大显身手的领域&#xff0c;然而莱斯大学和英特尔等机构对 GPU 的地位发起了挑战。 在深度学习与神经网络领域&#xff0c;研究人员通常离不开 GPU。得益于 GPU 极高内存带宽和较多核心数&#xff0c;研究人员可以更快地获得模型训练的结…

用于基于 CNT 的射频辐射热计开发研究的 CPX-VF 探针台

我们会不时强调我们的低温探针台如何用于有趣的研究。我们最新的应用重点是阿克伦大学领导的工作&#xff0c;并发表在上个月的IEEE 微波理论与技术汇刊上。与来自美国陆军和 Nano-C Inc.&#xff08;马萨诸塞州 Westwood 的纳米结构碳材料及其应用开发商&#xff09;的研究人员…

ProJet 3510 CPX蜡模3D打印机在珠宝行业成功应用

传统的首饰设计是一个细致和增量的过程。传统设计从设计师的构图开始&#xff0c;一旦草图被批准后,就会雕刻成模型&#xff0c;如果蜡模没有足够接近原始草图或未能满足客户的期望&#xff0c;必须重做,这样会浪费大量的时间。使用ProJet 3510 CPX专业蜡成型3 d打印机&#xf…

基于 CNT 的射频辐射热计开发研究的 CPX-VF 低温探针台

有时&#xff0c;我们喜欢强调我们的低温探针台如何用于有趣的研究。我们最新的应用重点是由阿克伦大学领导并发表在上个月的IEEE Transactions on Microwave Theory and Techniques 上的工作。UA 的 ZEN-Lab 的Michael Gasper 和 Ryan Toonen 博士与美国陆军和 Nano-C Inc.&am…

Parker驱动器维修COMPAX控制器维修CPX0200H

COMPAX控制器&#xff1a;由不同的模拟功率控制信号&#xff0c;由MOSFET IC级驱动器GND/PGND&#xff08;功率接地&#xff09;&#xff09;的信号控制&#xff0c;则应分别接地。使用IC的小信号部分的控制IC&#xff0c;SGND信号与功率地之间的连接点。合理的方法是地信号地返…

用于 CPX、CPX-VF 和 CRX-VF 探针台的新手提箱选项

如果您正在寻找一种简单的方法来将样品从手套箱、干燥箱或其他惰性气氛容器转移到高真空、低温探测环境&#xff0c;您可能会感兴趣&#xff1a;一个新的专用手提箱 (PS-SC- CPX) 与可安装在我们的CPX、CPX-VF或CRX-VF探针台上的负载锁定组件 (PS-LL-CPX) 一起使用。 该手提箱具…

GE IC697CPX935 CPU模块PDF帅

IC697CPX935 是 GE 自动化和控制公司制造的具有三个内置串行端口的单槽 PLC CPU。它能够对系统进行实时控制。使用 VMEC.1 格式&#xff0c;IC697CPX935 可以通过安装在机架上的背板与不同的“智能选项”模块进行通信。该设备通过三位运行/停止控制开关或连接到运行适当软件的计…

micropython仿真器_microbit/cpx 的 python模拟器:Device Simulator Express

Device Simulator Express是一个 VSCode 的编程扩展,使用它无需硬件就能对 Circuit Playground Express(CPX)或 BBC micro:bit 仿真和调试python程序,此外还可以通过串口观察设备的输出。Device Simulator Express 和 makecode 中的设备模拟器功能类似,但它是一个 python 程…

Win10强制更新关闭方法

Win10自动更新怎么永久关闭&#xff1f;有效的Win10强制更新关闭方法 之前小编为大家分享过一些Win10彻底关闭Windows Update自动更新的方法&#xff0c;主要是通过一些如设置流量计费或借助一些专门的小工具来实现&#xff0c;但往往会发现&#xff0c;Win10自动更新就像打不死…

Win10强制更新禁不掉的解决方法

现况 2018年8月之后安装或者更新的win10&#xff0c;现在会出现无法禁用windows update的情况&#xff0c;表现为&#xff1a; 在服务里禁用了windows update服务&#xff0c;后续服务仍能正常启动强制更新。设置“登录”和“恢复”选项卡依然无效。在设置里关闭更新选项无效…

iOS 强制更新

废话不多说&#xff0c;直接上代码 (void)getNewVersion {NSURLRequest *request [NSURLRequest requestWithURL:[NSURL URLWithString:"http://itunes.apple.com/cn/lookup?id1036152564"]];NSURLSessionDataTask *task [[NSURLSession sharedSession] dataTaskW…

uniapp APP端在线升级功能实现讲解——强制或可选升级,下载进度显示

文章目录 概要 需求分析 技术实现梳理 1.是否更新判断&#xff1a; 2.升级弹窗的展示 3.根据升级类型限制操作 4.下载APP监听下载进度 5.下载完自动安装 核心API讲解 1.plus.downloader.createDownload(url,options,completedCallback)&#xff08;下载&#xff09; 2.plus.r…

Windows如何一键永远禁止系统更新?

大家好&#xff0c;我是小寻&#xff0c;欢迎关注公众号:工具优选&#xff0c;免费领取优质项目源码和常用工具&#xff0c;还可以加入我的交流群! 一、工具介绍 想必大家也会与小编存在同样的困惑&#xff0c;为啥我电脑上的windows会频繁的强制系统升级&#xff1f;windows…

win10总强制更新?教你永久关闭

win10系统个人觉得还挺好用的&#xff0c;但是有一点非常烦人&#xff0c;就是隔三岔五强制自动更新&#xff01; 相信也是大部分用户最不喜欢的一点。 更新后&#xff0c;系统可能还会出现一些bug&#xff0c;而且每次更新都要等上一段时间。对于每天工作繁忙的用户来说&…

解决Xshell/Xftp强制升级无法进入问题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 文章目录 前言 一、首先创建一个Xshell.txt文件&#xff0c;用notepad打开 二、将以下代码复制入.txt文件 1.实例代码 2.保存文件&#xff0c;重命名 3.以管理员身份运行…

杰理强制升级工具4.0使用和原理解析

用那个有8个挡位的烧录工具&#xff08;4.0工具&#xff09;的话&#xff0c;默认是走USB的&#xff0c;不是走串口&#xff0c;工具的DP接芯片的DP&#xff0c;工具的DM接芯片的DM&#xff0c;工具的5V接芯片的VBAT&#xff08;要保证能控制芯片供电通断才能从mask启动&#x…

无视Win11 TPM/英特尔芯片等配置,强制升级Win11

上次我写了一个DEV强制升级的文章&#xff0c;可是DEV版本的Windows11系统很不稳定&#xff0c;软件可能无法正常使用。这篇文以适用于任何电脑。建议看这篇文章哦&#xff01; 1.下载映像 大家可以在网上找.iso映像&#xff0c;也可以点击此处。 在网站上找到[下载 Windows…

Android版本强制更新

目前的项目之中基本上都会存在版本更新的功能&#xff0c;分为强制更新和推荐更新&#xff0c;其实功能点都是一样的&#xff0c;推荐更新只是增加一个按钮让更新的弹框隐藏掉而已&#xff0c;这里仅记录强制更新的功能首先需要跟接口约定&#xff0c;需要判断是否弹出更新弹框…

强制更新客html页面,强制更新

强制更新 1. 什么是强制更新 当某个qp包希望用户快速下载到时&#xff0c;可以使用强制更新。 强制更新是为了解决出了故障或者希望某个版本(业务做活动)的QP 包能快速被更新到而设计的功能&#xff0c;使用起来也相当简单&#xff0c;只需要在发布QP 包的时候&#xff0c;选中…