思维导图:
一.io的作用
io是实现对文件的操作,把运行结果存到文件中,读取文件的数据,方便后期查询。
二.io的概念
io是指系统 和外部设备或用户之间的数据交互
I:input 表示数据从外部设备输入到内存中;
O:output表示数据从内存中输出到外部设备的过程。
三.io的分类
io分为文件io和标准io;
标准io:指程序和用户之间的数据交互,标准io=文件io+缓冲区
文件io:指程序和系统之间的数据交互
四.文件io和标准io的区别
标准io:
- 满足ANS的标准,当编译程序后,可以在不同的编译环境下执行
- 存在缓冲区,加快访问速度
- 可移植性强,可以在不同的编译环境下执行
- 属于库函数调用,只可以访问普通文件
- 标准io操作文件时需要依赖于流指针(FILE*)
文件io
- 满足POIX标准,只可以在unix操作系统中使用
- 不存在缓冲区,访问速度慢
- 不可移植,系统调用,依赖系统
- 属于系统函数调用,可以访问特殊文件(连接文件,设备文件,管道文件)
- 文件io操作系统时需要依赖文件描述符
五.标准io函数
1.流和流指针
-
流:数据一个一个移入或移出缓冲区的过程,称为字节流
-
流指针FILE*: 本质FILE是一个结构体的别名,当存储./a.out的运行结果,需要创建一个文件,每常见一个文件则会在用户空间申请一片缓冲区。缓冲区存在一些信息(缓冲区的首地址,缓冲区的结束地址等)存在流指针
-
注意FILE默认已经存在的,程序员直接使用即可
2.查看流指针
- 1.查看数据类型 vi -t 类型 ----》vi -t FILE
- 2.追代码 ctrl ] (右中括号)
- 3.返回 ctrl t
3.标准io函数
-
1.fopen-------->文件操作:打开,读取,写入,关闭。
r 以读的方式打开文件,流指针指向文件的起始地址,如果文件存在则打开成功,不存在则打开失败
r+ 以读写的方式打开文件. ,流指针指向文件的起始地址,如果文件存在则打开成功,不存在则打开失败
w 以写的方式打开文件,如果文件不存在则创建文件,如果文件存在则清空文件
w+ 以读写的方式打开文件,如果文件不存在则创建文件,如果文件存在则清空文件
a 以追加的方式打开文件(写入到文件的结尾)如果文件不存在则创建文件,如果文件存在则流指针指向文件的结尾
a+ 以读写(追加)的方式打开文件(写入到文件的结尾)如果文件不存在则创建文件,如果文件存在则流指针指向文件的结尾
-
2.strerror\perror---------功能:根据错误码,返回一个错误码对应的信息
streeor只返回错误信息,没有详细信息,perror 返回错误信息的同时会给一个提示语句
perror截图:
3.fgetc\fputc
fputc:输出的函数,对于文件,就是写入的意思
fgetc:输入的函数,对于文件,读取的意思
4.fclose
功能:关闭文件
5.fseek\rewind\ftell
fseek:功能:设置指针的偏移量(设置光标的位置)
#include <stdio.h>
int fseek(FILE *stream, long offset, int whence);
参数:
stream: 流指针,就是fopen的fp
offset: 指针的偏移量,
如果offset>0 ,指针向后偏移
如果offset<0 指针向前偏移
offset=0 指针不偏移
whence:
SEEK_SET 把光标设置在起始位置
SEEK_CUR 把光标设置在当前位置
SEEK_END 把光标设置在结尾位置
rewind:把光标设置在起始位置
void rewind(FILE *stream);
ftell:获取当前指针到起始地址之间的文件大小
1.把光标设置在文件的结尾 fseek(fp,0,SEEK_END);
2.获取文件大小 long size=ftell(fp)
6.fputs\fgets
fputs:功能:从文件流指针中写入字符串
格式: int fputs(const char *s, FILE *stream);
fgets:功能:从文件流指针中读取字符串
格式: char *fgets(char *s, int size, FILE *stream);
size: 只可以获取小于size个字符,最多存储size-1
六、练习
- 使用标准IO函数,实现文件的拷贝
#include <head1.h> int main(int argc, const char *argv[]) { FILE *fp=fopen("IO.text","r"); if(NULL==fp) { PRINT_ERROR("fopen"); } FILE* fp1=fopen("IO.1text","w"); //读取文件,然后写入 while(1 ) { char ch=(fgetc(fp)); if(EOF==ch){break;} fputc(ch,fp1); } fclose(fp); fclose(fp1); return 0; }
-
使用fgets函数,打印一个文件,类似cat
#include <head1.h> 2 int main(int argc, const char *argv[]) 3 { 4 //打开文件 5 FILE* fp=fopen("./IO.1text","r"); 6 if(NULL==fp) 7 { 8 PRINT_ERROR("fopen"); 9 } 10 11 //读取数据 12 while(1) 13 { 14 int res=fgetc(fp); 15 if(EOF==res) 16 { 17 // printf("读取失败"); 18 // return -1; 19 break; 20 } 21 printf("%c",res); 22 } 23 /* int res; 24 while((res=fgetc(fp)) != EOF) 25 { 26 printf("%c",res); 27 } 28 */ 29 //关闭文件 30 if(fclose(fp)==EOF) 31 PRINT_ERROR("fopen"); 32 33 return 0; 34 }
-
计算文件的行数
#include <head1.h>
int main(int argc, const char *argv[])
{
//打开文件
FILE* fp=fopen("IO.text","r+");
if(NULL==fp)
{
PRINT_ERROR("fopen error");
}
int count=0;
//循环读取,遇到回车计算行数
while(1)
{
char ch =fgetc(fp);
if(ch==EOF){break;}
if(ch==10){count++;}
}
printf("这个文件有%d行\n",count);
fclose(fp);
return 0;
}