IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Linux下C的标准I/O和文本I/O -> 正文阅读

[系统运维]Linux下C的标准I/O和文本I/O

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

LINUXC语言标准IO 文本IO


前言

这阵子学习了标准IO和文本IO,大家分享一下


提示:以下是本篇文章正文内容,下面案例可供参考

一、文本IO

  1. 文件io库 相应:<sys/types.h> <sys/stat.h> <fcntl.h> <unistd.h>
    1. 对文件输入输出的操作,就是对文件的读写

    2. 无缓存区

    3. 四个重要函数 open() read() write() close(),正常生成执行文件。

    4. 文件描述符,open函数会有一个int 型返回值,这个返回值就是 文件描述符。例如课件中的fd1 ,执行成功下会有一个非负整数返回。对于linux所有打开的文件都需要通过文件描述符进行索引。

    5. linux ulimit -n 可以看进程可打开的最大文件数(默认1024个):在Linux系统中一个进程打开的文件是有限的,打开的文件越多内存资源损害越大,对系统影响越严重。

    6. 调用 open 函数打开文件的时候,分配的文件描述符一般都是从 3 开始,0、1、2 这三个文件描述符已经默认被系统占用,分别分配给
      系统标准输入(0) 一般是键盘,理解,0打开键盘对应的设备文件所得的文件描述符
      标准输出(1)lcd显示器
      标准错误(2)lcd显示器 它们三个的宏定义在<unistd.h>中

    7. lseek 读写偏移量
      读写偏移量用于指示 read()或 write()函数操作时文件的起始位置,会以相对于文件头部的位置偏移量来表示,文件第一个字节数据的位置偏移量为 0。
      当打开文件时,会将读写偏移量设置为指向文件开始位置处,以后每次调用 read()、write()将自动对其进行调整,以指向已读或已写数据后的下一字节,因此,连续的调用 read()和 write()函数将使得读写按顺序递增,对文件进行操作。我们先来看看 lseek 函数的原型,如下所示(可通过"man 2 lseek"查看):
      #include <sys/types.h>
      #include <unistd.h>

      off_t lseek(int fd, off_t offset, int whence);
      首先调用 lseek 函数需要包含<sys/types.h>和<unistd.h>两个头文件。
      函数参数和返回值含义如下:
      fd:文件描述符。
      offset:偏移量,以字节为单位。
      whence:用于定义参数 offset 偏移量对应的参考值,该参数为下列其中一种(宏定义):
      SEEK_SET:读写偏移量将指向 offset 字节位置处(从文件头部开始算);
      SEEK_CUR:读写偏移量将指向当前位置偏移量 + offset 字节位置处,offset 可以为正、也可以为负,如果是正数表示往后偏移,如果是负数则表示往前偏移;
      SEEK_END:读写偏移量将指向文件末尾 + offset 字节位置处,同样 offset 可以为正、也可以为负,如果是正数表示往后偏移、如果是负数则表示往前偏移。
      **返回值:**成功将返回从文件头部开始算起的位置偏移量(字节为单位),也就是当前的读写位置;发生错误将返回-1。
      使用示例:
      将读写位置移动到文件开头处:
      off_t off = lseek(fd, 0, SEEK_SET);
      if (-1 == off)
      return -1;
      将读写位置移动到文件末尾:
      off_t off = lseek(fd, 0, SEEK_END);

      if (-1 == off)
      return -1;
      将读写位置移动到偏移文件开头 100 个字节处:
      off_t off = lseek(fd, 100, SEEK_SET);

      if (-1 == off)
      return -1;
      获取当前读写位置偏移量:
      off_t off = lseek(fd, 0, SEEK_CUR);
      if (-1 == off)
      return -1;
      函数执行成功将返回文件当前读写位置

二、标准IO

