Chinaunix首页 | 论坛 | 博客
  • 博客访问: 514645
  • 博文数量: 484
  • 博客积分: 10145
  • 博客等级: 上将
  • 技术积分: 5805
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-27 18:34
文章分类

全部博文(484)

文章存档

2011年(52)

2010年(107)

2009年(287)

2008年(38)

我的朋友

分类: C/C++

2009-10-21 13:58:11

C语言中没有输入输出语句,所有的输入输出功能都用ANSI C提供的一组标准库函数来实现。文件操作标准库函数有:

     
fopen 打开一个文件

     
fclose 关闭一个文件

     
fgetc 从文件中读取一个字符
              fputc 写一个字符到文件中去
              fgets 从文件中读取一个字符串
              fputs 写一个字符串到文件中去
              fprintf 往文件中写格式化数据
              fscanf 格式化读取文件中数据
              fread 以二进制形式读取文件中的数据
              fwrite 以二进制形式写数据到文件中去
              getw 以二进制形式读取一个整数
              putw 以二进制形式存贮一个整数

     feof 文件结束
              ferror 文件读/写出错
              clearerr 清除文件错误标志
              ftell 了解文件指针的当前位置

      
rewind 反绕
              fseek 随机定位


文件的打开
 1.函数原型
    FILE *fopen(char *pname,char *mode)

 2.功能说明
   按照mode 规定的方式,打开由pname指定的文件。若找不到由pname指定的相应文件,就按以下方式之一处理:
(1) 此时如mode 规定按写方式打开文件,就按由pname指定的名字建立一个新文件;
(2) 此时如mode 规定按读方式打开文件,就会产生一个错误。

打开文件的作用是:
(1)分配给打开文件一个FILE 类型的文件结构体变量,并将有关信息填入文件结构体变量;
(2)开辟一个缓冲区;
(3)调用操作系统提供的打开文件或建立新文件功能,打开或建立指定文件;
FILE *:指出fopen是一个返回文件类型的指针函数;

 3.参数说明
pname:是一个字符指针,它将指向要打开或建立的文件的文件名字符串。
mode:是一个指向文件处理方式字符串的字符指针。所有可能的文件处理方式见表8.1

 
4.返回值
   正常返回:被打开文件的文件指针。
   异常返回:NULL,表示打开操作不成功。

