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

LINUXC语言标准IO 文本IO

  • 前言
  • 一、文本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完成应用程序的功能和逻辑

Linux下C的标准I/O和文本I/O相关推荐

  1. Linux下命令行(二)之文本处理基础

    系统管理员工作过程中,总会遇到小的.琐碎的.各种各样的文本处理问题,如果对文本处理不熟,每一次都要查很多的资料去解决这样的小问题,那么系统管理员的工作效率从何而来.因此如何快速写出简短有效的针对特定问 ...

  2. (转)Linux下C++开发初探

    1.开发工具 Windows下,开发工具多以集成开发环境IDE的形式展现给最终用户.例如,VS2008集成了编辑器,宏汇编ml,C /C++编译器cl,资源编译器rc,调试器,文档生成工具, nmak ...

  3. linux下C\C++ 开发小笔记

    1.linux下C的标准库中没有提供itoa.itof等,但可以使用sprintf或snprintf来代替, 例如: int iNum = 123456; char tmpBuf[256]; itoa ...

  4. 2.Linux下程序代码的编译

    一.编译工具 前言 1)编译器和目标程序运行在相同架构的编译过程,被称为本地编译. 2)编译器和目标程序运行在不同架构的编译过程,被称为交叉编译. 为什么需要交叉编译?因为编译过程往往需要很大的算力和 ...

  5. 在Linux下运行C语言程序

    市面上常见的Linux都是发行版本,典型的Linux发行版包含了Linux内核.桌面环境和各种常用的必备工具,国内使用较多的是Ubuntu(乌班图).CentOS.Fedora. 我以Fedora 2 ...

  6. Linux下glibc库说明一

    一.glibc库的说明: 1. glibc库介绍: glibc是GNU发布的libc库,即C运行库.glibc是Linux系统中最底层的API,几乎其它任何运行库都会依赖于glibc.glibc除了封 ...

  7. 怎么用centos7运行c语言程序_在Linux下运行C语言程序

    市面上常见的Linux都是发行版本,典型的Linux发行版包含了Linux内核.桌面环境和各种常用的必备工具,国内使用较多的是Ubuntu(乌班图).CentOS.Fedora. 我以Fedora 2 ...

  8. c语言在linux下运行程序设计,如何在Linux下运行C语言程序

    如何在Linux下运行C语言程序 C语言是一个有结构化程序设计.具有变量作用域(variable scope)以及递归功能的过程式语言.以下是小编为大家搜索整理的如何在Linux下运行C语言程序,希望 ...

  9. deepin终端编译c程序_大神支招 如何在Linux下运行C语言程序

    刚入门学习C语言程序的小伙伴比较常遇到的其中一个问题是:如何在Linux下运行C语言程序.今天针对这个热门问题,小编为大家准备了详细的教程! 小编先给大家普及一些关于C语言程序的基本常识:首先大家要清 ...

最新文章

  1. Facebook 万字长文:AI 模型全部迁移至 PyTorch 框架
  2. .net 导出excel_java导出excel(easypoi)
  3. Java多线程Socket在控制台输出的多人聊天室编程
  4. Java对C语言Dll的加载 和 回调函数的使用
  5. 容器化之后如何节省云端成本?(二十七)
  6. inner join 和join的区别_left join、right join和join ???
  7. 如何用python创建文件_如何使用Python创建新的文本文件
  8. Python可以这样学(第九季 机器学习案例与实战)-董付国-专题视频课程
  9. 网站建设对于哪些刚起步的企业是有必要的
  10. Junit4中的新断言assertThat的使用方法
  11. Graph-Bert:没有我Attention解决不了的
  12. 显示器尺寸对照表_电脑显示器尺寸对照表一览,教你怎么选择最适合自己的显示器尺寸...
  13. 【汤家凤考研数学手稿】第五章 定积分【重点】
  14. git远程分支强制覆盖本地分支
  15. 木兰在线英语词典 -- 溯源拆分记单词
  16. 计算机网络---网络体系结构分析
  17. AMD R7 5800H安装mac os big sur 11.6
  18. diagnostic
  19. jsp 上传转码_Java实现视频网站的视频上传、视频转码、视频关键帧抽图, 及视频播放功能...
  20. 企业如何解决被“薅羊毛”?

热门文章

  1. EXE4J 使用教程
  2. 死性不改!2015年全球最差密码还是它
  3. gcc和arm-linux-gcc是什么关系?区别是什么?
  4. C++每日一练11-独一无二的出现次数
  5. android 服务开机启动慢,如何解决Android程序启动慢的问题
  6. PLSQL Developer 12 汉化包下载
  7. Python 远古方法 % 占位符详解
  8. 深入剖析TikTok零播放问题,并附解决方案
  9. Java 5种方法实现生产者消费者问题与2种方法实现读者写者问题
  10. 2345一个推广软件的上市公司