合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(二)

目录

基于ARM语音识别的智能家居系统

练习一

一、程序编译

练习二:

二、文件IO

三、文件IO常用API接口函数

1、打开文件 open()

2、将数据内容写入文件 write()

3、关闭(保存)文件

四、编程示例

总结


基于ARM语音识别的智能家居系统

我们上一篇讲了,关于Linux系统的一些质量,今天,我们实现在Linux系统下编译程序,我们通过两个小练习来熟悉一下。

练习一

熟悉基本命令的使用:
    1、在用户桌面目录下新建一个目录文件 demo/。
    2、在该目录 demo/下新建一个普通文件 hello.c。
    3、修改文件hello.c的权限为:
        对用户可读可写可执行     rwx   7
        对同组用户可写可执行     -wx   3
        对其他用户可读          r--   4
    4、将该目录 demo/ 拷贝到根目录下。

一、程序编译

我们编写程序实现输出hello world!!,相信大家这里的程序都会写。

//#include <stdio.h>   //宏:包含导入c语言标准输入输出头文件

int main()   //程序入口
{
	printf("hello world!!\n");   //在终端上打印 hello world!! 字符串 
	
	return 0;
}

gcc: 编译器、编译c语言的工具。

编译: gcc hello.c    编译得到一个可执行文件 a.out
执行: ./可执行文件   ./a.out
gcc hello.c -o bin
-o:将可执行文件重命名为bin,方便使用,防止文件覆盖。

 我们在Linux系统中,运行gcc hello.c可以得到一个.out文件。如果程序有错,就会提示哪里有错。下面是GCC编译器的介绍: 

GCC(GNU Compiler Collection)是一款免费的开源编译器,支持多种编程语言,例如C、C++、Objective-C、Fortran、Ada等。它是许多操作系统和软件的基石,包括GNU/Linux、Mac OS X、FreeBSD等。由于GCC的广泛应用和社区的庞大,它成为了业内最流行和广泛使用的编译器之一。

GCC(GNU Compiler Collection)是一款免费的开源编译器,支持多种编程语言,例如C、C++、Objective-C、Fortran、Ada等。它是许多操作系统和软件的基石,包括GNU/Linux、Mac OS X、FreeBSD等。由于GCC的广泛应用和社区的庞大,它成为了业内最流行和广泛使用的编译器之一。

 

 

练习二:

    使用    notpad++编写C程序,实现打印自己的姓名+学校+专业。在Ubuntu共享目录中,编译运行。
    拓展:打印99乘法表(循环)。

我们这里的程序都比较简单,我就直接展示代码,这里主要是来练习如何用GCC编译程序,熟悉这个过程。

#include <stdio.h> 

int main()  
{
	int i, j;
	for(i = 1; i<=9; i++)
	{
		for(j = 1; j<=i; j++)
		{
			printf("%dx%d=%d ", i, j, i*j);
		}
		printf("\n");
	}
	
	return 0;
}

如果你得到的结果和我一模一样,就说明,你已经掌握了这个方法,接下来,我们介绍文件。

二、文件IO

什么是文件?
    文件就是存放数据的集合。
    比如:.txt文件 .bmp文件   .jpg文件、、、、


Unix/Linux对数据文件(*.mp3、*.bmp),程序文件(*.c、*.h、*.o),设备文件(LCD、触摸屏、鼠标),网络文件( socket ) 等的管理都抽象为文件,使用统一的方式方法管理。

在Linux系统中,一切皆是文件!!!

控制一个LCD屏幕设备----》控制LCD设备对应的设备文件---》文件IO

三、文件IO常用API接口函数

打开文件----》对文件进行读/写操作-----》关闭(保存)文件

1、打开文件 open()

头文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

函数原型:
    int open(const char *pathname, int flags);
参数列表:
    const char *pathname:需要打开的文件路径的字符串  "./1.txt"
     int flags: 打开文件的方式
         O_RDONLY 以只读方式打开文件
         O_WRONLY 以只写方式打开文件
         O_RDWR   以可读写方式打开文件
返回值:
        失败: -1,错误码errno被设置。
        成功:返回一个新的文件描述符(文件的唯一标识符,遥控器)
        我们就可以通过这个文件描述符操纵这个文件。

2、将数据内容写入文件 write()

头文件:
	#include <unistd.h>

函数原型:
    ssize_t write(int fd, const void *buf, size_t count);
从buf写入数据的内存缓冲区中  取count个字节数据  写入fd指代的文件中
参数列表:
    int fd:需要写入数据的目标文件的文件描述符,就是open函数的返回值。
    const void *buf:临时存放待写入的数据的内存缓冲区
    size_t count:写入的数据字节大小
    
返回值:
        失败: -1,错误码errno被设置。
        成功:返回实际写入的字节个数。

3、关闭(保存)文件

头文件:
	#include <unistd.h>
函数原型:
    int close(int fd);
参数列表:
	int fd: 需要关闭的目标文件的文件描述符。
返回值:
	成功:返回0;
	失败:返回-1,错误码errno被设置。

