当前位置: 首页 > 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.dtcms.com/a/324340.html

相关文章:

  • Java 基础编程案例:斐波拉契数与从输入交互到逻辑处理
  • NodeJs学习日志(4):路由合并_环境配置_常用文件目录
  • HarmonyOS之module.json5功能详解
  • AI测试助手如何让Bug无处可藏
  • 湖南(源点咨询)市场调研 如何在行业研究中快速有效介入 中篇
  • 深入浅出DBSCAN:基于密度的聚类算法详解与Python实战
  • github上传文件
  • Navicat 无限适用
  • Tesseract训练个人字库操提高准确率操作全流程(详细)
  • 新手向:Python制作简易音乐播放器
  • Python中的 __name__
  • 遇到前端导出 Excel 文件出现乱码或文件损坏的问题
  • 异或循环冗余
  • Python设计模式 - 装饰模式
  • 新手向:Python实现文件加密解密工具
  • 旅行者1号无线电工作频段
  • 18.3 全量微调:数据预处理之清洗与准备
  • 机器学习——DBSCAN 聚类算法 + 标准化
  • 实现两个开发板的串口通讯(基于STC8实现)
  • 复刻苏宁易购(移动端)
  • 【GPT入门】第44课 检查 LlamaFactory微调Llama3的效果
  • cursor, vscode黄色波浪线警告问题
  • React:useEffect 与副作用
  • 小巧实用的工具——ZoomIt
  • 【C++对象诞生全解析】构造函数:从内存布局到高效初始化的终极指南
  • 152-基于CWT-CNN-BiGRU-Attention-SABO-LSSVM对滚动轴承的故障诊断
  • spring-boot-starter-data-redis 与 org.redisson 区别 联系
  • 【递归、搜索与回溯算法】深度优先搜索
  • Text2SQL 自助式数据报表开发(Chat BI)
  • 《解锁 C++ 起源与核心:命名空间用法 + 版本演进全知道》