标准I/O

在linux中一切皆文件,怎么样才能归纳好文件?怎么样才能使用好文件呢?我们先来认识一下文件;

文件:一组相关数据的有序集合;

文件类型:

1.常规文件 r 

2.目录文件 d

3.字符设备文件 c

4.块设备文件 b 

5.管道文件 p 

6.套接字文件 s 

7.符号链接文件 i           

      

标准I/O是指的是ANSIC中定义用于I/O操作的一系列函数。

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

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

一.流-----FILE

标准I/O用一个结构体类型来存放打开的文件的相关信息

标准I/O的所有操作都是围绕FILE来进行的

流-----(stream)

其中有文本流和二进制流

标准I/O-------stdin、stdout、stderr

标准输入流--stdin0STDIN_FILENO
标准输出流--stdout1STDOUT_FILENO
标准错误流--stderr2STDERR_FILENO

流的缓冲类型:

无缓冲:直接写入文件,流不进行缓冲(stderr是不带缓冲的)

行缓冲:当在输入和输出中遇到换行符(\n)时,进行I/O操作(stdin、stdout就是典型例子)

全缓冲:当流的缓冲区无数据或无空间时才执行实际的I/O操作 最大空间为 1K=1024byte=8192bit

二.流的打开

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

成功返回流,失败返回NULL;

path:普通文件当前路径不需要加目录,其他要使用完整的路径

mode:(b二进制文本)

“r” 或 “rb”

以只读方式打开文件,文件必须存在

“r+” 或 ”r+b”

以读写的方式打开文件,文件必须存在

“w” 或 “wb”

以只写的方式打开文件,若文件存在则文件长度清零。若文件不存在则创建

“w+” 或 “w+b”

以读写的方式打开文件,其余与W同

“a” 或 “ab”

只以写的方式打开文件,若文件不存在就创建,向文件写入的数被迫加到文件的末尾

“a+” 或 “a+b”

以读写的方式打开文件, 其余与a相同

三.流的关闭

int fclose(FILE* stream)

成功返回0,失败返回EOF(-1),并设置errno

流关闭时,自动刷新缓冲中的数据并释放缓冲区,比如:常规文件把缓冲区内容写入磁盘。

当一个程序正常终止时,所有打开的流都会关闭。

四.标准I/O的读写

输入函数

按字符输入一个字符

int fgetc(FILE*stream)

int getc(FILE*stream)
int getchar(void);

成功时返回读取的字符;若到文件末尾或出错返回EOF(-1);

getchar()fgetc(stdin)-------读取键盘的输入;

注意事项

1函数返回值是int类型不是char类型,主要是为了扩展返回值的范围。

2 stdin 也是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)
char * fgets(char *s,int size,FILE *stream)

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

注意事项:

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’

二进制读写

文本文件和二进制的区别:

存储格式不同,文本文件只能存储文本。

计算机内码概念:文本符号在计算机内部的编码(计算机内存只能存储数字 二进制)

二进制的读函数

size_t fread(const void * ptr,size_t size,size_t n ,FILE * fp)

void *ptr  读取内容放的位置指针

size_ size 读的块大小

size_t n读取的个数

FILE * fp 读取的文件指针

二进制写函数

size_t fwrite(const void * ptr,size_t size,size_t n ,FILE * fp)

void *ptr  写文件的内容的位置指针

size_ size 写的块大小

size_t n 写的个数

FILE * fp 要写的文件指针

注意事项:

文件写完后,文件指针指向文件末尾,如果这时候读,读不出来内容。

解决办法:移动指针(后面讲解)到文件头;关闭文件,重新打开

我们不可能一直关闭文件重新打开文件来实现我们的功能,我们要怎么更好的处理呢?

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值