黑马程序员-[C语言] 第四篇:文件操作总结

这篇博客总结了C语言中关于文件操作的知识,包括fgets和fputs函数的使用,内存动态分配函数如malloc、calloc和realloc,以及结构体、枚举、预处理指令等。还讲解了static和extern修饰符对局部变量、全局变量和函数的影响,并介绍了文件的读写操作和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言第十二天知识点总结:

1.fgets函数使用的使用:
该函数是一个文件操作函数    格式为:fgets (函数名,数组长度,文件指针(stdin));
作用:从输入缓冲区中读取一个字符串保存到一个字符数组中。
  fputs(数组名,stdout);  fputs函数书不会自动换行的,也不能进行格式化的输出 ,而 puts函数可以自动换行。

2. const 关键字:
   (1)指针变量P的指向可以改变,但是指向的变量值不可以 改变。
          此时的格式为: const  int  *p=&a;   *p=&b;   *p=1000; 值不可变,此处值修改错误。
                        int  * const=&a;       *p=&b;   *p=1000;  地址不可变,修改地址会出错const  修饰的地方: 1 修饰常量  2.  修饰指针变量  3.  修饰数组

3.  (1)BSS段:通常是指用来存放程序中为初始化的全局变量和静态变量。
     (2)数据段:通常是指用来存放程序中已初始化
     (3)代码段   程序执行代码的一块内存内存区域;
     (4)   堆:     进程运行中被动态分配的内存段;
     (5)   栈:    用户存放程序临时创建的局部变量;

