目录

  • 1 第一章 C语言简介
    • 1.1 C语言前世今生
    • 1.2 主流开发环境介绍
    • 1.3 第一个小程序解析
    • 1.4 常见编译错误
    • 1.5 章节知识点小结
  • 2 算法基础
    • 2.1 算法-程序的灵魂
    • 2.2 算法的描述-流程图
  • 3 数据类型与运算符
    • 3.1 数据描述
    • 3.2 运算符和表达式1
    • 3.3 运算符和表达式2
    • 3.4 章节知识点小结
  • 4 顺序结构程序设计
    • 4.1 输入和输出
    • 4.2 顺序结构程序设计
    • 4.3 章节知识点小结
  • 5 选择结构程序设计
    • 5.1 关系运算符和关系表达式
    • 5.2 逻辑运算符和逻辑表达式
    • 5.3 if语句
    • 5.4 条件运算符
    • 5.5 switch语句
    • 5.6 章节知识点小结
  • 6 循环结构程序设计
    • 6.1 while循环结构
    • 6.2 do_while循环结构
    • 6.3 for循环结构
    • 6.4 循环的嵌套
    • 6.5 break语句和continue语句
    • 6.6 章节知识点小结
  • 7 数组
    • 7.1 一维数组
    • 7.2 二维数组
    • 7.3 字符数组
    • 7.4 章节知识点小结
  • 8 函数
    • 8.1 子程序设计
    • 8.2 函数定义
    • 8.3 函数的调用
    • 8.4 局部变量和全局变量
    • 8.5 参数传递
    • 8.6 函数递归调用
    • 8.7 章节知识点小结
  • 9 指针
    • 9.1 指针的基本概念
    • 9.2 指针变量的定义及引用
    • 9.3 通过指针引用数组元素
    • 9.4 指向多维数组的指针和指针变量
    • 9.5 用指向数组的指针作函数参数
    • 9.6 指针与字符串
    • 9.7 函数指针和指针函数
    • 9.8 章节知识点小结
  • 10 用户自己建立数据类型
    • 10.1 定义和使用结构体变量
    • 10.2 使用结构体数组
    • 10.3 结构体指针
    • 10.4 章节知识点小结
  • 11 编译预处理
    • 11.1 宏定义预处理
    • 11.2 文件包含预处理
    • 11.3 条件编译预处理
    • 11.4 章节知识点小结
  • 12 文件
    • 12.1 文件的基本知识
    • 12.2 文件的基本操作
    • 12.3 章节知识点小结
文件的基本操作

对文件的操作是通过一些库函数来实现。常用的文件操作函数有:

(1)fopen函数:打开数据文件(2)fclose函数:关闭数据文件(3)fputs函数:将字符串写入文件     (4)fgets函数:从文件读取字符串(5)fprintf函数:以指定的格式将数据输出,写入文件中         (6)fscanf函数:以指定的格式从文件中读取数据 (7)fread函数:以二进制方式从文件中读取一组数据 (8)fwrite函数:以二进制的方式向文件写入一组数据                                               对文件读写之前应该“打开”该文件,在使用结束之后应“关闭”该文件。                            “打开”:指为文件建立相应的信息区(用来存放有关文件的信息)和文件缓冲区(用来暂时存放输入输出数据)。                                                                                       关闭”:指撤销文件信息区和文件缓冲区,使文件指针变量不再指向该文件,无法再进行文件读写操作。

(1)用fopen函数打开数据文件

     fopen函数的调用方式:     fopen(文件名,使用文件方式);

    如:  fopen(“D:\\a1”,”r”);  

      文件名和使用方式分别用双引号引起来。

u打开D盘的“a1”文件,路径中的一个\,要用两个\\表示。因为一个\是作为转义字符标志。

u使用文件方式为“读” ,打开后将对文件执行读操作

ufopen函数的返回值是指向a1文件的指针

    通常将fopen函数的返回值赋给一个指向文件的指针变量。

    如:FILE  *fp;

          fp=fopen(“D:\\a1”,”r”);

          fp与文件a1相联系,或说fp指向文件 a1。

    打开文件时,通知编译系统3个信息:

需要访问的文件名。如无后缀,默认为dat数据文件。

