文件操作编程

news/2024/5/18 22:39:01/文章来源:https://blog.csdn.net/dyjkl/article/details/129897630

这世间,青山灼灼,星光杳杳,秋风渐渐,晚风慢慢

文件操作编程

  • 文件操作编程
    • 1)熟悉Linux的C编程环境
      • 编译优化
    • 2)文件基本操作编程
      • 使用Linux系统调用编写一个完成文件拷贝的C程序。比较拷贝得到的文件与源文件的大小和内容(命令diff,cmp)。8.c
      • 编写C程序完成:创建一个新文件,输入一段数据,然后随机移动指针接着插入一段数据。完成后,查看该文件的大小和内容。怎样获取当前文件的读写指针位置?9.1.c
    • 3)编写拷贝命令,实现文件或目录的复制。
      • 命令功能要能够完成实际应用的要求,实现拷贝命令的各项功能(参考cp命令的功能和用法),如:单参数、双参数等各种参数格式的识别,文件的连接,目录下内容的递归复制,拷贝时磁盘空间的检查等,目标文件重名的提示等。13.c
    • 4)gdb调试工具
  • 学习通作业
    • 1. linux用文件操作系统调用编程打开已有文件 /exsample/exmb.conf,在文件末尾添加“path = /home”。
    • 2 . 用文件操作系统调用编程实现将已有文件/exsample/filea逆序。

文件操作编程

本专栏参考教材是四川轻化工大学陈年老师的linux实验指导手册(含学习通的一些程序笔记)。

1)熟悉Linux的C编程环境

linux的基本c开发环境由以下几部分组成:c程序库glibc,c编译器 gcc或cc,系统头文件glibc_header,库文件、包含文件存放在/usr/lib目录下。

编译连接可用以下的命令进行,假定源程序有两个文件分别是f1.c,f2.c,生成的可执行文件名为hello.exe,缺省目标名称的时候,gcc 编译出来的文件是a.out,用“-o”选项可以指定输出文件名,例:

#gcc -o hello.exe fi.c f2.c

编译优化

参数-O1、-O2、-O3中,随着数字变大,代码的优化程度也越高,可调试性越低

“-o”选项可以指定输出文件名

gcc optimize.c -o optimize      # 进行编译的优化 time ./optimize                 #用于 查看二进制文件的运行时间 gcc –O optimize.c -o optimizetime ./optimize

对比两次执行的输出结果。
在这里插入图片描述
在这里插入图片描述
参考程序optimize.c :

#include <stdio.h>

int main(void)

{

double counter;

double result;

double temp;

for (counter = 0; counter < 2000.0 * 2000.0 * 2000.0 / 20.0 + 2020;

counter += (5 -1) / 4) {

temp = counter / 1979;

result = counter;

}

printf(“Result is %lf\n”, result);

return 0;

}

l 学习用gdb跟踪调试程序的方法。

l 学习makefile的写法和使用(选作)。

2)文件基本操作编程

使用Linux系统调用编写一个完成文件拷贝的C程序。比较拷贝得到的文件与源文件的大小和内容(命令diff,cmp)。8.c

#include <stdio.h> //用于main函数
#include <stdlib.h> #include <sys/types.h> //用于open
#include <sys/stat.h>
#include <fcntl.h>#include <unistd.h> //用于close,read,writeint main(int argc, char *argv[])
{//定义变量int fd_src, fd_obj; // fd_src表示源文件,fd_obj表示目标文件char buf[32] = {0}; //定义一个buf来放读出的字符,[32]:有32字节的空间,{0}:已清零,先用ll a.txt来确定长度,再决定写多少ssize_t ret;        // read的返回值是ssize_t型//打开a.txtfd_src = open("./a.txt", O_RDWR); // O_RDWR 读写方式打开//打开b.txt,没有就创建fd_obj = open("./b.txt", O_CREAT | O_RDWR, 0666); // O_RDWR 读写方式打开, O_CREAT 文件不存在则创建;0666:0表示八进制,666表示权限//读写操作while ((ret = read(fd_src, buf, 32)) != 0){write(fd_obj, buf, ret); //在b.c里写入a.c里面读的内容,ret表示字节数,要配合O_RDWR使用}printf("写好了\n");//关闭close(fd_src);close(fd_obj);
}

在这里插入图片描述
结论:a.txt和b.txt文件内容一样

编写C程序完成:创建一个新文件,输入一段数据,然后随机移动指针接着插入一段数据。完成后,查看该文件的大小和内容。怎样获取当前文件的读写指针位置?9.1.c

