【Linux】应用篇一--标准IO

一、文件的概念与类型

1、文件的概念

一组相关数据有序集合


2、文件的类型

  • 常规文件 r
  • 目录文件 d
  • 字符设备文件 c
  • 块设备文件 b
  • 管道文件 p(了解)
  • 套接字文件 s(了解)
  • 符号链接文件 l

二、标准I/O的介绍

1、标准I/O – 介绍

I input    输入设备  比如键盘鼠标都是Input设备
O output   输出设备  比如显示器
优盘,网口,既是输入也是输出

标准I/OANSI C标准定义

主流操作系统上都实现了C库

标准I/O通过缓冲机制减少系统调用,实现更高的效率

我们C语言经常使用的stdio.h就是标准的I/O文件。


2、系统调用和库函数

系统调用就是操作系统提供的接口函数.
如果我们把系统调用封装成库函数就可以起到隔离的作用,提供程序的可移植性。
Printf就是库函数然后调用了系统调用才在显示器上显示字符。
在这里插入图片描述


3、标准I/O – 流

FILE

  • 标准IO(stdio.h)用一个结构体类型来存放打开的文件的相关信息
  • 标准I/O所有操作都是围绕结构体FILE来进行

流(stream)

  • FILE又被称为(stream)
  • 文本流/二进制流

4、Windows 和linux的换行符区别

Windows

 二进制流:   换行符是‘\n’ 
  文本流:   换行符是‘\r’ ‘\n’-回车加换行

Linux

        换行符只有‘\n’

5、标准I/O – 缓冲概念与类型

系统调用就是操作系统提供的接口函数

  • 全缓冲
    缓冲区满才输出

  • 行缓冲
    遇到换行符输出

  • 无缓冲
    数据直接写入文件,流不进行缓冲

三种标准IO :
在这里插入图片描述

标准I/O预定义3个流,程序运行时自动打开
stdin/stdout 默认是行缓冲
stderr没有缓冲

例如:

/*
 * @Author: 修成真
 * @Date: 2021-10-13 10:04:31
 * @LastEditTime: 2022-03-15 11:40:54
 */
#include <stdio.h>
#include <unistd.h>  //Sleep函数所在的头文件
int main(int argc,const char *argv[])
{
    int i;
    /*这里的数是我虚拟机的缓存大小,1024也就是1k个字节,
    打印1个字节的字符a时,由于没有遇到换行符,打印的字符
    不断存入缓存区,因此循环数小于1024时,字符无法打印,
    大于1024时,缓存区满,自动打印出1024个a*/
    for(i = 0; i < 1025; i++)  
    {
       printf("a");
    }
    /*加入循环是为了不让程序结束,因为程序结束会自动把缓存区的
    数据打印出来*/
    while(1)
    {
	    sleep(1);  //Sleep函数:是释放cpu给其他应用程序使用的库
    }

}

三、文件的打开与关闭

1、文件的打开和关闭概念

打开就是占用文件资源

关闭就是释放文件资源


2、文件的打开

文件的打开函数

FILE *fopen (const char *path, const char *mode);
  • Path:
    普通文件当前路径下不需要加目录,其他要加上完整的路径与文件名
  • Mode
    返回值:出错返回NULL,所以使用fopen函数必须判断是否为空

文件打开的模式-mode(非常重要)
在这里插入图片描述
在这里插入图片描述

打印文件出错的函数
当使用fopen打不文件时,可以使用perror函数strerror库函数打印错误信息

  • perror库函数 头文件stdio.h
  • strerror库函数 头文件 errno.h string.h

3、文件的关闭

文件的打开函数:

int fclose(FILE *stream)
  • fclose()调用成功返回0失败返回EOF(-1),并设置errno
  • 流关闭时自动刷新缓冲中的数据并释放缓冲区,比如:常规文件把缓冲区内容写入磁盘
  • 当一个程序正常终止时,所有打开的流都会被关闭
  • fclose()函数的入参stream必须保证为非空,否则出现断错误

文件打开与关闭的程序案例:

#include<stdio.h>
#include<string.h>
#include<errno.h>  //使用errno需要的头文件

int main(int argc, const char *argv[])
{
	FILE *p = fopen("1.txt", "r+");  
	int q;
	if(p == NULL)
	{
		//printf("open file fail!\n");   //用户自己打印错误信息
		//perror("fopen:");  //perror的使用,先打印字符串,在打印错误信息
		/*strerror的使用,errno为错误序号,不加头文件会报错*/
		printf("fopen:%s\n", strerror(errno));  
	}
	else
	{
		//printf("open file success!\n");  //用户自己打印错误信息
		perror("fopen:");
		q = fclose(p);
		if(q == 0)
			printf("file close succes!\n");
		else
		{
			printf("fopen:%s\n", strerror(errno));
		}
	}
	return 0;
}

到这里就结束啦!
在这里插入图片描述

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

修成真

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

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

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

打赏作者

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

抵扣说明:

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

余额充值