标准io库 相应:<stdio.h>
1. 库函数 fopen fread fclose fwrite。均是以利用系统调用相应的open等执行操作
2. 标准 I/O 和文件 I/O 都是 C 语言函数,但是标准 I/O 是标准 C 库函数,而文件 I/O 则是 Linux系统调用;标准 I/O 是由文件 I/O 封装而来,标准 I/O 内部实际上是调用文件 I/O 来完成实际操作的;
3. 可移植性:标准 I/O 相比于文件 I/O 具有更好的可移植性,由于很多操作系统都实现了标准 I/O 库,标准 I/O 库在不同的操作系统之间其接口定义几乎是一样。
4. 标准I/O带有stdio缓存区,文件io无缓存区,性能效率更高。
5. 标准io的是 FILE指针,不是文字描述符,FILE指针是一个结构体数据类型,围绕 FILE 指针进行,使用标准 I/O 库函数打开或创建一个文件,会返回一个指向 FILE 类型对象的指针(FILE *),使用该 FILE 指针与被打开或创建的文件相关联,然后该 FILE 指针就用于后续的标准 I/O 操作(使用标准 I/O 库函数进行 I/O 操作),FILE 指针的作用相当于文件描述符,只不过 FILE 指针用于标准 I/O 库函数中、而文件描述符则用于文件I/O 系统调用中。它包含标准 I/O 库函数为管理文件所需要的所有信息,包括用于实际 I/O 的文件描述符、指向文件缓冲区的指针、缓冲区的长度、当前缓冲区中的字节数以及出错标志等。
6. FILE数据结构定义在标准 I/O 库函数头文件 stdio.h 中。0、1、2 这三个是文件描述符,只能用于文件 I/O(read()、write()等),那么在标准 I/O 中,自然是无法使用文件描述符来对文件进行 I/O 操作的,它们需要围绕 FILE 类型指针来进行,在 stdio.h 头文件中有相应的定义。
7. 在stdio,h头文件中,struct _IO_FILE 结构体就是 FILE 结构体,使用了 typedef 进行了重命名。所以,在标准 I/O 中,可以使用 stdin、stdout、stderr 来表示标准输入、标准输出和标准错误。
8. fseek 读写位置偏移量 :库函数 fseek()的作用类似于 系统调用 lseek(),用于设置文件读写位置偏移量,lseek()用于文件 I/O,而库函数 fseek()则用于标准 I/O,其函数原型如下所示:
#include <stdio.h>
int fseek(FILE *stream, long offset, int whence);
函数参数和返回值含义如下:
stream:FILE 指针。
offset:与 lseek()函数的 offset 参数意义相同。
whence:与 lseek()函数的 whence 参数意义相同。
返回值:成功返回 0;发生错误将返回-1,并且会设置 errno 以指示错误原因;与 lseek()函数的返回值意义不同,这里要注意!
调用库函数 fread()、fwrite()读写文件时,文件的读写位置偏移量会自动递增,使用 fseek()可手动设置文件当前的读写位置偏移量。
3. 标准库函数有了缓存,更快有效率,相比于系统调用。而且标准库函数是在系统调用的基础上封装


总结

  1. Linux的根目录是 / ,按照路径。而windows是按照物理分区,cde盘

  2. 由内到外 硬件 内核 系统调用 系统app 其中shell从系统app 过系统调用到内核外

  3. 文件IO基础

    1. open(),read(),write(), close() 是文件指令,属于系统调用层。
    2. windows下和Linux下 / \ 相反
  4. open 一般都是从3开始,012都把被 占用

    1. 标准输入0 stdin
    2. 标准输出1 stdout
    3. 标准错误2 stderr它们 三个的宏定义都在unistd。h中
  5. 什么是系统调用?为什么用标准IO?

    1.系统调用是Linux内核给应用层 的应用编程接口(API),是Linux应用层进入内核的入口,当然内核中最终是硬件。 所以操作系统都会向应用层提供系统调用,应用程序通过API来使用操作系统提供的各种服务。
    

    2.简单的说就是 系统调用api是应用层和内核的一个桥梁,如果没有API就不能使用操作系统

5.裸机编程,Linux应用编程 Linux驱动编程

  1.裸机编程就是没有操作系统支持的编程环境,例如单片机

   2.Linux应用编程 是之基于linux操作系统的应用逻辑,在应用程序中通过调用系统     调用APi完成应用程序的功能和逻辑
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 11:56:35  更:2022-09-13 11:59:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 18:31:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计