01.系统IO

文章的函数说明只是简单的说明,具体还得查看man手册

Linux文件说明

linux下一切皆是文件。

Linux 下的文件类型:

1,普通文件(regular):存在于外部存储器中,用于存储普通数据。
2,目录文件(directory):用于存放目录项,是文件系统管理的重要文件类型。
3,管道文件(pipe):一种用于进程间通信的特殊文件,也称为命名管道 FIFO。
4,套接字文件(socket):一种用于网络间通信的特殊文件。
5,链接文件(link):用于间接访问另外一个目标文件,相当于 Windows 快捷方式。
6,字符设备文件(character):字符设备在应用层的访问接口。
7,块设备文件(block):块设备在应用层的访问接口。

学习内容

1、系统 IO
        由系统直接提供的函数接口,特点就是特别简洁,功能单一
        没有设置缓冲区,因此对于海量数据效率较低
        套接字文件以及设备文件只能使用系统IO 来访问
2、标准 IO
        由标准C 库提供函数接口,特点就是特别丰富
        有提供缓冲区,对于海量数据的处理效率较高
        编程的过程中建议使用标准IO 来实现, 除非不能用
3、目录操作
        如何读取目录的内容
4、库文件
        库的移植
        参数化动态链接库

man 手册如何查询: 

例如查看open()这个函数在哪一本man手册

1 $man - f open // 通过 man -f 来查询 open 出现在哪些手册中
2 open ( 1 ) - start a program on a new virtual terminal ( VT ).
3 open ( 2 ) - open and possibly create a file

man手册说明

       1   Executable programs or shell commands ->第一本是命令手册
       2   System calls (functions provided by the kernel)->第二本是系统函数手册
       3   Library calls (functions within program libraries)->第三本是程序库函数手册
       4   Special files (usually found in /dev)
       5   File formats and conventions, e.g. /etc/passwd
       6   Games
       7   Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7),                man-pages(7)
       8   System administration commands (usually only for root)
       9   Kernel routines [Non standard] 

因此在第二本中查
man 2 open

系统IO 函数学习

打开文件

open()函数

头文件:
        #include < sys / types . h >
        #include < sys / stat . h >
        #include < fcntl . h >
  定义函数 :
         int open ( const char * pathname , int flags );
         int open ( const char * pathname , int flags , mode_t mode );
  参数分析:
         pathname --> 需要打开的文件的 路径 + 名字 (如果没有写路径则默认为当前路径)
         flags --> 旗标(标志实质是就是一个数字)
O_RDONLY 以只读方式打开文件
O_WRONLY 以只写方式打开文件
O_RDWR 以可读写方式打开文件 .
上述三种旗标是互斥的 , 也就是不可同时使用 , 但可与下列的旗标利用 OR ( | ) 运算符组合 .
O_CREAT 若欲打开的文件不存在则自动建立该文件 .
O_EXCL 如果 O_CREAT 也被设置 , 此指令会去检查文件是否存在 . 文件若不存在则建立该文件 , 否则将导致打开文件错误。此外,若 O_CREAT与O_EXCL同时设置,并且将要 打开的文件为符号连接,则将导致打开文件失败
O_NOCTTY 如果欲打开的文件为终端机设备时 , 则不会将该终端机当成进程控制终端机 .
​​​​​​​         O_TRUNC 若文件存在并且以可写的方式打开时 , 此旗标会令文件长度清为 0 , 而原来存于该文件的资料将被清除。
​​​​​​​         O_APPEND 当读写文件时会从文件尾开始移动 , 也就是所写入的数据会以附加的方式加入到文件后面。
​​​​​​​         O_NONBLOCK 以非阻塞方式打开文件,即使无法立即进行读写操作也不会被阻塞。
O_NDELAY O_NONBLOCK .
O_SYNC 以同步的方式打开文件 .
O_NOFOLLOW 如果参数 pathname 所指的文件为一符号连接 , 则会令打开文件失败 .
​​​​​​​        ​​​​​​​ O_DIRECTORY 如果参数 pathname 所指的文件并非为一目录 , 则会令打开文件失败 .
                   mode --> 文件的初始化权限(只有在创建新文件的时候生效)
  返回值:
成功
                返回一个新的文件描述符 ( new file descriptor )
                 int --> 整型 --> 编号 --> 该文件在本进程中的编号
失败
                返回 - 1 , 错误号码会被设置

代码例子

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>int main1()
{int FD = open("abc.c", O_RDONLY);//以只读的形式打开abc.c,如果abc.c不在当前目录下就报错if(-1 ==FD){//int fprintf(FILE *stream, const char *format, ...)//stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。//format -- 这是 C 字符串,包含了要被写入到流 stream 中的文本。//它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。// errno 是 C 标准库中的一个宏,定义在 <errno.h> 头文件中。它用于指示在程序运行过程中发生的错误。//errno 实际上是一个整数变量,用于存储错误代码。库函数在发生错误时,会设置 errno 为适当的错误代码,以便程序可以检查和处理这些错误。//C 库函数 char *strerror(int errnum) 从内部数组中搜索错误号 errnum,并返回一个指向错误消息字符串的指针。//strerror 生成的错误字符串取决于开发平台和编译器。fprintf(stderr,"open abc.c error:%s\n",strerror(errno));exit(-1);}else{printf("open abc.c success , file_number:%d",FD);}
}int main()
{int FD = open("abc.c", O_RDONLY|O_CREAT,0666);//以只读的形式打开abc.c,如果当前目录下没有abc.c则创建abc.c文件文件权限为0666if(-1 ==FD){fprintf(stderr,"open abc.c error:%s\n",strerror(errno));exit(-1);}else{printf("open abc.c success , file_number:%d",FD);}
}

运行结果

main1()

jiejie@DESKTOP-1HU808H:/mnt/e/Shared_WSL/我的程序/文件IO/系统IO$ touch abc.c
jiejie@DESKTOP-1HU808H:/mnt/e/Shared_WSL/我的程序/文件IO/系统IO$ gcc open.c
jiejie@DESKTOP-1HU808H:/mnt/e/Shared_WSL/我的程序/文件IO/系统IO$ ./a.out
open abc.c success , file_number:3jiejie@DESKTOP-1HU808H:/mnt/e/Shared_WSL/我的程序/文件IO/系统IO$ rm abc.c 

main()

open abc.c success , file_number:3jiejie@DESKTOP-1HU808H:/mnt/e/Shared_WSL/我的程序/文件IO/系统IO$ rm abc.c 
jiejie@DESKTOP-1HU808H:/mnt/e/Shared_WSL/我的程序/文件IO/系统IO$ gcc open.c
jiejie@DESKTOP-1HU808H:/mnt/e/Shared_WSL/我的程序/文件IO/系统IO$ ./a.out
open abc.c success , file_number:3jiejie@DESKTOP-1HU808H:/mnt/e/Shared_WSL/我的程序/文件IO/系统IO$ 

注意 

当前文件的权限不允许读取:

如果程序是以只读的权限打开时出现以下错误:

注意umask:

如果我们在使用Open 来创建文件时, 文件的权限值会受到umask的影响
实际的权限值为设置 - umask (0666 - 0022 = 0644)
一般情况下系统默认设置为 0002

写入文件

1 头文件:
2         #include < unistd . h >
3
4 定义函数:
5         ssize_t write ( int fd , const void * buf , size_t count );
6         ssize_t read ( int fd , void * buf , size_t count );
7 参数分析:
8            fd --> 需要写入的文件的描述符
9            buf --> 需要写入的数据所在的内存地址
10         count --> 需要写入的字节数
1 2 返回值:
13          返回实际写入的字节数 .
14          当有错误发生时则返回 - 1 , 错误代码存入 errno

注意

如果文件以只读的形式打开那么就不能向文件写入内容否则系统会直接报错

 测试

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <stdio.h>

#include <errno.h>

#include <string.h>