4    C语言中的内存动态分配函数:
      (1)malloc函数:  格式:  void  *malloc(unsigned  size)
                 从内存的堆区分配大小为size个字节的连续的内存空间,如果申请成功,返回收地址,否则,返回NULL。
     memset(指针指向的空间,放入的值,设定空间的大小);主要作用是给一块空间付值。
     (2)calloc函数: 格式为(块数,长度)分配内存空间
          如:int *p=(int *)calloc(4,sizeof(int));    分配了4块内存长度为4个单元的内存空间。  
     (3)realloc  函数可以给已经存在的空间扩充大小
                格式为:  P=realloc(P,40*sizeof(int ); 返回值可能是新地址,此函数有返回值。

5.  指针函数: 存放函数的首地址指针的指针变量( 返回值为指针的函数)就是指针函数。
      格式为:  类型说明符 *函数名(形参表){函数体  return   函数的首地址}

6. 函数指针:我们把指向函数首地址的指针变量称为“函数指针”。  
         格式为:  返回值类型 (*变量名)(函数的参数);定义如下:

/* 函数指针变量
 
        存放函数的首地址的指针变量就是函数指针变量
 
    函数指针变量的定义
 
      返回值类型  (*变量名)(函数的参数);
 
 
      函数的声明:
 
      int sum(int a,int b);----> 函数指针 int (*p1)(int a,int b);
   
      //定义了一个函数指针 p1 
      //p1可以存放 返回值是int类型,并且有两个形参,形参的类型还都是int类型的函数的地址
 
      //函数指针的初始化
 
      p1 = sum;  //sum存的就是函数在内存中的首地址 */


注意事项:  (1)函数指针变量不能进行算数运算,这是与数组指针变量不同的,数组指针变量加减一个整数可以是指针移向指针后面,而函数指针的移动是毫无意义的。
(2)函数调用中,(*指针变量名)的两边扩考不能省略,其中的*不应该理解为求值运算,在此处他只是一种表示符号。

7.  C语言的构造类型有:    1  数组类型   2.结构体类型  3. 共用体类型
        结构体:格式:   struct  结构名{成员列表};
        结构体占用的内存空间是每个成员占用的字节数之和(要考虑对齐问题);
      (注意)结构体中,局部作用域内可以屏蔽全局作用域的结构体定义。


C语言第十三天知识点总结:


1  结构数组概念:结构数组的每一个元素都是具有相同的结构类型的下标结构变量。
     结构数组定义,定义格式为:
        struct   结构名{ 成员列表}数组名[数组长度];

2  结构体数组的初始化    (1)定义结构体数组的同时进行初始化  (2)先定义,后初始化

3. 结构体指针变量的定义   格式: struct  结构体  *结构指针变量名
      结构体指针间接访问成员值的两种方法:
       (1) (*结构体指针变量).成员名    (2)结构体指针变量->成员名。

4   结构体嵌套使用  注意事项:
      (1)结构体定义中,可以嵌套其它类型结构体变量,但是不可以嵌套自己类型的变量
      (2) 但是可以嵌套自己结构类型的指针。   如: struct   student  *stud ;

5.  用结构体变量作为函数参数,实质上是直传递,不能改变主函数中的值,若想修改值,          需要用结构体指针作为函数参数。

6   枚举类型   格式:  enum   枚举类型名{枚举值};
      枚举类型元素的命名习惯:  enum  iColor{kIcolorwhite,kIcolorblack};   枚举类型的初始化和结构体类似。此处略。

7.  typedef 语法及其定义
       typedef    原类型    新定义类型;

8   预处理指令及其概念:  C语言提供的预处理功能,主要有:宏定义,条件包含,条件编译。

 9.  宏定义中,习惯上将宏名大写,
 无参宏的定义方式:#define  标示符   字符串(变量、常量、表达式)   
有参宏的定义方法     #define  宏名 (参数) 字符串

10.  条件编译指令;常用的有:
(1)#if      #elif       #else    #endif   
  (2)   #ifndef 主要用来判断某个宏是否定义了  
        格式为:#ifndef   标示符
                           程序段1
                         #else       程序段2
                         #endif
     如: #ifndef  DEBUDG1  
                         a=10;


11.条件编译指令调试bug

#include <stdio.h>

#define DEBUG1 1

#if DEBUG1 == 1
//显示调试信息
#define Log(format,...) printf(format,## __VA_ARGS__)

#else
//不显示调试信息
#define Log(format,...)

#endif

void test(){

    int a  = 10,b=3;
    Log("test--->%d,%d\n",a,b);

}


void test1(){
    
    printf("xxxxx\n");
    float b  = 10.23f;
    Log("test1--->%.2f\n",b);
    
}

int main(int argc, const char * argv[]) {
    
    //DEBUG1 == 1   显示调试信息
    //DEBUG1 == 0   不显示调试信息
    Log("xxxxxxxxxx-->\n");
    
    test1();
    test();
    
    return 0;
}



C语言第十四天知识点总结:


一   static和extern修饰局部变量
         1.static修饰局部变量,能延长变量的生命周期。
         2.static定义的变量的语句只会被执行一次
         3.extern不能修饰局部变量。

二    static和extern修饰全局变量
           1.static修饰的全局变量只能在本文件中使用 而不能在其调用的函数中使用。
           2. 在不同的文件中,使用static声明的变量可以同名。
           3. extern修饰的全局变量可以在本文件中使用,也可以在其它调用的文件中使用。
           4.   在不同的文件中,使用extern声明的变量不可以同名。

三     static和extern修饰函数
      1.static修饰的函数,是一个内部函数,(只可以在定义的文件中使用)
        2   extern声明的函数,可以在定义的文件中使用,也可以在其它文件中使用。


四     文件的概念以及分类。
      1.文件的操作步骤:   引入头文件--》定义文件指针--》打开文件-文件读写--》关闭文件。
       2.   字符读写函数:fgetc和fputc   
              字符串读写函数:fgets  fputs
              数据快读写函数      freed   fwrite
              格式化读写函数    fscanf   fprinf
       3. 文件指针的定义: 格式为:  FILE   *指针变量标识符号     一般定义为:FILE    *fp;
       4.文件的打开和关闭:  
              fopen函数,用来打开一个文件,一般形式为:
                文件指针变量名= fopen(文件名,使用文件方式);
                 eg:    FILE  *fp;     fp=fopen(“a.tex”“r”);   
                 fclose(文件指针);

       5. 文件的使用及注意事项:


           6. 字符写入函数(fputc   fgetc):
  fputc:  函数的功能是把一个字符写入指定的文件中去;格式为:fputc (字符量(常量、变量、数组均可),文件指针)fgetc ( 指针文件)
  例题笔记:
 

#include <stdio.h>

int main(int argc, const char * argv[]) {
    FILE *fp = fopen("a.txt", "w");
    char a,ch[10];
    printf("请输入您要输入的10个字符,以#结束\n");
    scanf("%s",ch);
    if (fp!=NULL) {
        a=getchar();
        a=getchar();
        while (a!='#') {
            fputc(a, fp );
            putchar(a);
           a=getchar();
        }
        printf("%c",a);
        fclose(fp);
        putchar(10);
    }
    
    
    return 0;
}
EOF是文件的末尾标志;

rewind函数把文件指针指向开始位置;


7.  字符串读写函数: fputs和fgets函数:
    格式   fputs(字符串,文件指针);     fgets(数组名,数组长度,文件指针);
注意:  (1)fgets读取的时候,当文件读去完成后 会给字符加上结束符\0
                 (2)   fgets读取的时候,遇到\n或者EOF,读取结束。
例题笔记:

<pre name="code" class="vb">#include <stdio.h>

void test(){

    //写入字符串到文件中
    char str[]="welcome to afuhan";
    
    //定义文件指针
    //打开文件
    FILE *fp = fopen("fputs.txt", "w");
    
    //判断
    int count=0;
    if (fp!=NULL) {
        
        //写字符串到文件中
        //count 返回的事本次写入的字符串的长度
        count = fputs(str, fp);
        
        printf("写入成功,本次写入%d个字符\n",count);
    }
    
    
    //关闭文件指针
    fclose(fp);
    

}

/**
 *  字符串的追加
 */
void test1(){


    //写入字符串到文件中
    char str[]="welcome to afuhan";
    
    //定义文件指针
    //打开文件,追加是在文件的末尾追加
    FILE *fp = fopen("fputs.txt", "a");  //a append
    
    //判断
    int count=0;
    if (fp!=NULL) {
        
        //写字符串到文件中
        //count 返回的事本次写入的字符串的长度
        count = fputs(str, fp);
        
        printf("写入成功,本次写入%d个字符\n",count);
    }
    
    
    //关闭文件指针
    fclose(fp);
    

}

int main(int argc, const char * argv[]) {
   
    //写入字符串到文件中
    char str[]="welcome to afuhan\n";
    
    //定义文件指针
    //打开文件
    FILE *fp = fopen("fputs.txt", "r");  //r read
    
    //判断

    char str2[100];
    if (fp!=NULL) {
        //fgets(ch,10,stdin);
        //从文件中读取字符到字符数组str2中
        //   数组名   长度         文件指针
        fgets(str2, sizeof(str2), fp);
        //fputs(str, fp);
        //sizeof(str2)  100
        //注意:
        //1)fgets读取的时候,当文件内容读取完毕后,会给字符加上结束符\0
        //2)fgets读取的时候,遇到\n或者EOF,读取结束
        printf("str2---->%s\n",str2);
        
    }
    
    
    //关闭文件指针
    fclose(fp);
    
    return 0;
}


8.   数据块的读写函数:   fread 和fwrite   格式:        fread (buttfer,size,count,fp);        fwrite   (buttfer,size,count,fp);   其中  buttfer是一个指针,在fread函数中,表示数据输入的缓冲区,在fwrite函数中,他表示存放输出数据的首地址。     size 表示数据快的字节数。      count  表示要输入的数据块块数。   fp   表示文件指针。例题笔记:

#include <stdio.h>
#define size 4
struct student {
    char   name[10];
    int    no;
    int    age;
    char   address[15];
}student1[size];


void test(){
    printf("请输入学生四个学生的基本信息:格式为:姓名 学号 分数 地址\n");
    for (int i=0; i<size; i++) {
        scanf("%s%d%d%s",student1[i].name,&student1[i].no,&student1[i].age,student1[i].address);
    }
    FILE *fp = fopen("student1.txt", "w");
    if (fp!=NULL) {
        for (int i=0; i<size; i++)
            fwrite(&student1, sizeof(student1), 1, fp);
        printf("已写入到磁盘");
    }
    fclose(fp);
    
   

}
int main(int argc, const char * argv[]) {
    
    FILE *fp = fopen("student1.txt", "r");
    if (fp!=NULL) {
        for (int i=0; i<size; i++)
            fread(student1, sizeof(struct student), 4, fp);
    }
    for (int i=0; i<size; i++) {
        printf("%s\t%d\t%d\t%s",student1[i].name,student1[i].no,student1[i].age,student1[i].address);
        printf("\n");
    }
    fclose(fp);

    
    return 0;
}

9.   格式化的读写函数:   fscanf和fprintf     
   格式:fscanf (文件指针,格式字符串,输入表列);
                fprintf (文件指针,格式字符串,输出列表);

#include <stdio.h>


void test(){

    
    //定义文件指针,并且打开文件
    FILE *fp =fopen("fprintf.txt", "w");
    if (fp!=NULL) {
        
        int a = 3,b = 4;
        //格式化写入
        fprintf(fp,"%d#%d;",a,b);
        printf("写入成功!\n");
        
        
    }
    fclose(fp);

}

int main(int argc, const char * argv[]) {
    
   
    
    //使用fprintf函数,格式化写入数据到文件中
    
    //定义文件指针,并且打开文件
    FILE *fp =fopen("fprintf.txt", "r");
    if (fp!=NULL) {
        
        int m=0,n=0;  //定义连个变量
        //从文件中读取数据到变量中
        fscanf(fp, "%d#%d;",&m,&n);
        
        printf("m = %d,n = %d\n",m,n);
       
        
        
        
    }
    fclose(fp);
    return 0;
}
 10. feof函数用来判断文件是否结束,  feof(fp)如果文件结束,feof(fp)的值为1(真)否则为假。   例如:
while(!feof(fp)){
c=fgets(fp);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值