//确定当前指针位置
a=lseek(fd,0,SEEK_CUR);
#include <stdio.h> //用于main函数
#include <stdlib.h>#include <sys/types.h> //用于open,<sys/types.h>还用于lseek
#include <sys/stat.h>
#include <fcntl.h>#include <unistd.h> //用于close,read,write,lseekint main(int argc, char *argv[])
{//定义变量int fd;//打开9.txtfd = open("./9.txt", O_CREAT | O_RDWR); // O_RDWR 读写方式打开lseek(fd, 5, SEEK_SET); //把指针移第5个字节write(fd, "world", 5); //在9.txt里写入world,5表示字节数,要配合O_RDWR使用printf("写好了\n");close(fd); //关闭}

3)编写拷贝命令,实现文件或目录的复制。

命令功能要能够完成实际应用的要求,实现拷贝命令的各项功能(参考cp命令的功能和用法),如:单参数、双参数等各种参数格式的识别,文件的连接,目录下内容的递归复制,拷贝时磁盘空间的检查等,目标文件重名的提示等。13.c

设计中要注意:

Ø 结合系统拷贝实际进行认真地分析,确定设计的拷贝命令要实现的各种复制功能、输入形式,错误处理方法;

Ø 在上一步基础上确定出拷贝命令的实际需要,设计命令的基本功能、程序结构和处理流程,学习和选择合理的系统调用;

Ø 做出必要的流程图和程序说明;

Ø 编写各基本功能代码;

Ø 运行调试,验证程序功能,反复修改自己的设计和实现;

Ø 完成拷贝程序设计。

#include <sys/types.h> //用于mkdir,opendir
#include <dirent.h>#include <stdio.h> //用于main函数
#include <stdlib.h>#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>#include <unistd.h> //用于close,read,writeint main(int argc, char *argv[])
{//定义变量int fd_src, fd_obj; // fd_src表示源文件,fd_obj表示目标文件char buf[128] = {0}; //定义一个buf来放文件内容,[32]:有32字节的空间,{0}:已清零char file_path[128] = {0}; //定义一个file_path来放输入的目录char file_name[128] = {0}; //表示要拷贝的文件char file_name2[128] = {0};ssize_t ret;        // read的返回值是ssize_t型DIR *dp;           // opendir返回的是指针struct dirent *re; // readdir返回printf("输入需要拷贝的目录:");scanf("%s",file_path);dp = opendir(file_path); //打开由键盘输入的目录if (dp != NULL)printf("已打开%s的目录\n", file_path);while (1) //用于循环读取目录里面的文件名{re = readdir(dp); //读取目录if (re == NULL){printf("没有内容了\n");break;}else if (re->d_name[0] == '.') // 如果文件名字以 . 开头的则为隐藏文件, 选择直接忽略{continue;}elseprintf("文件:%s\n", re->d_name);}printf("输入需要拷贝的文件及其路径(如j/1.txt):");scanf("%s", file_name);printf("输入需要拷贝到的路径及其文件名(如j/1.txt):");scanf("%s", file_name2);//打开需要拷贝的文件fd_src = open(file_name, O_RDWR); // O_RDWR 读写方式打开//打开被写入的文件,没有就创建fd_obj = open(file_name2, O_CREAT | O_RDWR, 0666); // O_RDWR 读写方式打开, O_CREAT 文件不存在则创建;0666:0表示八进制,666表示权限if(fd_obj<0)printf("新文件没\n");//读写操作while ((ret = read(fd_src, buf, 128)) != 0){write(fd_obj, buf, ret); //在目标里写入源里面读的内容,ret表示字节数,要配合O_RDWR使用}if ((read(fd_obj, buf, 32)>0))printf("写好了\n");//关闭文件close(fd_src);close(fd_obj);closedir(dp); //关闭目录
}

4)gdb调试工具

Linux包含了一个叫gdb的GNU调试程序,能在程序运行时观察程序的内部结构和内存的使用情况。它具有以下一些功能:

·监视程序中变量的值;

·设置断点以使程序在指定的代码行上停止执行;

·一行行的执行代码。

以下是利用gdb进行调试的步骤:

必须使程序在编译时包含调试信息。调试信息里包含程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号。gdb利用这些信息使源代码和机器码相关联。在编译时用-g选项打开调试选项。

gdb基本命令:

命 令命令缩写描 述
file装入欲调试的可执行文件
killk终止正在调试的程序
listl列出产生执行文件的源代码部分
nextn执行一行源代码但不进入函数内部
steps执行一行源代码并进入函数内部
runr执行当前被调试的程序
quitq终止gdb
watch监视一个变量的值而不管它何时被改变
breakb在代码里设置断点,使程序执行到这里时被挂起
displaydisp跟踪查看变量
infoi描述程序状态,info break查看断点
deleted删除断点d num(断点编号)
clear清除指定行号的断点
printp打印内部变量的值
congtinuec继续程序运行
set var设置变量的值
backtracebt查看函数调用信息
framef查看栈帧
startst执行程序至main()函数第一条指令
finish结束函数
shell不离开gdb就执行Linux/UNIX shell 命令

