当前位置: 首页 > news >正文

嵌入式第二十四课!!linux应用软件编程与文件操作!!!

在结束C语言与数据结构的学习后,我们从本节课开始学习linux应用软件编程:

linux应用软件编程

它分为以下几个板块:

    1. 文件操作——一切皆基于文件的基础上操作
2. 多任务——多进程、多线程工作
3. 网络编程
4. 构建网络服务器
5. 数据库

linux应用软件编程实际上就是操作系统相关的编程,也就是使用不同的函数接口、搭建不同的流程框架;

文件操作

Linux下的文件类型

linux下的文件类型共有七种:

b    块设备文件  ——> 存储类设备(硬盘)
c    字符设备文件 ——>如输入输出设备(鼠标、键盘、显示器...)
d    目录文件    ——>文件夹
-     普通文件   ——>xxx.c  xxx.h   xxx.txt   xxx.jpg  xxx.mp4  a.out
l     软链接文件 ——>快捷方式(windows)
s     套接字文件 ——>网络通信
p     管道文件   ——>进程间通信

举个例子:(在终端使用命令ls -l可以查看当前目录文件的详细信息)

1.最前面的 “ d ”就是代表了文件类型;

2.“ d ”后的“rwxrwxrwx”代表了文件的操作权限:

r:read
w:write
x:可执行权限
-:无权限

        第一段的“rwx”代表自己对文件的读写执行权限;

        第二段的“rwx”代表同组用户对文件的读写执行权限;

        第三段的“rwx”代表其他人对文件的读写执行权限;

3.数字“4”代表链接个数;

4.后面的第一个“linux”是用户自己的名字,第二个是组名;

5.4096代表该文件的字节大小;

6.时间(Mar 19 2020)代表该文件最后被修改的时间;

7.最后的“vim”是该文件的文件名;

文件操作的思想

   我们围绕文件进行操作主要是这三步:

1. 打开文件
2. 读写文件
3. 关闭文件

文件操作的方法

在Linux下有这2种文件操作方法(I:input ; O:output):
1. 标准IO:
是C标准库提供的一套对文件操作的操作方法,即库函数;
2. 文件IO:
Linux内核提供的一套对文件操作的操作方法,即在系统调用;

标准IO

在库文件里要调用的对文件操作的函数如下:   

1. 打开文件    fopen
2. 读/写文件   
fgetc/fputc :一个字符一个字符的读写数据
fgets/fputs: 一行一行的读写数据
fread/fwrite:
3 . 关闭文件    fclose

在调用函数的时候,我们可以通过man+函数来查找函数的使用方式:

1.打开文件 fopen

fopen函数是在这样使用的:

FILE *fopen(const char *pathname, const char *mode);
功能:打开一个文件并获得一个文件流指针
参数:
pathname:打开得文件的文件名地址
mode:打开的方式
"r"         以只读的方式打开, 文件必须存在
"r+"       以读写的方式打开,文件必须存在
"w"       以只写的方式打开,文件存在则清空,文件不存在则创建
"w+"     以读写的方式打开,文件存在则清空,文件不存在则创建
"a"         以追加写的方式打开,文件不存在创建
"a+"       以读写的方式打开,文件不存在创建,,文件存在追加写
返回值:
打开成功:文件流指针:FILE *
打开失败:NULL

在文件操作里,流指的就是字节流;而文件流,就是数据从文件流入流出,体现出来的字节流;在标准IO里,FILE 就是文件流,FILE * 就是文件流指针,指向已打开文件;

2.关闭文件fclose

fclose函数是这样使用的:

int fclose (FILE *stream)

它用来关闭文件;

举个例子:

include <stdio.h>int main(int argc, const char *argv[])
{FILE *fp = fopen("./1.txt", "a");if (NULL == fp){printf("fopen error\n");return -1;}printf("fopen file ok\n");fclose(fp);return 0;
}

3.为文件写入字符fputc

fputc是这样使用的:

int fputc(int c, FILE *stream);
功能:向文件中写入一个字符
参数:
c:要写入的字符
stream:要写入的文件的文件流指针
返回值:
成功:写入的字符的ASCII值
失败:EOF (-1)

我们在终端运行时,可以使用命令od - c +文件名,可以以字符形式在终端输出文件内容;


#include <stdio.h>int main(int argc, const char *argv[])
{FILE *fp = fopen("./1.txt", "w+");if (NULL == fp){printf("fopen error\n");return -1;}printf("fopen file ok\n");fputc('a', fp);fputc(97, fp);fputc(98, fp);fputc(ch1, fp);fclose(fp);return 0;
}

而且,我们可以通过循环,输入字符串:

#include <stdio.h>
#include <string.h>int main(int argc, const char *argv[])
{FILE *fp = fopen("./1.txt", "w+");if (NULL == fp){printf("fopen error\n");return -1;}printf("fopen file ok\n");char str[32] = {"hello world"};char *pstr = "hello world";for (int i = 0; i < strlen(pstr); ++i){fputc(str[i], fp);}fclose(fp);return 0;
}

4.从文件读出字符fgetc

fgetc是这样使用的:

int fgetc(FILE *stream);
功能:从文件中读取一个字符
参数:
stream:要读取的文件的文件流指针
返回值:
成功:读到的字符的ASCII值
失败:EOF
读到文件末尾:EOF

举个例子:

#include <stdio.h>int main(int argc, const char *argv[])
{FILE *fp = fopen("./01_fopen.c", "r");if (NULL == fp){printf("fopen error\n");return -1;}while (1){int ret = fgetc(fp);if (EOF == ret){//printf("end of file or error\n");break;}printf("%c", ret);}fclose(fp);return 0;
}

5.使用fgetc和fputc进行应用

使用fgetc实现cat函数(输出该文件的所有内容)的功能

#include<stdio.h>int main(void)
{FILE *fs = fopen("./2.txt ", "r");if(fs == NULL){printf("open error\n");return 0;}else{printf("open file\n");}int ret = fgetc(fs);while(EOF != ret){printf("%c",ret);ret = fgetc(fs);}fclose(fs);return 0;
}

使用fgetc和fputc来实现文件的拷贝功能


#include<stdio.h>
#include<string.h>int main(int argc , const char* argv[])
{printf("Usage : ./a.out <stc> <des>");if (argc != 3){printf("error");return 0;}FILE *fp = fopen(argv[1],"r");FILE *fs = fopen(argv[2], "w");if(fp == NULL){printf("open error\n");return 0;}else{printf("open file\n");}if(fs == NULL){printf("open error\n");return 0;}else{printf("open file\n");}int ret = fgetc(fp);while(EOF != ret){fputc(ret,fs);ret = fgetc(fp);}fclose(fp);fclose(fs);return 0;
}

6.用主函数传参来实现不同文件的拷贝

通过主函数进行传参,在编译后,执行文件+参数;
./a.out aaa bbb   ——>实参
主函数中的参数 ——>形参

./a.out aaa bbb

 argc : 程序运行时,给主函数传递的参数个数  3
argv : 指针数组:一共有argc个指针,分别指向了给主函数传递的实参
argv[0] ---->"./a.out"
argv[1] ---->"aaa"
argc[2] ---->"bbb"

int main(int argc, const char *argv[])
{if (argc != 3){printf("Usage : ./a.out <srcfile> <dstfile>\n");return -1;}FILE *srcfp = fopen(argv[1], "r");FILE *dstfp = fopen(argv[2], "w");if (NULL == srcfp || NULL == dstfp){printf("fopen error\n");return -1;}while (1){int ret = fgetc(srcfp);if (EOF == ret){break;}fputc(ret, dstfp);}fclose(srcfp);fclose(dstfp);return 0;
}

7.为文件写入字符串fputs

fputs是这样使用的:

int fputs(const char *s, FILE *stream);
功能:向文件中写入字符串(不会写入'\0'字符)
参数:
s:字符串首地址
stream:要写入的文件流指针

返回值:
成功:非负的整形数据
失败:EOF(-1)

#include <stdio.h>int main(int argc, const char *argv[])
{FILE *fp = fopen("1.txt", "w");if (NULL == fp){printf("fopen error\n");return -1;}fputs("hello world", fp);char str[32] = {"how are you"};fputs(str, fp);char *pstr = "hello world";fputs(pstr, fp);fclose(fp);return 0;
}

8.文件读出字符串fgets

fgets函数是这样使用的:

char *fgets(char *s, int size, FILE *stream);
功能:   从文件中读取一行数据
参数:
s : 用来存放读取到数据的内存空间首地址
size:希望从文件中读到的字节数
stream:要读取的文件流指针
返回值:
成功:返回s空间的首地址
失败:NULL
读到文件末尾:NULL

#include <stdio.h>int main(int argc, const char *argv[])
{FILE *fp = fopen("1.txt", "r");if (NULL == fp){printf("fopen error\n");return -1;}char s[100] = {0};char *p = fgets(s, sizeof(s), fp);if (NULL == p){printf("error or end of file\n");}printf("s = %s\n", s);fclose(fp);return 0;
}

 

 

以上就是今天和大家分享的内容!!!感谢你的阅读!!!如果有疑问和错误欢迎在评论区评论!!!

 

http://www.xdnf.cn/news/1276057.html

相关文章:

  • Rust 实战四 | Traui2+Vue3+Rspack 开发桌面应用:通配符掩码计算器
  • JAVA+AI简化开发操作
  • Java集合中的 LinkedList
  • 每日任务day0810:小小勇者成长记之武器精炼
  • node.js 学习笔记3 HTTP
  • Django @login_required实现登陆认证
  • C/C++内存管理函数模板
  • 小明的魔法地图:迷宫探险智慧(记忆性递归)
  • 【0基础3ds Max】主工具栏介绍(下)
  • [激光原理与应用-223]:机械 - 机加厂加工机械需要2D还是3D图?
  • Python设计模式 - 装饰模式
  • 六、RuoYi-Cloud-Plus OSS文件上传配置
  • QT常用控件三
  • Qt—— 下载、工具介绍以及新建项目
  • 从0开始的中后台管理系统-5(userList页面功能实现)
  • 40.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--扩展功能--集成网关--初始化网关
  • Pytorch进阶-timm库-00快速开始
  • (三)全栈(部署)
  • 精准计算Word文档页数的PHP类
  • 数据结构-deque(双端队列)和queue(队列)区别
  • 【npm、yarn、pnpm】特点对比,按需选择
  • Java 后端性能优化实战:从 SQL 到 JVM 调优
  • 分布微服务电商订单系统Rust编码开发[上]
  • 数组练习(一)
  • vuhub drippingblues靶场攻略
  • #4:MinIO分片上传和集群部署
  • 攻击实验(ARP欺骗、MAC洪范、TCP SYN Flood攻击、DHCP欺骗、DHCP饿死)
  • 安全运维的核心
  • C语言——深入理解指针(二)
  • 【递归、搜索与回溯算法】递归算法