② 使用文件的方式(“读”还是“写”等)

③ 让哪一个指针变量指向被打开的文件,通过哪个指针变量对文件进行操作。

Ø说明:

用“r”方式打开文件后,只能从该文件读取数据,向计算机输入数据。

      条件:文件存在并存有数据,才能从文件中读数据。

           不能用“r”方式打开一个并不存在的文件,否则出错。

② 用“w”方式打开文件后,只能向该文件写数据,即输出数据。

u若文件不存在,则在打开文件前新建立一个以指定的名字命名的文件。

u若文件已存在,则在打开文件前先将该文件删去,然后重新建立一个新文件。

  ③ 用“a”方式打开文件,可向文件末尾添加新的数据(保留原有数据)。

u条件:文件存在。

u打开文件时,文件读写标记移到文件末尾。

  ④ 用r+、w+、a+方式打开的文件,既可以读数据,又可以写数据。

ur+方式:该文件已经存在。

uw+方式:新建立一个文件,先向此文件写数据,然后可以读此文件中的数据。

ua+方式:保留文件内容,文件读写标记移到文件末尾,可添加内容,也可读取。

      以上几种方式是对文本文件进行操作。

在每种方式后面加字母b, 如rb,wb, 是对二进制文件进行操作,使用方式不变,只是操作的文件类型不同。如rb,r为只读,b表示打开的文件为二进制文件。


⑥ 如果打开失败,fopen函数将带回一个空指针值NULL

      常用方法:

  if ((fp=fopen(“D:\\a1”, ″r″))==NULL)

 {  printf(“cannot open this file\n”);

     exit(0);       //终止正在执行的程序

 }

(2)用fclose函数关闭数据文件

      fclose函数调用形式:  fclose(文件指针);

如: fclose  (fp);

u把fp指向的文件关闭,fp不再指向该文件。

u如果不关闭文件将会丢失数据,应当养成程序终止前关闭所有文件。


(3)用fputs函数向文件写字符串(fileputstring ,简称fileputs)

调用形式:fputs(str,fp)

  • 把str所指向的字符串写到fp所指向的文件中

写成功,返回0;否则返回EOF (文件结束符)

(4)用fgets函数从文件读取字符串(filegetstring,简称filegetstring)

调用形式: fgets(str,n,fp)

  • 从fp指向的文件读取长度为(n-1)的字符串,最后加一个‘\0’,共n个字符存

放到字符数组str中。

  • 读成功,返回地址str,失败则返回NULL

例:从键盘输入3个字符串,按字母大小顺序排序,将排好序的字符串保存到磁盘文件中。

Ø解题思路:

u从键盘输入3个字符串,存放在一个二维字符数组中;

u对字符数组中的3个字符串按字母顺序排序;(可用冒泡排序或选择排序)

u将排好序的字符串输出到文件中。

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

void main()

{  FILE  *fp;                      //定义指向文件的指针变量

   char  str[3][10],temp[10];      //定义二维字符数组str存放三个字符串

   int i,j,k ;                       temp数组进行交换

   printf(“Enter strings:\n”);   

   for(i=0;i<3;i++)        

      gets(str[i]);                //输入3个字符串,存放在str数组中

                                   //用选择法对字符串排序

   for(i=0;i<2;i++)                //3个字符串交换2次

   {  k=i;                         // k记录最小字符串的下标

      for(j=i+1;j<3;j++)           //和后面的字符串比较,遇到更小的字符串,

         if(strcmp(str[j],str[k])<0) k=j;              用k记录其下标

      strcpy(temp,str[i]);         //每次将最小的字符串和str[i]交换

      strcpy(str[i],str[k]);

      strcpy(str[k],temp);

}                             //实现字符串由小到大排序

if((fp=fopen(“D:\\s.dat”,  “w”))==NULL)   //打开D盘文件s,用于写数据

    {   printf("can't open file!\n");          打开失败,则显示提示信息

        exit(0);                            //终止正在执行的程序

}                                      //打开成功

    printf("\nThe new sequence:\n");       

    for(i=0;i<3;i++)

     {   fputs(str[i],fp);            //将str[i]中的字符串写入fp指向的文件

          fputs(“\n”,fp);           //写入’\n’,将写入文件的字符串分隔

         printf(“%s\n”,str[i]);  //并将str数组中排好序的字符串输出到终端

       }

     fclose(fp); 

  }

