IO:输入输出
操作对象:文件
Linux系统一切皆是文件:
文件分类:
1.block b 块设备文件 按块扫描设备信息的文件
2.char c 字符设备文件 按字符扫描设备信息的文件
3.directory d 目录文件 保存或管理文件
4. - 普通文件 保存数据信息的文件(代码、图片、音视频、压缩包等)
5.link l 链接文件 指向其他文件的文件
6.socket s 套接字文件 用于进程间通信
7.pipe p 管道文件 用于进程间通信
1.标准IO
stdio.h
主要操作普通文件
1.打开文件
2.读写文件
3.关闭文件
2.特殊的流
stdin 标准输入流 行缓存
stdout 标准输出流 行缓存
stderr 标准错误流 不缓存gets、getchar、scanf是基于stdin实现的
puts、putchar、printf是基于stdout实现的
perror是基于stderr
3.缓存
1.全缓存 4096 4k
缓存区满刷新
与文件建立的缓存一般为全缓存刷新条件:
1.缓存区存满了刷新
2.fflush函数接口刷新
3.关闭流时会刷新
2.行缓存 1024 1k
遇到\n刷新
与终端建立的缓存都是行缓存
刷新条件:
1.缓存区满刷新
2.遇到\n刷新
3.fflush函数刷新
4.关闭流时会刷新
3.不缓存 0 0k
立即刷新
刷新条件:
1.立即刷新1.对设备的操作不允许缓存
2.通信不允许缓存
3.出错处理不缓存
4.函数接口
1.fopen
FILE *fopen(const char *pathname, const char *mode);功能:
打开pathname对应的文件并建立一个文件流
参数:
pathname:文件路径
mode:打开方式
r 只读 如果文件存在则只读打开
如果文件不存在报错
r+ 读写 如果文件存在则读写打开
如果文件不存在报错
w 只写 如果文件存在则清0,只写打开
如果文件不存在则创建
w+ 写读 如果文件存在则清0,读写打开
如果文件不存在则创建
a 追加只写 如果文件存在则追加只写打开
如果文件不存在则创建
a+ 追加读写 如果文件存在则追加读写打开
如果文件不存在则创建
返回值:
成功返回FILE*的指针
失败返回NULL并且将错误码置位#include<stdio.h> int main(void) { FILE *fp = NULL; fp = fopen("a.txt","r"); if(NULL == fp) { perror("打开a.txt文件失败"); return -1; } return 0; }
2.fclose
int fclose(FILE *stream);
功能:
关闭流
参数:
stream:文件流
返回值:
成功返回0
失败返回EOF(-1)FILE *fp = NULL; fclose(fp);
3.setvbuf
int setvbuf(FILE *stream, char *buf, int mode, size_t size);
功能:
改变流的缓存类型
参数:
stream:文件流
buf:缓存区的首地址
mode:
_IOFBF 全缓存
_IOLBF 行缓存
_IONBF 不缓存
size:缓存区大小
返回值:
成功返回0
失败返回非0
#include<stdio.h> int main(void) { char tmpbuff[4096] = {0}; #if 0 setvbff(stdout,tmpbuff,_IOFBF,4096); printf("stdout被切换为全缓存\n"); setvbuf(stdout,tmpbuff,_IOLBF,1024); printf("hello world!\n"); #endif setvlbuf(stdout,NULL,_IONBF,0); printf("stdout被切换为不缓存\n"); while (1) { /* code */ } return 0; }
2.fgetc、fputc
int fputc(int c, FILE *stream);
功能:
向流中写入一个字符
参数:
c:写入的字符
stream:文件流指针
返回值:
成功返回写入字符的ASCII码值
失败返回EOF(-1)
练习:
1.编写程序利用fputc将"hello world"写入到file.txt文件中
#include<stdio.h>
int main(void)
{
FILE *fp = NULL;
fp = fopen("a.txt","w");
char str[32] = {"hello world"};
char *p = NULL;
p = str;
if(NULL == fp)
{
perror("fopen a.txt failed");
}
while (*p != '\0')
{
fputc(*p,fp);
p++;
}
fclose(fp);
return 0;
}
fgetc
int fgetc(FILE *stream);
功能:
从流中读取下一个字符
参数:
stream:文件流指针
返回值:
成功返回读到字符的ASCII码值
失败或者读到文件末尾返回EOF
#include <stdio.h>
int main(void)
{
FILE *fp = NULL;
int ch = 0;
fp = fopen("a.txt", "r");
if (NULL == fp)
{
perror("fail to fopen");
return -1;
}
while (1)
{
ch = fgetc(fp);
if (EOF == ch)
{
break;
}
printf("%c", ch);
}
fclose(fp);
return 0;
}
等价
ch = getchar();
ch = fgetc(stdin);putchar(ch);
fputc(ch, stdout);3.fgets、fputs
4.fscanf、fprintf
5.fread、fwrite