您的位置:首页 > 运维架构 > Linux

【IO进程】标准IO

2017-03-27 19:21 127 查看

IO

针对文件来进行操作, 在linux系统当中几乎所有东西被看做是一个文件来处理

文件: 一部分功能就是用来对数据进行存储,常用的文本数据、还有二进制数据

特殊文件是帮助用户站到内存中某一个对象,或者找到对应的设备文件

文件的名字:

类型: bcd-lsp

类型符号作用
常规文件-它用来存储文本数据、还有二进制数据
设备文件bc对硬件来进行操作的文件
目录文件d进入目录,或者在目录文件下创建文件或者子目录
连接文件l为了快速的找到经常操作的应用程序、或者文件
管道文件p就是帮助你找到内核中开辟的那个内存对象,会在你在当前系统下创建一个文件
套接字文件s在网络中,实现不同电脑不同进程之间的数据传输,用桃姐文件找到内核对象,其实就是内核开辟的一块缓冲区

标准IO

概念:

1、什么是标准IO

利用c的标准实现数据的输入和输出操作,可以在不同的系统之间进行数据的传输

2、标准IO操作的对象是谁?

文件指针(流): 没打开或者创建一个文件操作系统会为分配两个跟文件相关的结构体

struct file 还有 struct inode 那个文件指针对应的结构体,会帮你找到

这俩个结构体。用指针指向塔它,方便程序员对文件进行操作。

FILE *  fp;


3、标准IO的特点: 标准IO当中提供了缓冲区

特点:  就减少系统调用(操作系统给用户提供的操作函数),提高对数据的读写效率

形式:
(1)全缓冲,操作的文件                         打开文件之后,获取文件
3个条件:
a)  缓冲区满,则会刷新缓冲区   4096byte
b)  程序正常结束
c)  fflush刷新缓冲区

(2)行缓冲,指针对终端进行操作              -->  stdin  stdout
4个条件:
a) 缓冲区满,则会刷新缓冲区   1024 byte
b) 程序正常结束
c) fflush刷 新缓冲区
d) \n
(3)无缓冲,指针终端进行操作                -->  stderr


注意: 这三个文件指针,在应用启动之后,操作系统已为难你分配好了,可以直接使用

文件操作的一个流程

1、创建或者打开文件

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

功能: 打开或者创建文件

参数:

path 打开或者创建的文件的名字,传递地址进去

(1)直接写文件的名字 “filename”

(2)通过命令行传参,让程序更具灵活性 argv[1]

r    打开文件对文件进行读操作,文件必须存在,从文件开始读取数据
r+    打开文件对文件进行读写操作,文件必须存在,从文件开始读取数据

fopen("filename", "r")  |     fopen("filename", "r+")

w     打开或者创建文件,对文件进行写操作,从文件开始写入数据
w+    打开或者创建文件,对文件进行读写操作,从文件开始读取、写入数据

a    打开或者创建文件,从文件的末尾位置追加写入数据,如果文件不存在,也会创建
文件

a+   打开或者创建文件,从文件的末尾位置读取、追加写入数据,如果文件不存在,也会创建
文件,读取从文件开始、起始位置读取

返回值:

成功  文件指针
失败  NULL

fclose  关闭文件,关闭通过fopen获取的文件指针或者系统分配文件指针


2、对文件进行操作(读、写、文件位置定位操作)

a) 每次读取或者写入单个字符

fgetc / fputc

int fgetc(FILE *stream);

功能: 从文件指针或者系统打开指针stdin中读取数据

参数: stream 通过fopen打开得文件,获取的文件指针 还有stdin

返回值:

成功 读取的字符(强制转换成整形数据,也就是字符对应assic

失败 -1(EOF) 读取文件失败或者出错的情况会给返回-1

int fputc(int c, FILE *stream);
功能: 往文件,fopen获取过来的文件指针或者终端  stdout 写入数据
参数:
c  要写入的字符数据
返回值:
成功  写入的字符
失败  EOF

int fprintf(FILE *stream, const char *format, ...);
跟prinf的功能相似,只不过需要指定第一个参数,输出的位置是那个地方
stdout(终端)或者 文件指针(文件)

b) 每次读取一行数据
fgets    fputs

char *fgets(char *s, int size, FILE *stream);
功能:从文件指针中读取数据
参数:
s   指向用户开辟的缓冲区,实现定义一个数组
size  用于要求读取的字节个数
注意:
1、当要求的字节数小于文件中一行的个数的时候,回读取size - 1个,
并且最后一个字符用\0代替
2、当要求的字节数大于一行的个数会把\n读取进来
stream  打开得文件
返回值:
成功  读取的字符串
失败  NULL

int fputs(const char *s, FILE *stream);
功能:输出数据到指定的文件中
参数:
s   指向要被读取数据的缓冲区
输出 \n  但是不输出  \0

stream   文件指针
c)二进制数据的输入输出

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:  从文件指针读取数据
参数:
ptr   事先定义变量,但是需要传递变量地址给ptr
size  每一个对象的大小是多少?
nmemb  对象的个数是多少?
stream   文件指针,你所打开得文件
返回值:
成功  返回实际读取的对象个数,当对象个数最后不满足一个时,
对象个数少一个
做判断时:  判断最后是否大于0

size_t fwrite(const void *ptr, size_t size, size_t nmemb,
FILE *stream);

功能:  往文件指针写入数据
参数:
ptr   事先定义变量,但是需要传递变量地址给ptr
size  每一个对象的大小是多少?
nmemb  对象的个数是多少?
stream   文件指针,你所打开得文件
返回值:
成功  返回实际写入的对象个数,当对象个数最后不满足一个时,
对象个数少一个
做判断时:  判断最后是否大于0

注意:虽然最后读取数据时,对象个数不满足返回,但是会把字节个数读取进数组中

【文件位置定位函数】

int fseek(FILE *stream, long offset, int whence);
功能:用来实现文件的位置定位
参数:
whence   基准点
SEEK_SET   文件开头位置
SEEK_CUR   文件当前位置
SEEK_END   文件末尾位置

offset   是用来设置偏移量,正数是往文件的末尾位置移动多少个字节
负数是往文件的开头位置移动多少个字节
0  表示不移动

fseek(fp_r, 5, SEEK_SET);   从文件开始位置往后移动5个字节
fseek(fp_r, 0, SEEK_SET);

fseek(fp_r, 5, SEEK_CUR);
fseek(fp_r, -5, SEEK_CUR);
fseek(fp_r, 0, SEEK_CUR);

fseek(fp_r, 5, SEEK_END);
fseek(fp_r, -5, SEEK_END);
fseek(fp_r, 0, SEEK_END);

long ftell(FILE *stream);
返回当前文件位置指针的位置是在那个地址,使用数字的形式表示

void rewind(FILE *stream);
把文件位置指针拉回到开头位置
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Linux C IO 进程 标准IO