四、编程示例

#include <stdio.h> 
#include <sys/types.h>  //open()
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>    //write()

int main()  
{
	//1、打开文件 1.txt
	int fd = open("./1.txt", O_RDWR);
	if(fd == -1)
	{
		//printf("open file failed!");
		perror("open file failed!");  //通过错误码打印错误信息
		return -1;   //程序非正常结束
	}
	
	//2、向文件中写入数据
	char buf[50] = "好好学习,天天向上!";
	int w_size = write(fd, buf, 50);
	printf("返回实际写入的字节个数: %d\n", w_size);
	
	//3、保存退出
	close(fd);

	return 0;
}
  • //1、打开文件 1.txt:这是打开文件的部分。它尝试打开当前目录下的"1.txt"文件,如果文件不存在,则返回-1。
  • //通过错误码打印错误信息:这是错误处理的代码。如果在打开文件过程中发生错误,它会打印错误信息并返回-1。
  • //2、向文件中写入数据:这是向文件写入数据的部分。它创建一个字符数组buf,并写入"好好学习,天天向上!"这句话。然后使用write()函数将buf的内容写入到文件中。
  • //返回实际写入的字节个数: %d:这是打印实际写入文件字节数的部分。
  • //3、保存退出:这是关闭文件的部分。在写入数据后,使用close()函数关闭文件。

我们这里实现了打开文件,写入文件的,最后关闭文件,今天的程序难度不大,主要还是熟悉操作。

总结

今天,我们主要熟悉了用GCC来编译程序和对文件的相关操作。下一篇,我们来介绍在led屏幕上显示图片。

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

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

相关文章

教务必备:php+Mysql多条件都输对版万用查分系统

查分吧PHP多条件都输对版已有表万用查询系统 V1.8 极简单文件实现一至多条件都输对成绩录取分班等通用查询。 支持隐藏指定列、支持网址列显示为图片或链接、支持验证码开关。 适合学校或教育机构信息中心技术员使用&#xff0c;快速部署并用于已有数据表查询。 无后台管理…

实战Leetcode(五)

Practice makes perfect&#xff01; 实战一&#xff1a; 思路&#xff1a;我们要用复制的节点来组成一个新的链表&#xff0c;而原链表的节点随机指向其中一个节点&#xff0c;我们首先给每一个节点都复制并且插入到原来节点的后面&#xff0c;然后用复制的节点指向我们原来节…

CTFSHOW 文件上传

