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\n");
 *             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\n", 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\n", 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 个字符,并在末尾加 '\0' 得
 到一个长度为 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.
 
*/
 

 

posted @ 2017-03-23 21:52  荒唐了年少  阅读(217)  评论(0编辑  收藏  举报