#include <stdlib.h>

#include <unistd.h>

#define OpenfilePath  "./tag.txt"

int main(int argc, char const *argv[])

{

    int FD = open(OpenfilePath,O_WRONLY| O_CREAT| O_TRUNC,0666);//打开,创建,清0、tag.txt

    if(-1 ==FD)

    {

        fprintf(stderr,"open abc.c error:%s\n",strerror(errno));

        exit(-1);

    }

    else

    {

        printf("open abc.c success , file_number:%d",FD);

    }

    int flag_value = -1;

    flag_value = write(FD,"hello work",sizeof("hello work"));

    if(-1 == flag_value)

    {

        perror("写入文件失败\n");

    }

    else

    {

        printf("写入%d个字节\n",flag_value);

    }

    close(FD);

    return 0;

}

​​​​​​​

读取文件

头文件:
2         #include < unistd . h >
3
4 定义函数:
5         ssize_t read ( int fd , void * buf , size_t count );
6
7 参数分析:
8         fd --> 需要读取的文件的描述符
9         buf --> 读取到的数据存放的位置(用户的缓冲区)
10         count --> 需要读取的字节数
11
12 返回值:
13          成功 返回实际读到的字节数(如果返回值比count 小,则有可能到大文件的末尾)
14          错误 发生时则返回 - 1 , 错误代码存入 errno

 测试

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>#define OpenfilePath  "./tag.txt"int main(int argc, char const *argv[])
{int FD = open(OpenfilePath,O_RDONLY);//打开,创建,清0、tag.txtif(-1 ==FD){fprintf(stderr,"open abc.c error:%s\n",strerror(errno));exit(-1);}else{printf("open abc.c success , file_number:%d\n",FD);}long flag_value = -1;flag_value = lseek(FD, 1, SEEK_SET);printf("偏移了%ld个字节\n",flag_value);flag_value = -1;char buffer[128];bzero(buffer, sizeof(buffer) ); // 清空内存区flag_value =  read(FD, buffer, sizeof(buffer));if(-1 == flag_value){perror("读取文件失败\n");}else{printf("读取成功,读取到%ld个字节\n读取的内容%s\n",flag_value,buffer);}close(FD);return 0;
}

经过测试如果读取不设置偏移量,默认从文件起始位置开始读取。

移动文件的读写位置

1 头文件:
2         #include < sys / types . h >
3         #include < unistd . h >
4
5 定义函数 :
6         off_t lseek ( int fildes , off_t offset , int whence );
7
8 参数分析:
9         fildes --> 需要移动读写位置的文件的描述符
10         offset --> 偏移量设置
11         whence --> 偏移的模式
12                  SEEK_SET 参数 offset 即为新的读写位置 .
13                  SEEK_CUR 以目前的读写位置往后增加 offset 个位移量 .
14                  SEEK_END 将读写位置指向文件尾后再增加 offset 个位移量 .
15         ​​​​​​​         当 whence 值为 SEEK_CUR SEEK_END , 参数 offet 允许负值的出现 .
16
17 返回值:
18          成功时则返回目前的读写位置 , 也就是距离文件开头多少个字节 .
19          若有错误则返回 - 1 , errno 会存放错误代码

关闭文件

1 头文件:
2         #include < unistd . h >
3
4 定义函数:
5         int close ( int fd );
6
7 参数看看:
8         fd --> 需要关闭的文件的描述符
9
10  返回值:
11          若文件顺利关闭则返回 0 ,
12          发生错误时返回 - 1.

复制文件 

1. 尝试使用程序来实现文件的拷贝
2. 尝试实现类似 cp 命令的操作
1 cp 1. c abc . c
2 . / a . out 1. c abc . c

思路:

linux系统的栈空间有8MB,如果要复制一个超过8MB的文件我们就不能直接定义一个超过8MB的数组来存放我们读取的内容。就好比抄作业不能一次性把别人的作业全记住在往自己的本子上写。我们需要在堆中开辟一个小空间来作为我们的缓存,一点一点的复制。

 int main(int argc, char const *argv[])这是一个标准的main函数argc使我们调用参数的个数,这些参数会保存在argv[]这个数组里。

