现在的位置: 首页 > 综合 > 正文

linux 下c 语言进行文件I/O 操作学习(一)!

2011年03月31日 ⁄ 综合 ⁄ 共 2228字 ⁄ 字号 评论关闭

  今天,简要的介绍一下,在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 Code
 1 #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 函数将标准输入和标准输出重定向成两个文件中去!

View Code

 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)//同样不推荐使用这个函数

  请看下面的用法

View Code

 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 }

 

   

抱歉!评论已关闭.