web151 JS前端绕过 直接上传 png的图片马 然后抓包修改为php asystem("ls /var/www/html"); asystem("cat /var/www/html/flag.php"); web152 和151一样的方法也可以实现上传 asystem("ls /var/www/html"); asystem("cat /var/www/html…

D. Jumping on Walls bfs

Problem - 199D - Codeforces 题目大意&#xff1a;有一个两个垂直的平行墙壁组成的一个峡谷。一个人初始是在左边墙壁第一层。在每个墙壁上有些障碍点&#xff0c;用X表示&#xff0c;这些障碍点不能被到达。&#xff0c;他可以执行以下三个操作&#xff1a; 向当前墙壁往上…

Swift制作打包framework

新建framework项目 设置生成fat包&#xff0c;包括模拟器x86_64和arm64 Buliding Settings -> Architectures -> Build Active Architecture Only 设置为NO 设置打包环境&#xff0c;选择release edit Scheme -> run -> Build configuration 设置为 Release 设置…

微信小程序:tabbar、事件绑定、数据绑定、模块化、模板语法、尺寸单位

目录 1. tabbar 1.1 什么是tabbar 1.2 配置tabbar 2. 事件绑定 2.1 准备表单 2.2 事件绑定 2.3 冒泡事件及非冒泡事件 3. 数据绑定 3.1 官方文档 4. 关于模块化 5. 模板语法 6. 尺寸单位 1. tabbar 1.1 什么是tabbar 下图中标记出来的部分即为tabbar&#xff1a…

vue实现类似c#一样,鼠标指到方法或者变量上,能显示自己备注的信息

之前从c#转vue的时候&#xff0c;就问同事&#xff0c;为啥我给刚写的方法备注&#xff0c;在其他地方调用的时候看不到备注信息&#xff0c;同事说不知道怎么才能做到。今天无意间看前端知识的时候发现了还有如下的方法&#xff1a; 如下&#xff0c;在变量之前增加多一个星号…

matlab二维曲面散点图插值方法

在 MATLAB 中&#xff0c;你可以使用以下函数进行二维曲面散点插值&#xff1a; griddata: 该函数可以在散点数据上进行二维插值&#xff0c;生成平滑的曲面。它支持多种插值方法&#xff0c;包括三次样条插值、最近邻插值、线性插值和自然邻近法插值。 scatteredInterpolant:…

当酱香碰上科技,茅台渴望的未来不仅仅是“加钱”

作者 | 曾响铃 文 | 响铃说 又涨价了。2023年11月1日起&#xff0c;贵州茅台宣布旗下53%vol茅台酒&#xff08;飞天、五星&#xff09;的出厂价格平均将上调20%&#xff0c;这也是茅台自2018年1月以来&#xff0c;近六年后再次迎来调整。 不过略有不同的是&#xff0c;本轮零…

雷达测角原理、测角精度、测角分辨率以及3DFFT角度估计算法汇总

1.角度测量方法 依据&#xff1a;电磁波的直线传播和雷达天线的方向性。 分类&#xff1a;振幅法测角、相位法测角 1.1 相位法测角 相位法测角利用多个天线所接收回波信号之间的相位差进行测角。如下图所示&#xff1b; 图 1 设在θ方向有一远区目标&#xff0c;则到达接收点…

基于非对称纳什谈判的多微网电能共享运行优化策略(附带MATLAB程序)

基于非对称纳什谈判的多微网电能共享运行优化策略MATLAB程序 参考文献&#xff1a; 《基于非对称纳什谈判的多微网电能共享运行优化策略》——吴锦领 资源地址&#xff1a; 基于非对称纳什谈判的多微网电能共享运行优化策略MATLAB程序 MATLAB代码&#xff1a;基于非对称纳什…

微信小程序 生命周期方法 页面路由 开发示例 自定义全局数据 链接跳转

目录 1. 生命周期方法 2. 页面路由 3. 开发示例 3.1 自定义全局数据 3.2 链接跳转 1. 生命周期方法 打开app.js Page生命周期函数 下面的Page生命周期图与上面的Page生命周期函数进行对比便于理解&#xff1a; 视图线程和应用服务线程会同时运行&#xff0c;应用服务线程…

动手学深度学习——序列模型

序列模型 1. 统计工具1.1 自回归模型1.2 马尔可夫模型 2. 训练3. 预测4. 小结 序列模型是一类机器学习模型&#xff0c;用于处理具有时序关系的数据。这些模型被广泛应用于自然语言处理、音频处理、时间序列分析等领域。 以下是几种常见的序列模型&#xff1a; 隐马尔可夫模型…

YOLO改进系列之注意力机制(CloAttention模型介绍)

CloAttention来自清华大学的团队提出的一篇论文CloFormer&#xff0c;作者从频域编码的角度认为现有的轻量级视觉Transformer中&#xff0c;大多数方法都只关注设计稀疏注意力&#xff0c;来有效地处理低频全局信息&#xff0c;而使用相对简单的方法处理高频局部信息。很少有方…

【汽车电子】CAN总线分析仪使用介绍(PCAN/同星CAN卡)

本篇文章以CAN卡的使用为基本线索&#xff0c;介绍了在汽车电子领域涉及的一些CAN卡使用流程&#xff0c;搭配强大的上位机可以实现诸多功能。文章并没有局限于一种CAN卡&#xff0c;而是针对PCAN和同星的CAN卡分别以常用CAN报文收发以及诊断控制台实现这两种方向进行了CAN卡使…

Java学习之路 —— Day2(OOP)

文章目录 1. 方法2. OOP2.1 static2.2 单例模式2.3 继承2.4 多态 3. 常用API3.1 包3.2 String3.3 ArrayList 1. 方法 方法定义时要使用public static修饰&#xff0c;这是和C最不同的地方&#xff0c;因为java都是基于类执行的。 Java的参数传递机制是值传递&#xff0c;即传…

关于 Java NIO 的 Selector 的事儿,这篇文章里面全都有

前面 4 篇文章深入分析了 NIO 三大组件中的两个&#xff1a;Buffer 和 Channel&#xff1a; 【死磕 NIO】— 深入分析Buffer【死磕 NIO】— 深入分析Channel和FileChannel【死磕NIO】— 跨进程文件锁&#xff1a;FileLock【死磕NIO】— 探索 SocketChannel 的核心原理 这篇文…

数据结构与算法【递归】Java实现

递归 递归是一种解决计算问题的方法&#xff0c;其中解决方案取决于同一类问题的更小子集。 特点&#xff1a; 自己调用自己&#xff0c;如果说每个函数对应着一种解决方案&#xff0c;自己调用自己意味着解决方案是一样的&#xff08;有规律的&#xff09;每次调用&#xf…

【Linux】Ubuntu16.04系统查看已安装的python版本,及其配置

前情提示&#xff1a;我已经在Ubuntu16.04里用源码安装了python3.8.11&#xff0c;Ubuntu16.04系统默认安装2.7.12与3.5.2 1.查看已安装版本 python2 --version #查看python2安装版本 python3 --version #查看python3安装版本 python3.5 --version #查看python3.5安装…

Elasticsearch:ES|QL 快速入门

警告&#xff1a;此功能处于技术预览阶段&#xff0c;可能会在未来版本中更改或删除。 Elastic 将努力解决任何问题&#xff0c;但技术预览版中的功能不受官方 GA 功能的支持 SLA 的约束。目前的最新发行版为 Elastic Stack 8.11。 Elasticsearch 查询语言 (ES|QL) 提供了一种强…
最新文章