实现:

以程序的方式进行复制

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>#define TrgPath  "./abc.c"
#define SrcPath  "./open.c"int main(int argc, char const *argv[])
{//打开文件int SrcPathFD = open(SrcPath,O_RDONLY );//打开,创建,清0、tag.txtif(-1 ==SrcPathFD){fprintf(stderr,"open SrcPath error:%s\n",strerror(errno));close(SrcPathFD);exit(-1);}//int TrgPathFD = open(TrgPath,O_WRONLY|O_CREAT|O_TRUNC,0666);//打开,创建,清0、tag.txtint TrgPathFD = open(TrgPath,O_WRONLY| O_CREAT | O_TRUNC , 0666);//打开,创建,清0、tag.txtif(-1 ==TrgPathFD){fprintf(stderr,"open TrgPath:%s\n",strerror(errno));close(TrgPathFD);exit(-1);}//建立缓冲区char *bufferaddr = (char *)calloc(1,128);if(NULL == bufferaddr){printf("堆空间不足");return -1;}//复制内容//复制结束的条件读到的字节个数小于128那就说明读完了long flag_value = -1;do{flag_value =  read(SrcPathFD, bufferaddr, 128);//不能sizeof(bufferaddr)if(-1 == flag_value){perror("读取文件失败\n");break;}else{printf("读取成功,读取到%ld个字节\n",flag_value);}flag_value = write(TrgPathFD,bufferaddr,flag_value);if(-1 == flag_value){perror("写入文件失败\n");break;}else{printf("写入%ld个字节\n",flag_value);}}while(flag_value >= 128);close(SrcPathFD);close(TrgPathFD);return 0;
}

以命令的方式进行

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>int main(int argc, char const *argv[])
{if(argc != 3){printf("请输入正确的参数\n");return -1;}//打开文件int SrcPathFD = open(argv[0],O_RDONLY );//打开,创建,清0、tag.txtif(-1 ==SrcPathFD){fprintf(stderr,"open SrcPath error:%s\n",strerror(errno));close(SrcPathFD);exit(-1);}int TrgPathFD = open(argv[1],O_WRONLY| O_CREAT | O_TRUNC , 0666);//打开,创建,清0、tag.txtif(-1 ==TrgPathFD){fprintf(stderr,"open TrgPath:%s\n",strerror(errno));close(TrgPathFD);exit(-1);}//建立缓冲区char *bufferaddr = (char *)calloc(1,argv[3]);if(NULL == bufferaddr){printf("堆空间不足");return -1;}//复制内容//复制结束的条件读到的字节个数小于128那就说明读完了long flag_value = -1;do{flag_value =  read(SrcPathFD, bufferaddr, argv[3]);//不能sizeof(bufferaddr)if(-1 == flag_value){perror("读取文件失败\n");break;}else{printf("读取成功,读取到%ld个字节\n",flag_value);}flag_value = write(TrgPathFD,bufferaddr,flag_value);if(-1 == flag_value){perror("写入文件失败\n");break;}else{printf("写入%ld个字节\n",flag_value);}}while(flag_value >= argv[3]);close(SrcPathFD);close(TrgPathFD);return 0;
}
jiejie@DESKTOP-1HU808H:/mnt/e/Shared_WSL/我的程序/文件IO/系统IO$ gcc copy.c
jiejie@DESKTOP-1HU808H:/mnt/e/Shared_WSL/我的程序/文件IO/系统IO$ ./a.out ./open.c ./abc.c 128
读取成功,读取到128个字节
写入128个字节
读取成功,读取到128个字节
写入128个字节
读取成功,读取到128个字节
写入128个字节
读取成功,读取到128个字节
写入128个字节
读取成功,读取到128个字节
写入128个字节
读取成功,读取到128个字节
写入128个字节
读取成功,读取到128个字节
写入128个字节
读取成功,读取到128个字节
写入128个字节
读取成功,读取到128个字节
写入128个字节
读取成功,读取到128个字节
写入128个字节
读取成功,读取到128个字节
写入128个字节
读取成功,读取到128个字节
写入128个字节
读取成功,读取到128个字节
写入128个字节
读取成功,读取到128个字节
写入128个字节
读取成功,读取到13个字节
写入13个字节