l 学习使用gbd来完成程序跟踪调试的基本方法并记录总结。

5、实验报告

要求认真书写实验报告,报告的内容包括:实验目的、实验内容、实验步骤、实验结果等。

学习通作业

1. linux用文件操作系统调用编程打开已有文件 /exsample/exmb.conf,在文件末尾添加“path = /home”。

#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <assert.h>#include <fcntl.h>int main(){int fd;fd = open("/exsample/exmb.conf", O_WRONLY | O_APPEND); //打开文件write(fd, "path = /home", 12);                          //写数据close(fd);                                  //关闭}

在这里插入图片描述

2 . 用文件操作系统调用编程实现将已有文件/exsample/filea逆序。

#include <stdio.h>#include <fcntl.h>#include <unistd.h>#include <string.h>int main(){char buf[128]; //缓冲区int fd = open("/exsample/filea", O_RDONLY);   //只读int ret = lseek(fd, 0, SEEK_SET);ret = read(fd, buf, sizeof(buf));            //返回读出数据for (int i = strlen(buf) - 1; i >= 0; i--)   //放入,倒序输出   strlen用于计算字符串长度printf("%c", buf[i]);return 0;}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最长****子序列

&#xff08;在研读大佬写的博客后&#xff0c;打算记录下自己学习过程&#xff09; 通过最长上升子序列的拓展了解到&#xff0c;其实这是一个系列的问题主要代表有&#xff1a; 1 最长上升子序列 2 最长不上升子序列 3 最长下降子序列 4 最长不下降子序列 就以最长上升子…

【创作赢红包】python学习——【第七弹】

前言 上一篇文章 python学习——【第六弹】中介绍了 python中的字典操作&#xff0c;这篇文章接着学习python中的可变序列 集合 集合 1&#xff1a; 集合是python语言提供的内置数据结构&#xff0c;具有无序性&#xff08;集合中的元素无法通过索引下标访问&#xff0c;并且…

leetcode 删除链表的倒数第 n 个结点(3.)

题目 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[] 示例 3&…

反转字符串II(力扣刷题)

给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起&#xff0c;每计数至 2k 个字符&#xff0c;就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。 如果剩余字符小于 2k 但大于或等于 k 个&#xff0c;则反转前 k 个字符&…

图片怎么转PDF文件格式?推荐这五个免费无损转换方法!

如何将图片转换为PDF&#xff1f;图片格式文件经常用于每个人的日常生活中&#xff0c;但有时候。我们会将多张图片转换为一份PDF文件进行单个文件传输&#xff0c;但很多人不知道如何将图片转换为PDF格式。 今天&#xff0c;我将与大家分享五种简单免费的无损转换方法&#x…

【CVPR小目标检测】- ISNet红外小目标检测

ISNet&#xff1a;红外小目标探测的形状问题 ——从分割的角度完成小目标红外检测红外图像&#xff1a; 红外小目标使用红外热成像技术&#xff0c;使得红外目标检测能够全天候工作&#xff0c;可视距离远&#xff0c;抗干扰能力强。当像素距离较远时&#xff0c;目标所占比例…

记录如何把postman变成为中文版

首先点击下方这个链接&#xff0c;进入gitee&#xff0c;在里面下载一个插件 Releases hlmd/Postman-cn GitHub 进来是这个样子&#xff1a; 看一下自己的postman是什么版本的&#xff0c;然后在gitee下载对应的APP包 应该怎么查看我的postman版本号呢&#xff1f; ~~看下…

代理模式:JDK动态代理和静态代理回顾

背景&#xff1a;Spring主要有两大思想&#xff1a;IoC、AOP。对于IoC依赖注入不多说了&#xff0c;对于Spring的核心AOP来说&#xff0c;我们需要了解其底层的实现原理&#xff1a;java的动态代理机制。 本篇随笔就是对java的动态机制进行一个回顾。 代理模式的理解 类型&…

三甲医院手术麻醉系统源码, C# .net 桌面软件 C/S版源码

手术麻醉管理系统源码&#xff0c;手麻系统源码&#xff0c;大型医院手术麻醉系统源码 相关技术&#xff1a;C#语言 前端框架&#xff1a;Winform 后端框架&#xff1a;WCF 数 据库&#xff1a;sqlserver VS2019 文末获取联系 手术麻醉系统是面向医生实际工作情况开发的专…

