zoukankan      html  css  js  c++  java
  • C语言 文件

    /****************************************************************
    C语言文件概述:
        一般文件可分为二进制文件和文本文件。
     约定:我们把数据在终端上的表现形式称为数据的终端形式,而不
     称为字符形式。
     注:终端是指键盘 显示器等和用户直接打交道的输入输出设备。
     二进制文件是把内存中的书按其在内存中的储存形式原样输出到磁
     盘上存放,也就是说存放的是数据的原样式。
     文本文件是把数据终端形式的二进制数据输出到磁盘上存放,也就
     是说存放的是数据的终端形式。
    ****************************************************************/
    /*文件打开函数: fopen 函数
     *    原型是 FILE * fopen(char * filename, char * mode);
     *    参数: fileopen 表示指定文件名称  mode 指打开文件的方式
     *文件关闭函数: fclose(文件指针)
     *    fclose函数也带回一个值,顺利的执行了关闭操作,返回值为0,否则
     *    返回值为 EOF(-1)。
     *注意:
     *    (1)除非有其他说明,输入又叫读,是指从文件(外存)输入到内存
     *         输出又叫写 是指从内存输出到外存。
     *    (2)如果不能实现打开任务,fopen函数将会带回一个出错信息。
     *         此时fopen函数将会带回一个空指针值 NULL
     *         NULL 在stdio.h 文件中已经被定义为 0
     *         常用下面的方法打开一个文件
     *         if (fp = fopen("filename", "r")) == NULL)
     *         {
     *             printf("cannot open this file ");
     *             exit(0);  // 或者 return;
     *         }
     *     (3)在程序开始运行时,系统自动打开3个标准文件:标准输出 标准
     *          输入 标准出错输出。通常这三个文件都与终端相联系。因此从
     *          终端输入或向终端输出都不需要打开终端文件。系统自动定义了
     *          3个文件指针stdin stdout stderr,分别指子向终端输入 终端输
     *          出 标准出错输出。

     *      "r":可读,如果文件不存在,fopen调用失败
     *      "w":可写,如果文件存在,那么原来的内容会被销毁。
     *      "a":在文件尾追加,在新的数据写到文件里之前,不改变EOF标记,如果文件不存在,创建一个新的文件。
     *      "r+":可读可写,文件必须存在。
     *      "w+":打开一个空文件用来读写,如果文件存在,则内容被销毁。
     *      "a+":可读可追加,在新的数据写到文件里之前,改变EOF标记;如果文件不存在,创建一个新的文件。
     *       如果调用失败,返回一个空指针。
     */
    // fscanf fprintf 用于文本的格式化输入输出
    // 一般调用形式为 fscanf 或 fprintf(文件指针,格式字符串,输入或输出列表)
    // 文件测试 文件的读写
    # include <stdio.h>

    typedef struct student
    {
     int code;
     char name[10];
     int age;
    }St;

    int main(void)
    {
     FILE * out;
     int i;
     St a[2];
     // 检查打开操作是否出错
     if ((out = fopen("student.dat", "w+")) == NULL)
         printf("Cannot open output file.");
     for (i = 0; i < 2; ++i)
     {
      // 使用scanf也可以实现此功能
      fscanf(stdin, "%d%s%d", &a[i].code, &a[i].name, &a[i].age);
      fprintf(out, "%d%s%d ", a[i].code, a[i].name, a[i].age);
     }
     fclose(out);
     
     return 0;
     }
     
     /*
         运行结果:
         1 王小林 18
      2 斯大林 99
      
      --------------------------------
      Process exited after 29.82 seconds with return value 0
      请按任意键继续. . .
        并且在此程序文件的文件夹中生成了一个名为 student.dat 的文件。
     
     */

    /*
       fread 和 fwrite 函数用于和二进制文件相关的输入和输出
       一般调用形式为 :
           fread(buffer, size, count, fp);
        fwrite(buffer, size, count, fp);
     参数说明:
         buffer是一个指针,对于fread来说,它是读入数据的
      地址。对于fwrite来说它是要输出数据的地址。
      size是要读写的字节数。
      count是要读写size字节数据的个数
      fp是文件类型指针
    */

    # include <stdio.h>

    typedef struct student
    {
     int code;
     char name[10];
     int age;
    }St;

    int main(void)
    {
     FILE * out, * in;
     int i;
     St a[2] = {{1, "www", 18}, {2, "hhh", 99}};
     if ((out = fopen("stu.dat", "wb")) == NULL)
         printf("Cannot open output file.");
     for (i = 0; i < 2; ++i)
     {
      fwrite(&a[i], sizeof(St), 1, out);
     }
     fclose(out);
     if ((in = fopen("stu.dat", "rb")) == NULL)
         printf("Cannot open input file.");
     for (i = 0; i < 2; ++i)
     {
      fread(&a[i], sizeof(St), 1, in);
      printf("%d, %3s, %d ", a[i].code, a[i].name, a[i].age);
     }
     fclose(in);
     
     return 0;
     }
     
     /*
         运行结果:
         1, www, 18
      2, hhh, 99
      
      --------------------------------
      Process exited after 0.0915 seconds with return value 0
      请按任意键继续. . .
     */

    /*
        fgetc函数和 fputc函数 可用于读写文本文件或二进制文件
        注意:fgetc函数和 fputc函数读写字节级别(每次1字节)的
     数据,因此,fgetc函数和 fputc函数读写二进制文件的时候
     可以通过多次操作从而实现对任意数据类型的数据的读写。
     fgetc函数一般调用形式
         字符变量 = fgetc(文件指针);
     fputc函数一般调用形式
         fputc(字符, 文件指针);
     此处字符可以是任何数据类型的一个字节的部分数据。
    */

    /*
        其它读写函数
     putw 函数 和 getw 函数
     用来对磁盘文件读写一个字符,读写二进制文件时读写一个整数
     而读写文本文件时读写两个字符。
     putw(10,fp);
     表示将整数10输出到 fp 指向的文件
     i = getw(fp);
     表示从磁盘文件中读一个整数到内存,赋给变量 i
     
     fgets 函数 和 fputs 函数
     从指定文件读入一个字符串
     fgets(str, n, fp)
     表示从 fp 指向的文件中读取 n-1 个字符,并在末尾加 '' 得
     到一个长度为 n 的字符串,放入字符数组 str 中
     如果在读完 n-1 个字符之前遇到换行符或者EOF,读入即结束
     fputs("China", fp);
     表示把字符串 "China" 输出到 fp 指向的文件
    */

    # include <stdio.h>
    # include <stdlib.h>

    int main(void)
    {
     FILE * fp;
     char ch;
     if ((fp = fopen("out.dat", "w")) == NULL)
         printf("Cannot open file.");
     ch = getchar();
     while (ch != '#')
     {
      fputc(ch, fp);
      ch = getchar();
      }
     fclose(fp);
     
     return 0;
    }

    /*
        运行结果:
         w
      w
      e
      3
      #
      
      --------------------------------
      Process exited after 7.194 seconds with return value 0
      请按任意键继续. . .
    */

    /*
        文件的定位:
         rewind 函数,使位置指针重新返回文件开头。
      int rewind(FILE * fp)
      其中 fp 为文件指针,若函数调用成功,返回 0 ,否则返回其它值
    */

    /*
        fseek 函数
     功能是控制文件的位置指针按需要移动到任意位置,利用它可以很好的做到
     对文件的随机读写,即读完一个字节后,并不一定要读写其后续的字节,而
     可以读写文件中任意位置上所需要的字节。
     fseek(文件类型指针,位移量,起始点);
     其中起始点用 0,1,2 代替,0 表示文件开始位置,1 为当前位置,2 位文件
     末尾。位移量是以起始点为基准点,向前移动的字节数。fseek 函数 一般用
     在二进制文件中,因为文本文件要发生字符转换,计算位置时往往会发生混乱。
     
     ftell 函数
     功能是返回文件指针的当前位置,用相对于文件开头的位移量来表示。由于
     文件中的位置指针经常移动人们往往不容易知道其当前的位置,用ftell函数
     可以得到当前位置,便于程序员下一步动作。
    */
    /*
        文件的状态
        feof 函数
     若到文件末尾,函数值为真
     
     ferror 函数
     在调用各种输入输出函数时,如果出现错误,可检查函数返回值,也可以用
     ferror 函数检查  ferror(fp);  如果返回值为(0)假,表示出错,
     
     clearerr 函数
     功能是使文件错误标志和文件结束标志置为 0.
     
    */
     

  • 相关阅读:
    24、可靠信号与不可靠信号
    24、sed用法
    26、linux shell常用的几个函数,diff
    21、Posix共享内存
    23、修改vim的tab,使其占4个空格
    25、linux shell常用的几个函数,sort
    Console算法有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和
    Console算法[for,if]一水仙花数(Water flower)
    Console算法回文数
    Console算法[for,if]有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数
  • 原文地址:https://www.cnblogs.com/lnlin/p/6607563.html
Copyright © 2011-2022 走看看