两种运行方式效果完全相同,命令的方式可以让我们很好的利用这个程序达到我们复制文件的效果。命令的方式可以设置复制文件的格式名称。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解音视频pts,dts,time_base以及时间数学公式

引入 首先介绍一下基础名词 DTS&#xff08;Decoding Time Stamp&#xff09;&#xff1a;即解码时间戳&#xff0c;这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。当数据没b帧时&#xff0c;dts pts&#xff0c;有兴趣可参阅我前面视频知识类文章。 PTS&a…

统信服务器操作系统【开机自启动】配置方法

开机自启动的四种配置方法,包括systemctl命令、rc.local文件、crontab任务,通过desktop配置开机自动,前三种方法适合后台程序或者脚本启动,最后一种方法适合图形化程序启动。 文章目录 准备环境配置方法一、通过编写service的方法,使用systemctl配置开机自启二、通过rc.lo…

展锐平台的手机camera 系统isptool 架构

展锐平台的isptool 主要用于支持展锐各代芯片isp的各效果模块快速tuning和参数生成打包。 具体需要&#xff1a; 一、工具段能在线实时预览到调试sensor经过isp 处理后的图像&#xff0c;也就是各模块的参数在当下实时生效&#xff0c;通过工具能在PC 上在线观看到修改的效果。…

【企业微信】群机器人自动消息配置

0、群聊机器人 内部企微群聊可以添加一个机器人&#xff0c;这个机器人其实是个消息接口&#xff0c;可以外部脚本来自动定时发送消息到群里&#xff0c;打工人最有用的提醒就是每周提醒发周报了。 1、创建机器人 一般公司都没有人使用&#xff0c;我们可以手动创建一个。 …

小程序开发设计-小程序的宿主环境:宿主环境简介⑥

上一篇文章导航&#xff1a; 小程序开发设计-小程序代码的构成&#xff1a;小程序页面的组成部分详解⑤-CSDN博客https://blog.csdn.net/qq_60872637/article/details/142306902?spm1001.2014.3001.5501 注&#xff1a;不同版本选项有所不同&#xff0c;并无大碍。 目录 上…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【用户态内存调测】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 基本概念 Debug版本的musl-libc库为用户提供内存泄漏检测、堆内存…

2024在线翻译工具横评:准确率、速度与易用性大比拼

在日常的学习与生活中&#xff0c;翻译工具无疑成为了我们迅速获取国际新闻与知识的得力助手。起初&#xff0c;我倾向于依赖有道在线翻译这一平台来解决我的语言障碍问题。然而&#xff0c;随着对翻译质量要求的提升和多元化比较的需求增加&#xff0c;我进一步探索并发现了数…

从入门到精通:计算机视觉学习路线与实战项目推荐

全面解析计算机视觉的学习路径&#xff0c;深入探讨关键技术与实战项目&#xff0c;助您快速掌握核心技能 引言 随着人工智能的飞速发展&#xff0c;计算机视觉已成为AI领域中最具潜力和应用价值的分支之一。从自动驾驶到医疗影像分析&#xff0c;计算机视觉技术正在改变我们的…

vue/配置axios(前后端数据连通/api接口的调用)

