【实验日志】计算机串口使用与测量1

一、准备工作

安装好Ubuntu 20.04操作系统。

版本:Linux(Xubuntu发行版)虚拟机

https://mirrors.tuna.tsinghua.edu.cn/ubuntu-cdimage/xubuntu/releases/20.04/release/xubuntu-20.04.4-desktop-amd64.iso

二、Linux操作系统平台使用

【实验目的】

1、了解Linux系统文件系统的基本组织

2、了解Linux基本的多用户权限系统

3、熟练使用ls、cd、cat、more、sudo、gcc、vim等基本命令

4、会使用ls和chmod命令查看和修改文件权限

【知识点】

1、文件遵从FHS(文件系统层级标准)组织方式

2、“Linux中一切皆文件”直观理解:所有的东西,目录、设备、内存都模拟成文件,程序可以像访问普通磁盘文件一样,访问串行口、网络、打印机或其他设备。

3、文件权限:由读、写、执行三种职能组成

  1. 读:阅读文件——r
  2. 写:编辑或删除文件——w
  3. 执行:运行文件——x

权限标志由三位字符组成:

rwx: 可读写执行权限

r--: 只读权限

rw-: 读写权限

4、访问级别:每个文件都有三组不同的读、写、执行权限,分别使用于三种访问级别。

  1. 1-3位表示文件拥有者对文件的读写执行权限
  2. 4-6位表示拥有组对文件的读写执行权限
  3. 7-9位表示其他用户对文件的读写执行权限

查看文件的权限属性:

ls -l xxxxx

5、使用chmod命令更改文件属性

6、用户与组

  1. 超级用户:root,可以执行所有任务,UID为0,具有最高的系统权限
  2. 系统用户:系统本身或应用程序使用的专门账户,UID为1~499
  3. 普通用户:供实际用户登录使用的普通用户账号,UID默认从1000开始顺序编号

7、Linux提供特殊机制,让普通用户临时具备root权限

  1. su命令将自己提升为root权限
  2. sudo临时使用root身份运行程序

8、目录相关命令

  1. cd directory : 切换到其他目录
  2. pwd : 显示当前路径
  3. ls [options][filename] : 显示目录内容

主要参数:

-a:列出所有文件,包括隐藏文件;

-l:使用较长格式列出信息;

-m:所有项目以逗号分隔,并填满整行行宽;

-R:同时列出所有子目录层

  1. mkdir xxxx:创建一个文件夹
  2. rmdir xxxx:删除目录(要求目录是空的)
  3. cp [option] 源地址 目的地址 :复制
  4. mv [option] 源地址 目的地址 :移动

9、软件安装与卸载

  1. sudo dpkg -i package_file.deb :安装
  2. sudo dpkg -i package_name :卸载

10、gcc命令行选项:

-E:输出预处理结果

-S:输出汇编代码

-c:输出目标代码

-o file:输出名为file的可执行文件名(缺省为a.out)

-O O2:优化编译

-g:产生可用于调试的输出

【实验内容】

1、在Linux虚拟机中,安装下面附件中的firstrun.deb包

2、安装成功后,运行根目录下的/gettips可执行程序。该程序将在屏幕上给出下一步骤要探索的目录。

3、在第2步给出的目录中存在一个文件,请找到这个文件并将文件内容显示在屏幕上。

找到文件,发现权限不够,使用sudo命令。

更改文件权限:

显示隐藏文件,无可读权限:

更改TXT文件权限并将文件内容显示在屏幕上。

4、使用如下命令将文件内容提交到本次实验服务器,其中xxxxxxxxxx请用读取到的文件内容代替,iiiiiiiiiii用自己学号代替。请同学们务必正确输入自己的学号。

curl "132.232.98.70:6363/check?id=iiiiiiiiiiii&v=xxxxxxxxxx"

先下载curl命令

sudo snap install curl

再执行该行:

5、(选作内容):编写C语言程序,读取第4步所找到文件中的内容并转换成十六进制数输出到屏幕上,输出内容截图放在实验报告里。例如,如果文件内容为1234567890,那么屏幕上显示为:499602D2。

》文件读写回顾:

  1. 打开文件

使用 <stdio.h> 头文件中的 fopen() 函数

FILE *fopen(char *filename, char *mode);

filename为文件名(包括文件路径),mode为打开方式,它们都是字符串。

fopen() 会获取文件信息,包括文件名、文件状态、当前读写位置等,并将这些信息保存到一个 FILE 类型的结构体变量中,然后将该变量的地址返回。

FILE 是 <stdio.h> 头文件中的一个结构体,它专门用来保存文件信息。

例:FILE *fp = fopen("D:\\demo.txt","rb+");

判断文件是否打开成功(必需)