Excel宏(VBA)密码破解

最近在研究一个Excel宏&#xff0c;想查看VBA代码但是有密码&#xff0c;于是想着能不能移除密码。网上查找一番资料后进行了尝试。 一&#xff0c;准备工具 ExcelHex Editor Neo 二&#xff0c;开始实践 首先将.xlsm后缀名的文件改为.zip文件 然后双击zip文件(不用解压文件…

字节跳动CVPR 2023论文精选来啦(内含一批图像生成新研究)

计算机视觉领域三大顶会之一的 CVPR 今年已经开奖啦。 今年的 CVPR 将于六月在加拿大温哥华举办&#xff0c;和往年一样&#xff0c;字节跳动技术团队的同学们收获了不少中选论文&#xff0c;覆盖文本生成图像、语义分割、目标检测、自监督学习等多个领域&#xff0c;其中不少…

AUTOSAR SecOC的CAN FD应用

20多年来&#xff0c;CAN一直是并且仍然是车辆中的主导通信系统。 随着车载功能日益复杂&#xff0c;传统CAN已无法满足对有效数据速率日益增长的需求。 因此&#xff0c;引入了CAN FD—它允许高达64字节的有效载荷以实现2 Mbit/s 和5 Mbit/s的数据速率。为了将这一主要优势用于…

【CocosCreator入门】CocosCreator组件 | Mask(遮罩)组件

Cocos Creator 是一款流行的游戏开发引擎&#xff0c;具有丰富的组件和工具&#xff0c;其中Mask组件可用于创建如圆形、矩形和任意形状的遮罩效果&#xff0c;以限制节点显示的范围。这对于创建具有复杂布局的UI元素非常有用&#xff0c;例如只显示图片的一部分或控制文本显示…

C++相关面试题总结一——内存、关键字、STL、指针、排序、Lambda

面试题总结 基础 C是在C语言的基础上开发的一种面向对象编程语言&#xff0c;应用广泛。C支持多种编程范式&#xff1a;面向对象编程、泛型编程和过程化编程。其编程领域众广&#xff0c;常用于系统开发&#xff0c;引擎开发等应用领域&#xff0c;是最受广大程序员受用的最强…

JavaSE——方法的使用

目录 一、方法的概念及使用 1、什么是方法(method) 2、方法定义 3、方法调用的执行过程 4、实参和形参的关系 二、方法重载 1、为什么需要方法重载 2、方法重载概念 3、方法签名 三、递归 1、递归的概念 2、递归执行过程分析 3、递归练习 一、方法的概念及使用 1、…

【进阶C语言】内存函数(详解)

前言 上一期讲的函数都是和字符串相关的&#xff0c;但是我们在操作数据的时候&#xff0c;不仅仅是操作字符串的数据&#xff0c;还得需要内存函数的应用 内存函数的应用1. memcpy1.1 memcpy的介绍1.2 memcpy的使用1.3 模拟实现memcpy库函数1.4 我想在1&#xff0c;2后面打印1…

web学习---Vue---笔记(1)

该笔记是记录尚硅谷的Vue学习视频的笔记&#xff0c;视频地址为&#xff1a;学习视频地址 初始Vue Vue组件化的特点 组件化声明式编码虚拟DOMDiff算法&#xff0c;尽量复用DOM节点 H5的组件&#xff0c;是把某一个模块封装&#xff0c;里面写HTML\CSS\JS等&#xff0c;算是一…

关于软件发布等一系列注意事项

我们以VS for Qt 开发为案例 1、软件图标的使用&#xff1a; this->setWindowIcon(QIcon("写入路径"));注意这里的路径&#xff0c;一般需要你先添加图片到资源文件中 那么如何将图片添加到资源文件中呢&#xff1f; 1、打开qrc文件 2、添加前缀&#xff0c;添…

【Linux】八、Linux进程信号详解(一)

目录 一、认识信号 1.1 生活中的信号 1.2 将1.1的概念迁移到进程 1.3 信号概念 1.4 查看系统定义信号列表 1.5 man 7 signal 1.6 解释1.2的代码样例 1.7 信号处理常见方式概览 二、产生信号 2.1 signal函数 2.2 通过终端按键产生信号 2.3 调用系统函数向进程发信号…

Java小课堂:自定义注解(案例:自定义DecimalFormat注解)

文章目录 引言I 预备知识1.1 元注解1.2 Target注解的ElementType枚举1.3 Retention注解的RetentionPolicy枚举II 自定义注解2.1 基本条件2.2 注解自定义属性的格式III 案例3.1 自定义DecimalFormat注解3.2 自定义json序列化解析引言 需求: 编辑费率限制的值时填写几位就保存几…