1.创建apis文件 2.写入调用的api地址且暴露出去。 import httpInstance from /utils/http;export function getHomeNav() {return httpInstance({url: http://10.0.11.91:91/dailyreport/getdailyreportall,}) }3.创建文件编写拦截器 代码部分 //axios基础封装 import axio…

OpenCV 3

模板匹配方法 尽量采用归一化的方法&#xff0c;因为它更加精细。 匹配效果展示 匹配单一图像 这是一段Python代码&#xff0c;主要使用了OpenCV库进行图像处理。这段代码的主要功能是通过模板匹配方法在一张大图中找到一个小图的位置。 具体来说&#xff1a; - 第一行的for…

Docker:解决开发运维问题的开源容器化平台

云计算de小白 Docker是一个开源的容器化平台&#xff0c;可以将应用程序及其依赖的环境打包成轻量级、可移植的容器。 Docker为什么这么受欢迎呢?原因很简单&#xff1a;Docker可以解决不同环境一致运行的问题&#xff0c;而且占用资源少&#xff0c;速度快。 所以好的东西…

Leetcode—329. 矩阵中的最长递增路径【困难】

2024每日刷题&#xff08;165&#xff09; Leetcode—329. 矩阵中的最长递增路径 dfs dp实现代码 class Solution { public:int longestIncreasingPath(vector<vector<int>>& matrix) {// 9 9 4// 6 6 8// 2 1 1// 1 1 2// 2 2 1// 3 4 2int m …

Three.js 3D人物漫游项目(下)

本文目录 前言最终效果1、效果回顾2、编写人物模型动画执行类并调用2.1 代码2.2 代码解读2.3 实例化动画类并调用2.4 效果2.4.1 休息动画2.4.2 跑步动画2.4.3 走路动画2.4.4 舞蹈1动画2.4.5 舞蹈2动画3、键盘控制动画3.1 站立休息、走、跑、舞蹈1、舞蹈2代码3.1.1 效果3.2 跳跃…

Matlab|基于遗传模拟退火算法的风电功率聚类分析

目录 主要内容 部分代码 结果一览 下载链接 主要内容 模糊C-均值聚类&#xff0c;也称FCM&#xff0c;是比较常用的一种聚类算法&#xff0c;该算法利用几何贴进度的概念将不同数据分配到不同聚类群中&#xff0c;但是作为局部搜索优化算法&#xff0c;初值选择不…

趣味运动会随机分组指南

如何实现男女比例平均分组&#xff1f; 组织趣味运动会时&#xff0c;如何确保男女比例平均且分组公平是一个关键问题。利用云分组小程序&#xff0c;我们可以轻松实现这一目标&#xff0c;让活动更加有趣和公平。 以下是详细的操作步骤&#xff1a;步骤一&#xff1a;创建分组…

生信技能59 - 基于GATK CallingSNP变异检测及注释流程

1. 流程说明 使用BWA MEM比对,如果文件较大,可使用bwa-mem2进行比对,速度会有很大提升;使用GATK对BAM进行排序和标记重复,再使用GATK HaplotypeCaller + GATK GenotypeGVCFs进行变异检测,生产.g.vcf文件,提取SNP并使用annovar进行位点注释。 使用bwa-mem2进行比对,获…

畅阅读微信小程序

畅阅读微信小程序 weixin051畅阅读微信小程序ssm 摘 要 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用j…

MCU自动测量单元采集振弦式应变计测值的过程

振弦式应变计是一种广泛应用于土木工程、地质勘探等领域的高精度传感器&#xff0c;用于测量结构的应变变化。近年来&#xff0c;随着微控制器单元(MCU)的发展&#xff0c;自动化测量技术得到了极大的提升&#xff0c;使得振弦式应变计的测值采集更加高效和精确。本文将详细介绍…

软件测试面试八股文(含文档)

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一般软件测试的面试分为三轮&#xff1a;笔试&#xff0c;HR面试&#xff0c;技术面试。 前两轮&#xff0c;根据不同企业&#xff0c;或有或无&#xff0c;但最…

html+css学习

html 元素 html元素是HTML的根元素&#xff0c;一个文档只能有一个&#xff0c;其他所有元素都是其后代元素 html有一个属性为lang&#xff0c;其作用是&#xff1a; 帮助语言合成工具确定要使用的发音帮助翻译工具确定要使用的翻译规则 当属性lang“en”则表示告诉其浏览器…