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完成应用程序的功能和逻辑
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芯片烧毁大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值