linux系统编程 标准io

简介: linux系统编程 标准io

一、标准IO概念

标准IO在系统调用的上一层多加了一个缓冲区,也因此引入了流的概念,在UNIX/Linux下表示为FILE*(并不限于UNIX/Linux,ANSI C都有FILE的概念),FILE实际上包含了为管理流所需要的所有信息:实际I/O的文件描述符,指向流缓存的指针(标准I/O缓存,由malloc分配,又称为用户态进程空间的缓存,区别于内核所设的缓存),缓存长度,当前在缓存中的字节数,出错标志等。标准I/O对每个I/O流自动进行缓存管理,它提供了三种类型的缓存:

  • 全缓存。当填满标准I/O缓存后才执行I/O操作。磁盘上的文件通常是全缓存的。
  • 行缓存。当输入输出遇到新行符或缓存满时,才由标准I/O库执行实际I/O操作。stdin、stdout通常是行缓存的。
  • 无缓存。相当于read、write了。stderr通常是无缓存的,因为它必须尽快输出。

二、行缓存的验证案例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
       printf("hello world!");
       while(1)
       {       
              sleep(1);
       }
       return 0;
}    

以上程序编译后,并不能输出任何信息。原因是使用printf输出hello world后,没有换行符。printf的缓冲是属于行缓冲的,输出遇到新行符或缓冲满时,才执行标准的I/O操作。此程序由于执行到了while中的循环,一直在循环。缓冲没有满,也没遇到换行符。所以屏幕无任何输出。

当去掉while循环,程序输出后立马结束,缓存中的信息就会输出出来。

三、FILE结构体

包含于#include <stdio.h>里,以下仅是FILE结构体部分参数,具体可查看头文件。

缓存的操作如下:

缓存遇到换行符或是return/exit(_exit不行) 或者写满缓存或者调用fclose后的时候,才会输出。

数据先写进缓存,然后再输出到文件或屏幕上。

stdin:标准输入,scanf 类函数就是默认的使用此函数

stdout:标准输出,printf 函数默认使用此

stderr:标准错误

这三个就是FILE 类型结构体指针,也称为流指针

四、函数格式定义

1. fopen()函数 – 用于打开一个文件,返回一个指向该文件的文件指针

#include<stdio.h>
FILE* fopen(const char *filename, const char *mode);
  • 函数描述:fopen 打开一个指定的文件。
  • 参数说明:
filename:指定了被打开的文件的路径(相对路径或绝对路径)
 mode:指定了被打开文件的操作方式,如下:
   “r”:只读
   “w”:只写,并将文件截断为0
   “a”:只写,以追加方式从文件尾开始写
   “r+”:读写
   “w+”:读写,并将文件截断为0
   “a+”:读写,以追加方式从文件尾开始写
  • 函数返回值:
成功:指向FILE的指针
 失败: NULL

2. fdopen()函数 – 把流与一个文件句柄相接

#include<stdio.h>
FILE * fdopen(int fd,  const char * mode);
  • 函数描述:通俗的理解fdopen就是把参数fd的文件描述符转化为文件指针。
  • 参数说明:
fd: 文件描述符
 mode: 文件打开的模式。和fopen中的模式(如r-只读, w-写)相同。
  • 函数返回值:
返回文件指针。

3. freopen()函数 --预定义的标准流文件定向到由path指定的文件中

#include <stdio.h>
FILE *freopen( const char *path, const char *mode, FILE *stream ); 
  • 函数描述:
实现重定向,把预定义的标准流文件定向到由path指定的文件中。标准流文件具体是指stdin、stdout和stderr。
  其中stdin是标准输入流,默认为键盘;stdout是标准输出流,默认为屏幕;stderr是标准错误流,一般把屏幕设为默认。
  • 参数说明:
path: 文件名,用于存储输入输出的自定义文件名。
 mode: 文件打开的模式。和fopen中的模式(如r-只读, w-写)相同。
 stream: 一个文件,通常使用标准流文件。
  • 函数返回值:
成功,则返回一个path所指定文件的指针;失败,返回NULL。

4. fread()函数 – 用于从一个文件流中读取数据

#include<stdio.h>
size_t fread(void *ptr, size_t size, size_t nitems, FILE *stream);
  • 函数描述:
它与底层调用read相似,其作用是从stream读取nitems个长度为size的数据到ptr所指向的缓冲区中。
  • 参数说明:
ptr: 指定从文件流中读取的数据所存放的地方
 size: 指定所读取的每一条记录的大小,单位字节
 items: 指定本次读操作所读取的记录条数
 stream: 指定读取数据的来源—文件流
  • 函数返回值:
fread执行成功时返回实际读取记录的条数。

5. fwrite()函数 – 用于写数据到一个文件流中

#include<stdio.h>
size_t fwrite(void *ptr, size_t size, size_t nitems, FILE *stream);
  • 函数描述:
它与底层调用write相似,其作用是从stream写nitems个长度为size的数据到ptr所指向的缓冲区中。

6. fclosed函数

#include<stdio.h>
int fclose(FILE *stream);
  • 函数描述:
fclose操作将会引起所要关闭的文件流刷新缓冲区的操作,这使得该文件流上的所有读写操作都立刻执行。当程序正常终止时
    (return/exit两个函数可以,_exit不行)会对所有尚未关闭的文件流自动执行fclose操作。
  • 参数说明:
stream: 指定断开数据的来源—文件流
  • 函数返回值:
成功返回0
 失败返回EOF

7. fflush()函数

#include<stdio.h>
int fflush(FILE *stream);
  • 函数描述:
清除一个流,即清除文件缓冲区,当文件以写方式打开时,将缓冲区内容写入文件。也就是说,对于ANSI C规定的是缓冲文件系
    统,函数fflush用于将缓冲区的内容输出到文件中去。
  • 参数说明:
stream: 指定刷新数据的来源—文件流
  • 函数返回值:
如果成功刷新,fflush返回0。指定的流没有缓冲区或者只读打开时也返回0值。
 失败返回EOF指出一个错误。

8. fgetc、getc、getchar – 从指定文件流中读取一个字节的数据

#include<stdio.h>
int fgetc(FILE *stream);
int getc(FILE *stream);
int getchar();
  • 函数描述:
函数fgetc从指定的文件流中读取一个字节的数据,并返回该字节数据的整型值,当读到文件尾或发生错误时返回EOF。getc同
    fgetc,只是它有可能被实现为宏。getchar函数相当于从标准输入读取字节时的fgetc。
  • 参数说明:
stream: 指定获取数据的来源—文件流
  • 函数返回值:
成功返回该字节数据的整型值。
 失败返回EOF指出一个错误。

9. fputc、putc、putchar – 写一个字节数据到指定的文件流

#include<stdio.h>
int fputc(int c, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c);
  • 函数描述:
fputc函数将一个字节写到指定的文件流中,成功时返回返回写入的字节的整型值,失败时返回EOF。putc同fputc,只是有可能
    被实现为宏。putchar相当于向标准输出写一个字节时的fputc。
  • 参数说明:
stream: 指定写入数据的来源—文件流
  • 函数返回值:
成功返回该字节数据的整型值。
 失败返回EOF指出一个错误。

10. fgets、gets – 用于从一个文件流读取一个字符串

#include<stdio.h>
char *fgets(char *s, int n, FILE *stream);
char *gets(char *s);
  • 函数描述:
fgets函数从指定的文件流指针中读取一个字符串,直到遇到换行符或者已经读了n-1个字符或者遇到文件EOF,它会在所读取的
    数据结尾加上一个\0字符,然后放到s指定的位置。
  • 参数说明:
stream: 指定读取数据的来源—文件流
 s: 指定存放所读取的数据的位置
 n: 指定读取数据的最大长度(包括结尾的\0字符)
  • 函数返回值:
成功返回返回指向s的指针
 失败返回NULL
目录
相关文章
|
11天前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
47 3
|
11天前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
36 2
|
21天前
|
Linux 应用服务中间件 Shell
linux系统服务二!
本文详细介绍了Linux系统的启动流程,包括CentOS 7的具体启动步骤,从BIOS自检到加载内核、启动systemd程序等。同时,文章还对比了CentOS 6和CentOS 7的启动流程,分析了启动过程中的耗时情况。接着,文章讲解了Linux的运行级别及其管理命令,systemd的基本概念、优势及常用命令,并提供了自定义systemd启动文件的示例。最后,文章介绍了单用户模式和救援模式的使用方法,包括如何找回忘记的密码和修复启动故障。
42 5
linux系统服务二!
|
5天前
|
Ubuntu Linux 网络安全
linux系统ubuntu中在命令行中打开图形界面的文件夹
在Ubuntu系统中,通过命令行打开图形界面的文件夹是一个高效且实用的操作。无论是使用Nautilus、Dolphin还是Thunar,都可以根据具体桌面环境选择合适的文件管理器。通过上述命令和方法,可以简化日常工作,提高效率。同时,解决权限问题和图形界面问题也能确保操作的顺利进行。掌握这些技巧,可以使Linux操作更加便捷和灵活。
13 3
|
11天前
|
安全 网络协议 Linux
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。通过掌握 ping 命令,读者可以轻松测试网络连通性、诊断网络问题并提升网络管理能力。
42 3
|
14天前
|
安全 Linux 数据安全/隐私保护
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。本文介绍了使用 `ls -l` 和 `stat` 命令查找文件所有者的基本方法,以及通过文件路径、通配符和结合其他命令的高级技巧。还提供了实际案例分析和注意事项,帮助读者更好地掌握这一操作。
34 6
|
14天前
|
Linux
在 Linux 系统中,`find` 命令是一个强大的文件查找工具
在 Linux 系统中,`find` 命令是一个强大的文件查找工具。本文详细介绍了 `find` 命令的基本语法、常用选项和具体应用示例,帮助用户快速掌握如何根据文件名、类型、大小、修改时间等条件查找文件,并展示了如何结合逻辑运算符、正则表达式和排除特定目录等高级用法。
45 6
|
15天前
|
机器学习/深度学习 自然语言处理 Linux
Linux 中的机器学习:Whisper——自动语音识别系统
本文介绍了先进的自动语音识别系统 Whisper 在 Linux 环境中的应用。Whisper 基于深度学习和神经网络技术,支持多语言识别,具有高准确性和实时处理能力。文章详细讲解了在 Linux 中安装、配置和使用 Whisper 的步骤,以及其在语音助手、语音识别软件等领域的应用场景。
47 5
|
15天前
|
缓存 运维 监控
【运维必备知识】Linux系统平均负载与top、uptime命令详解
系统平均负载是衡量Linux服务器性能的关键指标之一。通过使用 `top`和 `uptime`命令,可以实时监控系统的负载情况,帮助运维人员及时发现并解决潜在问题。理解这些工具的输出和意义是确保系统稳定运行的基础。希望本文对Linux系统平均负载及相关命令的详细解析能帮助您更好地进行系统运维和性能优化。
39 3
|
15天前
|
监控 网络协议 算法
Linux内核优化:提升系统性能与稳定性的策略####
本文深入探讨了Linux操作系统内核的优化策略,旨在通过一系列技术手段和最佳实践,显著提升系统的性能、响应速度及稳定性。文章首先概述了Linux内核的核心组件及其在系统中的作用,随后详细阐述了内存管理、进程调度、文件系统优化、网络栈调整及并发控制等关键领域的优化方法。通过实际案例分析,展示了这些优化措施如何有效减少延迟、提高吞吐量,并增强系统的整体健壮性。最终,文章强调了持续监控、定期更新及合理配置对于维持Linux系统长期高效运行的重要性。 ####
下一篇
无影云桌面