例如:
/* 定义一个名叫fp文件指针 */
FILE *fp;
/* 判断按读方式打开一个名叫test的文件是否失败 */
if((fp=fopen("test","r"))==NULL){

         /* 打开操作不成功 */
         printf("The file can not be opened.\n");
        /* 结束程序的执行 */
         exit(1);
      }
 要说明的是:C语言将计算机的输入输出设备都看作是文件。例如,键盘文件、屏幕文件等。ANSI C标准规定,在执行程序时系统先自动打开键盘、屏幕、错误三个文件。这三个文件的文件指针分别是:标准输入stdin、标准输出stdout和标准出错 stderr。


  • 文件的关闭

    1. 函数原型
        int fclose(FILE *fp);

    2. 功能说明
      关闭由fp指出的文件。此时调用操作系统提供的文件关闭功能,关闭由fp->fd指出的文件;释放由fp指出的文件类型结构体变量;返回操作结果,即0或EOF。

    3. 参数说明
      fp:一个已打开文件的文件指针。

    4. 返回值
      正常返回:0。
      异常返回:EOF,表示文件在关闭时发生错误。
    例如:
    int n;
    n=fclose(fp);


  • 文件的读写操作

    A. 从文件中读取一个字符
      1. 函数原型
          int fgetc(FILE *fp);
      2. 功能说明
        从fp所指文件中读取一个字符。
      3. 参数说明
        fp:这是个文件指针,它指出要从中读取字符的文件。
      4. 返回值
      正常返回: 返回读取字符的代码。
      非正常返回:返回EOF。例如,要从"写打开"文件中读取一个字符时,会发生错误而返回一个EOF。
      5. 实例

    【例8.1】显示指定文件的内容。
    程序名为:display.c
    执行时可用:display filename1 形式的命令行运行。显示文件filename1中的内容。例如,执行命令行display display.c将在屏幕上显示display的原代码。

    /* File display program. */
    #include
    main(int argc,char *argv[])            /* 命令行参数 */
    { int ch;
     /* 定义文件类型指针 */
    FILE *fp;
    /* 判断命令行是否正确 */
     if(argc!=2)
     { printf("Error format,Usage: display filename1\n");
      exit(1);       /* 键入了错误的命令行,结束程序的执行 */
     }
    /* 按读方式打开由argv[1]指出的文件 */
     if((fp=fopen(argv[1],"r"))==NULL){
         /* 打开操作不成功 */
        printf("The file <%s> can not be opened.\n",argv[1]);
       /* 结束程序的执行 */
         exit(1);
     }
     /* 成功打开了argv[1]所指文件 */
     ch=fgetc(fp);     /* 从fp所指文件的当前指针位置读取一个字符 */
     while(ch!=EOF)    /* 判断刚读取的字符是否是文件结束符 */
     { putchar(ch);    /* 若不是结束符,将它输出到屏幕上显示 */
      ch=fgetc(fp);   /* 继续从fp所指文件中读取下一个字符 */
     }                 /* 完成将fp所指文件的内容输出到屏幕上显示 */
     fclose(fp);       /* 关闭fp所指文件 */
    }

    B. 写一个字符到文件中去

    1. 函数原型
      int fputc(int ch,FILE *fp)
    2. 功能说明
      把ch中的字符写入由fp指出的文件中去。
    3. 参数说明
      ch:是一个整型变量,内存要写到文件中的字符(C语言中整型量和字符量可以通用)。
      fp:这是个文件指针,指出要在其中写入字符的文件。
    4. 返回值
      正常返回: 要写入字符的代码。
      非正常返回:返回EOF。例如,要往"读打开"文件中写一个字符时,会发生错误而返回一个EOF。
    5. 实例

    【例8.2】将一个文件的内容复制到另一个文件中去。
    程序名为:copyfile.c
    执行时可用:copyfile filename1 filename2形式的命令行运行,将文件filename1中的内容复制到文件filename2中去。

    /* file copy program. */
    #include
    main(int argc,char *argv[])    /* 命令行参数 */
    { int ch;
     FILE *in,*out;               /* 定义in和out两个文件类型指针 */
     if(argc!=3)                  /* 判断命令行是否正确 */
     { printf("Error in format,Usage: copyfile filename1     
      filename2\n");
      exit(1);                   /* 命令行错,结束程序的执行 */
     }
    /* 按读方式打开由argv[1]指出的文件 */
     if((in=fopen(argv[1],"r"))==NULL)
     { printf("The file <%s> can not be opened.\n",argv[1]);
      exit(1);                   /* 打开失败,结束程序的执行 */
     }
     /* 成功打开了argv[1]所指文件,再   */
    /* 按写方式打开由argv[2]指出的文件 */
     if((out=fopen(argv[2],"w"))==NULL)
     { printf("The file %s can not be opened.\n",argv[2]);
     exit(1);                   /* 打开失败,结束程序的执行 */
     }
     /* 成功打开了argv[2]所指文件 */
     ch=fgetc(in);      /* 从in所指文件的当前指针位置读取一个字符 */
     while(ch!=EOF)     /* 判断刚读取的字符是否是文件结束符 */
     { fputc(ch,out);   /* 若不是结束符,将它写入out所指文件 */
      ch=fgetc(in);    /* 继续从in所指文件中读取下一个字符 */
     }   /* 完成将in所指文件的内容写入(复制)到out所指文件中 */
     fclose(in);        /* 关闭in所指文件 */
     fclose(out);       /* 关闭out所指文件 */
    }

    【例8.3】按十进制和字符显示文件代码,若遇不可示字符就用井号"#"字符代替之。
    程序名为:dumpf.c
    执行时可用:dumpf filename1 形式的命令行运行。
    /* File dump program. */
    #include
    main(int argc,char *argv[])
    { char str[9];
     int ch,count,i;
     FILE *fp;
     if(argc!=2)
     { printf("Error format,Usage: dumpf filename\n");
      exit(1);
     }
     if((fp=fopen(argv[1],"r"))==NULL)
     { printf("The file %s can not be opened.\n",argv[1]);
      exit(0);
     }
     count=0;
     do{ i=0;
          /*按八进制输出第一列,作为一行八个字节的首地址*/
       printf("%06o: ",count*8);
         do{  
              /* 从打开的文件中读取一个字符 */
              ch=fgetc(fp);
              /* 按十进制方式输出这个字符的ASCII码 */
            printf("%4d",ch);
              /* 如果是不可示字符就用"#"字符代替 */
           if(ch<' '||ch>'~') str[i]='#';
              /* 如果是可示字符,就将它存入数组str以便形成字符串 */
           else str[i]=ch;
              /* 保证每一行输出八个字符 */
           if(++i==8) break;
         }while(ch!=EOF);     /* 遇到文件尾标志,结束读文件操作 */
         str[i]='\0';               /* 在数组str加字符串结束标志 */
         for(;i<8;i++) printf(" "); /* 一行不足八个字符用空格填充 */
         printf(" %s\n",str);       /* 输出字符串 */
         count++;                   /* 准备输出下一行 */
     }while(ch!=EOF);               /* 直到文件结束 */
     fclose(fp);                    /* 关闭fp所指文件 */
    }

    C. 从文件中读取一个字符串

    1. 函数原型
      char *fgets(char *str,int n,FILE *fp)
    2. 功能说明
      从由fp指出的文件中读取n-1个字符,并把它们存放到由str指出的字符数组中去,最后加上一个字符串结束符'\0'。
    3. 参数说明
      str:接收字符串的内存地址,可以是数组名,也可以是指针。
      n: 指出要读取字符的个数。
      fp:这是个文件指针,指出要从中读取字符的文件。
    4. 返回值

    正常返回:返回字符串的内存首地址,即str的值。
    非正常返回:返回一个NULL值,此时应当用feof()或ferror()函数来判别是读取到了文件尾,还是发生了错误。例如,要从"写打开"文件中读取字符串,将
    发生错误而返回一个NULL值。

    D. 写一个字符串到文件中去

    1. 函数原型
      int fputs(char *str,FILE *fp)
    2. 功能说明
      把由str指出的字符串写入到fp所指的文件中去。
    3. 参数说明
      str:指出要写到文件中去的字符串。
      fp:这是个文件指针,指出字符串要写入其中的文件。
    4. 返回值
      正常返回: 写入文件的字符个数,即字符串的长度。
      非正常返回:返回一个NULL值,此时应当用feof()或ferror()函数来判别是读取到了文件尾,还是发生了错误。例如,要往一个"读打开"文件中写字符串时,
    会发生错误而返回一个NULL值。

    5.实例

    【例8.4】以下程序将一个文件的内容附加到另一个文件中去。
    设下面这个程序名为:linkfile.c
    执行时可用:linkfile filename1 filename2形式的命令行运行,将文件filename2的内容附加在文件filename1之后。
    /* file linked program. */
    #include
    #define SIZE 512
    main(int argc,char *argv[])
    { char buffer[SIZE];
     FILE *fp1,*fp2;
     if(argc!=3)
     { printf("Usage: linkfile filename1 filename2\n");
      exit(1);
     }
    /* 按追加方式打开argv[1] 所指文件 */
     if((fp1=fopen(argv[1],"a"))==NULL)
     { printf("The file %s can not be opened.\n",argv[1]);
      exit(1);
     }
    if((fp2=fopen(argv[2],"r"))==NULL)
    { printf("The file %s can not be opened.\n",argv[2]);
      exit(1);
    }
    /* 读入一行立即写出,直到文件结束 */
    while(fgets(buffer,SIZE,fp1)!=NULL)
      printf("%s\n",buffer);
    while(fgets(buffer,SIZE,fp2)!=NULL)
      fputs(buffer,fp1);
    fclose(fp1);
    fclose(fp2);
    if((fp1=fopen(argv[1],"r"))==NULL)
    { printf("The file %s can not be opened.\n",argv[1]);
      exit(1);
    }
    while(fgets(buffer,SIZE,fp1)!=NULL)
      printf("%s\n",buffer);
    fclose(fp1);
    }

    E. 往文件中写格式化数据

    1.函数原型
      int fprintf(FILE *fp,char *format,arg_list)
    2.功能说明
      将变量表列(arg_list)中的数据,按照format指出的格式,写入由fp指定的文件。fprintf()函数与printf()函数的功能相同,只是printf()函数是将数据写入屏幕文件(stdout)。
    3.参数说明
      fp:这是个文件指针,指出要将数据写入的文件。
      format:这是个指向字符串的字符指针,字符串中含有要写出数据的格式,所以该字符串成为格式串。格式串描述的规则与printf()函数中的格式串相同。
    arg_list:是要写入文件的变量表列,各变量之间用逗号分隔。
    4.返回值
      无。
    5. 实例

    【8.5】下列程序的执行文件为display.exe,执行时键入命令行:
       display [-i][-s] filename
    下面的表格列出了命令行参数的含义及其功能:


 存储文件名:save.txt
 程序代码如下:
 /* file display program. */
 #include
 #define SIZE 100
 main(int argc,char *argv[])
 { char buffer[SIZE],*filename;
  FILE *in,*out;
  int n,count,sflag=0,iflag=0;
  if(argc<2||argc>4)
  { printf("Usage:display [-i] [-s] filename.\n");
   exit(1);
  }
  for(n=1;n   { if(!strcmp(argv[n],"-i")) iflag=1;      /* 置加行号标志 */
   else if(!strcmp(argv[n],"-s")) sflag=1; /* 置存储标志   */
   else filename=argv[n];        /* 使filename针指向文件名 */
  }
  if((in=fopen(filename,"r"))==NULL)
  { printf("The file %s can not be opened.\n",filename);
   exit(1);
  }
    /* 打开存储文件save.txt */
  if((out=fopen("save.txt","w"))==NULL)
  { printf("The file %s can not opened.\n","save.txt");
   exit(1);
  }
  count=1;                           /* 行号从1开始 */
  while(fgets(buffer,SIZE,in)!=NULL) /* 逐行读入文件内容 */
  { if(iflag==1){
    printf("%3d:%s",count,buffer); /* 显示行号和本行内容*/
       /* 存储行号和本行内容 */
    if(sflag==1) fprintf(out,"%3d:%s",count,buffer);
   }
   else {
             /* 不设开关的情况下仅显示一行内容 */
             printf("%s",buffer);
             /* 存储本行内容 */
       if(sflag==1) fprintf(out,"%s",buffer);
      }
   count++; /* 下一行 */
  }
    fclose(in);
    fclose(out);
}
阅读(426) | 评论(0) | 转发(0) |
0

上一篇:随机字符串的生成方法

下一篇:C语言教程

给主人留下些什么吧!~~