打开文件出错时,fopen() 将返回一个空指针,也就是 NULL,我们可以利用这一点来判断文件是否打开成功,请看下面的代码:

    FILE *fp;

    if( (fp=fopen("D:\\demo.txt","rb")) == NULL ){

        printf("Fail to open file!\n");

        exit(0);  //退出程序(结束程序)

}

文件打开方式:

r(read):读

w(write):写

a(append):追加

t(text):文本文件

b(binary):二进制文件

+:读和写

  1. 关闭文件

文件一旦使用完毕,应该用 fclose() 函数把文件关闭,以释放相关资源,避免数据丢失。fclose() 的用法为:

int fclose(FILE *fp)

fp 为文件指针。例如:

fclose(fp);

文件正常关闭时,fclose() 的返回值为0,如果返回非零值则表示有错误发生。

  1. 读取文件

fgetc()从指定的文件中读取一个字符。fgetc() 的用法为:

int fgetc (FILE *fp);

fp 为文件指针。fgetc() 读取成功时返回读取到的字符,读取到文件末尾或读取失败时返回EOF。可以连续多次使用 fgetc() 读取多个字符。

putc()向指定的文件中写入一个字符。fputc() 的用法为:

int fputc ( int ch, FILE *fp );

ch 为要写入的字符,fp 为文件指针。fputc() 写入成功时返回写入的字符,失败时返回 EOF

fgets() 函数用来从指定的文件中读取一个字符串,并保存到字符数组中,它的用法为:

char *fgets ( char *str, int n, FILE *fp );

str 为字符数组,n 为要读取的字符数目,fp 为文件指针
返回值:读取成功时返回字符数组首地址,也即 str;读取失败时返回 NULL

读取到的字符串会在末尾自动添加 '\0'

fputs() 函数用来向指定的文件写入一个字符串,它的用法为:

int fputs( char *str, FILE *fp )

str 为要写入的字符串,fp 为文件指针。写入成功返回非负数,失败返回 EOF。

fread() 函数用来从指定文件中读取块数据。所谓块数据,也就是若干个字节的数据,可以是一个字符,可以是一个字符串,可以是多行数据,并没有什么限制。fread() 的原型为:

size_t fread ( void *ptr, size_t size, size_t count, FILE *fp );

fwrite() 函数用来向文件中写入块数据,它的原型为:

size_t fwrite ( void * ptr, size_t size, size_t count, FILE *fp );

对参数的说明:

ptr 为内存区块的指针,它可以是数组、变量、结构体等。fread() 中的 ptr 用来存放读取到的数据,fwrite() 中的 ptr 用来存放要写入的数据。

size:表示每个数据块的字节数。

count:表示要读写的数据块的块数。

fp:表示文件指针。

理论上,每次读写 size*count 个字节的数据。

》注意:

1) 被写入的文件可以用写、读写、追加方式打开,用写或读写方式打开一个已存在的文件时将清除原有的文件内容,并将写入的字符放在文件开头。如需保留原有文件内容,并把写入的字符放在文件末尾,就必须以追加方式打开文件。不管以何种方式打开,被写入的文件若不存在时则创建该文件。

2) 每写入一个字符,文件内部位置指针向后移动一个字节。

3)数据写入完毕后,位置指针在文件的末尾,要想读取数据,必须将文件指针移动到文件开头,这就是rewind(fp);的作用

代码实现过程:

报错:[Error] invalid conversion from 'int' to 'void*' [-fpermissive]

原因:fread第一个参数要为指针。

打开文件失败,发现文件隐藏了扩展名。

发现读取数字不对,不会用fread……换成fgets提取字符串再转换成整数

atoi()函数(头文件stdlib.h中)

atoi():int atoi(const char *str );

功能:把字符串转换成整型数。

str:要进行转换的字符串

返回值:每个函数返回 int 值,此值由将输入字符作为数字解析而生成。 如果该输入无法转换为该类型的值,则atoi的返回值为 0。

说明:当第一个字符不能识别为数字时,函数将停止读入输入字符串

发现atoi不能处理大数

转而使用strtoll函数(与strtol函数类似,将字符串转换成longlongint)

long int strtol(const char *str, char** endptr, int base)

功能:将str字符串转变成long int类型的数据

参数:

str:想要转换的字符串

endptr:str中第一个不能转换的字符的指针

base:想要转换的进制数,例如8,16等

最终代码:

执行结果:

读取文件中3350353143转换为C7B254F7显示在屏幕上

参考文献:

字符串函数---atoi()函数详解及实现(完整版)_lanzhihui_的博客-CSDN博客_atoi函数

C语言fgets和fputs函数的用法详解(以字符串的形式读写文件)

c语言中strtol()以及strtoll()函数_u010271151的博客-CSDN博客_strtoll

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值