标准IO概述与操作

标准IO介绍

标准io(input/output)就是标准接口的意思

1、文件的概念和类型(了解)
文件基础
概念:
一组相关数据的有序集合
文件类型:
常规文件 r
目标文件 d
管道文件 p
块设备文件 b
套接字文件 s
字符设备文件 c
符号链接文件 l

2、如何理解标准IO(了解)
标准I/O由ANSI C标准定义
主流操作系统上都实现了C库
标准I/O通过缓冲机制减少系统调用,实现更高的效率

在这里插入图片描述

3、流(FILE)的含义(了解)
FILE
标准IO用一个结构体类型来存放打开的文件的相关信息
标准I/O的所有操作都是围绕FILE来进行

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

在这里插入图片描述

4、流的缓冲类型(熟练)
在这里插入图片描述

缓冲区实验

//不输出
#include <stdio.h>
#include <unistd.h>
int main(int argc,char*argv[]){
 printf("hello world");

    while(1){
	sleep(1);
    }

}
//行缓冲输出,加了换行符 /n
#include <stdio.h>
#include <unistd.h>
int main(int argc,char*argv[]){

    printf("hello world\n");

    while(1){
	sleep(1);
    }
}
//全缓冲输出,缓冲区1024满
#include <stdio.h>
#include <unistd.h>
int main(int argc,char*argv[]){
    int i=0;
    for(i=0;i<1025;i++){
       printf("a");
    }
    while(1){
	sleep(1);
    }

}

文件的打开和关闭概念

打开就是占用资源
关闭就是释放资源
*文件的打开和关闭需要熟练操作

文件的打开代码实现

文件的打开函数(该函数是一个库函数)

FILE *fopen (const char *path, const char *mode);

Path: 普通文件当前路径不需要加目录,其他要使用完整的路径
Mode:
返回值:出错返回NULL,所以使用fopen函数必须判断是否为空

文件打开的模式(非常重要)
在这里插入图片描述
编译错误:

f_open.c:9:38: error: ‘errno’ undeclared (first use in this function)
         printf("fopen:%s\n",strerror(errno));  
//error: ‘errno’ undeclared  表示errno变量没有定义

解决方法:如果是系统变量用include 头文件,如果是你自己的,自己手动定义。

f_open.c:10:29: warning: implicit declaration of function ‘strerror’ [-Wimplicit-function-declaration]
         printf("fopen:%s\n",strerror(errno));

//warning: implicit declaration of function ‘strerror’  表示strerror函数隐示的声明

解决方法:include 添加对应的头文件。
perror 库函数 头文件stdio.h
strerror 库函数 头文件 errno.h string.h
perror和strerror 功能:打印系统的错误描述(注意:是系统错误,不是你自己代码错误)

文件的关闭

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

标准IO的读写

标准IO的字符输入和输出
按字符输入输出(熟练)

字符的输入(读单个字符):
int  fgetc(FILE *stream);
 int  getc(FILE *stream);   //宏
 int  getchar(void);
//成功时返回读取的字符;若到文件末尾或出错时返回EOF(-1),
//getchar()等同于fgetc(stdin)
//getc和fgetc区别是一个是宏一个是函数

注意事项:
1函数返回值是int类型不是char类型,主要是为了扩展返回值的范围。
2 tdin 也是FILE *的指针,是系统定义好的,指向的是标准输入(键盘输入)
3 打开文件后读取,是从文件开头开始读。读完一个后读写指针会后移。读写注意文件位置!
4 调用getchar会阻塞,等待你的键盘输入

//字符的输出(写单个字符):
int  fputc(int c, FILE *stream);
int  putc(int c, FILE *stream);
int  putchar(int c);

//成功时返回写入的字符;出错时返回EOF
putchar(c)等同于fputc(c, stdout)

注意事项:
1返回和输入参数都是int类型
2遇到这种错误:Bad file descriptor, 很可能是文件打开的模式错误(只读模式去写,只写模式去读)

//行输入(读取整个行)
char  *gets(char *s);  //读取标准输入到缓冲区s
char *fgets(char *s, int size, FILE *stream);

//成功时返回s,到文件末尾或出错时返回NULL
//遇到’\n’或已输入size-1个字符时返回,总是包含’\0’

注意事项:
1 gets函数已经被淘汰,因为会导致缓冲区溢出
2 fgets 函数第二个参数,输入的数据超出size,size-1个字符会保存到缓冲区,最后添加’\0’,如果输入数据少于size-1 后面会添加换行符。

//行输出(写整行)

int  puts(const char *s);
int fputs(const char *s,  FILE *stream);

//成功时返回非负整数;出错时返回EOF
//puts将缓冲区s中的字符串输出到stdout,并追加’\n’
//fputs将缓冲区s中的字符串输出到stream,不追加  ‘\n’

二进制读写

文本文件和二进制的区别:
存储的格式不同:文本文件只能存储文本。

计算机内码概念:文本符号在计算机内部的编码(计算机内部只能存储数字0101001…,所以所有符号都要编码)

//二进制读写函数格式:
size_t fread(void *ptr, size_t size, size_t n, FILE *fp);
void *ptr  //读取内容放的位置指针
  size_t size //读取的块大小
size_t n //读取的个数
  FILE *fp  //读取的文件指针

size_t fwrite(const void *ptr, size_t size, size_t n, FILE *fp);
void *ptr  //写文件的内容的位置指针
size_t size //写的块大小
size_t n //写的个数
  FILE *fp  //要写的文件指针

注意事项:
文件写完后,文件指针指向文件末尾,如果这时候读,读不出来内容。
解决办法:移动指针到文件头;关闭文件,重新打开

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值