今天,简要的介绍一下,在linux中,用c语言进行I/O操作学习! 我们知道在unix下进行文件I/O操作,有2种方法,可以使用ISO C标准中的标准库函数来进行文件操作!也可以调用系统函数来实现!
我现在使用标准c函数库来实现!
首先,要说的是,利用标准函数库是带缓冲的!也就是说缓冲区大小的设定,系统已经设定好了,你不需要自己去考虑!
使用标准函数库,例如,当我们创建一个文件或者是打开一个文件时,我们用的是一个流与文件相关连,而在系统调用中我们使用的是文件描述符来关联的!
对于缓冲,标准I/O有三种类型!
1) 全缓冲.在这中条件下,只用当系统的缓冲区填满时才能够进行I/O操作,通常来说对于位于磁盘上的文件进行的是全缓冲!
2) 行缓冲,在这中条件下,当输入和输出中遇到换行符时,进行I/O操作,它允许我们一次输出一个字符,但是只有写了一行之后,才能进行实际的I/O,当流涉及到了终端时(如标准输入,标准输出)
进行的是行缓冲!(注意当缓冲被写满得时候,不管遇到换行符时都要进行I/O 操作!
3)不带缓冲,即直接将数据写到文件中去!(对于标准出错流通常是不带缓冲的,这样是为了更好更快的显示出错的信息!)
首先介绍一下打开文件流的函数!
常见的有
1) FILE *fopen(const char *restrict filename,const char *restrict type);//The fopen() function shall open the file whose pathname is the string pointed to by filename, and associates a stream with it.
2) FiLE*freopen(const char *restrict pathname,const char *restrict type);//进行的是流的定向,常见的用法是将标准输入和标准输出定向成有pathname 指定的文件中!
3) FILE *fdopen(int fiedes,const char * type );//filedes是文件描述符! 此函数获取的是一个现有的文件描述符,并使一个I/O流与该描述符相关联!通常由创建管道和通信通道函数返回的描述符!
利用 fopen 函数,打开一个文件,将其中的内容复制到里 另一个文件中去!
View Code1 #include<stdio.h> 2 int main() 3 { 4 FILE *fd; 5 FILE *fd1; 6 fd=fopen("/home/chenming/main1.cpp","r"); 7 fd1=fopen("/home/chenming/test.c","w"); 8 int c; 9 while((c=getc(fd))!=EOF) 10 if(putc(c,fd1)==EOF) 11 printf("error\n"); 12 13 14 15 16 return 0; 17 }
利用 freopen 函数将标准输入和标准输出重定向成两个文件中去!
1 #include<stdio.h> 2 int main() 3 { 4 freopen("/home/chenming/main1.cpp","r",stdin); 5 freopen("/home/chenming/test.c","w",stdout); 6 int c; 7 while((c=getc(stdin))!=EOF) 8 if(putc(c,stdout)==EOF) 9 printf("error\n"); 10 11 12 13 14 return 0; 15 }
上面的代码涉及到了读和写的流的函数,下面总结一下这些函数!
一旦打开流,就要进行常见的读写操作!
1) 一次一个字符的I/O操作
在标准输入输出库里面给我们提供了几种方法!
输入函数有
int getc(FILE *fp)//可被实现为一个宏//
int fgetc(FILE *fp)//只能被实现一个函数,不能被实现为一个宏
int getchar(void)//相当于 getc(stdin)
出错将返回EOF
对应的输出函数有
int putc(int c,FILE *fp)
int fputc(int c,FILE *fp)
int putchar(int c)
前面已经说明了怎么用了,现在就不在说了!
2)每行的I/O操作
对于输入有:
char * fgets(char *buf,int n,FILE *fp)//成功则返回buf,若出错,或者已经到达文件尾则返回NULL,其中n为缓冲区的大小!
char *gets(char *buf)//不推荐使用这个,因为没有规定缓冲区的大小,可能溢出!
对于输出有:
int fputs(const char *buf, FILE *fp)
int puts(const char *buf)//同样不推荐使用这个函数
请看下面的用法
1 #include <stdio.h> 2 #define maxn 100 3 int main() 4 { 5 char buf[maxn]; 6 while(fgets(buf,maxn,stdin)!=NULL) 7 if(fputs(buf,stdout)==EOF) 8 printf("output error\n"); 9 if(ferror(stdin)) 10 printf("input error\n"); 11 return 0; 12 }