标准IO是在系统调用函数基础之上构造的,它便于用户使用,标准IO就是对文件IO的一种封装。
标准IO库以及头文件<stdio.h>为底层IO系统调用提供了一个统一的接口,通俗的说就是,一个应用程序需要访问内核的系统调用,可以通过文件IO来调用,优化了文件IO的缓存分配问题,以及选择什么样是个的块长度。
对于每个被使用的文件都在内存中开辟了一个区域,用来存放文件的相关信息,而这些信息被保存在一个结构体变量中,这个结构体类型由操作系统来定义的,取名为FILE。
这就是下面所说的文件指针
对于标准IO库都是围绕着流来进行的,而在标准IO,流用FILE*来描述。
流:所有的IO操作仅是简单的从程序的进程中移进或者移出,这种字节流,就称为流。(文本流/二进制流)
对于文本流:在处理数据的时候一字符形式出现的,'\n'回车符被转换成CR换行符LF,而对于数字被转换成ASCII码的形式存在。
而对于二进制流;在处理数据的时候一二进制的形式处理数据,就是01机器码。
流(编程对象)
就跟文件IO一样,标准IO也有一系列的读写打开操作。
对于标准IO的open函数有如下几种形式:
/*
* FILE *fopen (const char *path,const char *mode);
* FILE *fdopen(int fd,const *path,const char *mode);
* int fd = open (const *path,int flags,mode_t mode);
* FILE *freopen (argv[1],"w+",stdout);
*
*/
#include
#include
#include
#define lockfile "/tec/tmp/text.c"
int main ()
{
FILE *fp;
fp = fopen (lockfile,"r+");
if (fp == NULL){
perror("this is");
exit(-1);
}else{
fclose(fp);
return 0;
}
}
/*
*对于“”双引号里的表示有几种形式“r+”r,w,w+,a,a+
*对于加号表示已读写的方式打开,r表示文件必须存在,不存在则返回错误,
*而W表示已创建的方式打开,但是文件已有文件会被清零
*对于a表示已追尾的方式创建,文件已存在,不会被清零
*
*
*/
//example 2
#include
#include
#include
int main (int argc,char *argv[]) { FILE *fp; if (argc <2){ fprintf(stdout,"usage\n",argv[0]); return -1; } if ((fp = fopen (argv[1],"a+")) == NULL){ perror("fopen"); return -1; } printf("before fopen \n"); freopen(argv[1],"r",stdout); printf("after fopen" ); freopen("/dev/tty","w+",stdout); printf("end main\n"); return 0; }
对于fopen打开的文件可以进行读入写出操作
那么对于标准IO的读写有三种不同的方式:
第一种就是一个字符的读写:fgetc和fputc
第二种是行的读写:fgtes 和fputs
第三种是对于某种数量的结构读写; fread fwrite
对于读写的结束判定;feof(fp) != EOF
对于标准输入输出设备的读写函数:
#include
int main ()
{
int c;
while((c = getc(stdin)) != EOF)
if (putc(c,stdout) == EOF)
perror("out error");
if (ferror(stdin))
perror("input error");
return 0;
}
//example 2
int main ()
{
char buf[max];
while(fgets(buf,,max,stdin) != NULL)
if (fputs(buf,stdout) == EoF)
perror(" output error");
if (ferror(stdin))
perror("stdin error");
return 0;
}