思考: 从文件s中读回字符串,并在屏幕上显示,应如何编写程序?

用fgets函数从文件中读取字符串。

#include <stdio.h>

#include <stdlib.h>

void main()

{  FILE *fp; 

   char  str[3][10];   int i;

   if((fp=fopen(“D:\\s.dat”, “r”))==NULL) 

   {  printf("can't open file!\n");exit(0); }

   for(i=0;i<3;i++)

   {  fgets(str[i],10,fp);          //从fp指向的文件读取9个字符,如遇\n,读入结束

      printf("%s",str[i]);    }     //将文件中读取的字符在终端显示,进行验证

   fclose (fp);

}

(5)用fprintf函数格式化写文件(fileprintformat,简称fileprint)

   fprintf函数以指定的格式将数据输出,即写入文件;fscanf函数以指定的格式输入,即读取文件。

调用方式为:

fprintf(文件指针,格式字符串,输出表列);

fprintf (fp,”%d,%6.1f”,i,f);

将整型变量i和实型变量f的值按%d和%6.1f的格式输出到fp指向的文件中。

#include <stdio.h>

void main()

{

  int i;

  float f;

  FILE *fp;

  i=3;

  f=1.2345;

  fp=fopen("D:\\t.dat","w");

  fprintf(fp,"%d,%6.2f",i,f);

  fclose(fp);

}

(6)用fscanf函数格式化读文件(filescanformat,简称filescanf)

fscanf (文件指针,格式字符串,输入表列);

如: fscanf (fp,”%d,%f”,&i,&f);

从文件中读取整数和实数送给变量i和f。

#include <stdio.h>

void main()

{

  int i;

  float f;

  FILE *fp;

  fp=fopen("D:\\t.dat","r");

  fscanf(fp,"%d,%f",&i,&f);

  printf("i=%d,f=%f\n",i,f);

  fclose(fp);

}

fprintf和fscanf函数都是对文本文件进行操作,可用其他函数对二进制文件进行读写

操作。如fread和fwrite函数。

(7)用fread函数以二进制方式读文件(fileread)

调用形式为:

fread(buffer,size,count,fp);

从fp所指向的文件中读取一组数据送到内存

(8)用fwrite函数以二进制方式写文件(filewrite)

调用形式:

fwrite(buffer,size,count,fp);

将内存中一组数据以二进制的形式写入文件

Øbuffer:是一个地址

ufread,从文件中读出数据,将数据存放在内存哪里(地址),由buffer指定

ufwrite,将内存哪个地址开始的数据输出, 写入文件

Øsize:读写的字节数

Øcount:读写数据项的个数

Øfp:FILE类型指针

例:从键盘输入3个学生的有关数据,然后把它们转存到磁盘文件上去。

解题思路:

u定义3个元素的结构体数组,存放学生的数据

u输入学生的数据

u用fwrite函数实现向磁盘输出学生数据

#include <stdio.h>

struct student

{ int num;

   char name[10];

   float score;

 } s[3];                        //定义结构体数组s,包含3个学生的数据

void main()

{ int i;

   FILE *fp;

   for(i=0;i<3;i++)

    scanf("%d%s%f",&s[i].num, s[i].name,&s[i].score); //输入3个学生的数据

   fp=fopen("stu","wb");          //打开文件,wb,二进制写方式

   for(i=0;i<3;i++)

       fwrite(&s[i],sizeof(struct student),  1,fp); //将数组s中的每条记录

   fclose(fp);                                        写入文件

}               

程序运行后,屏幕上并无输出信息,只是将从键盘输入的数据写入磁盘文件。

用以下程序从“stu.dat”文件中读入数据,然后在屏幕上输出。

void main()

{ int i;

   FILE *fp;

   fp=fopen("stu","rb");

   for(i=0;i<3;i++)

   {   fread(&s[i],sizeof(struct student), 1,fp);  //从文件中读取学生记录

       printf("%d,%s,%f\n",s[i].num,s[i].name,s[i].score); } 存放在s数组中

    fclose(fp);    }