zoukankan      html  css  js  c++  java
  • C语言回顾-结构体、枚举和文件

    1.构造类型

    根据已经定义的一个或多个数据类型用构造的方法来定义。

    分为:数组、结构体和共用体

    2.结构体

    struct 结构体名{

      成员列表;  

    };

    1)结构体定义完成以后,计算机不会给结构体分配存储空间

    2)会在定义结构体变量后,分配存储空间

    struct student stu;//可以定义多个

    3)匿名结构体

    struct{

      char * color;

      int  age; 

    }stu1,stu2;

    4)结构体中成员的访问

    用点

    stu1.age

    5)结构体的初始化

    //
    //  main.c
    //  结构体
    //
    //  Created by fanyafang on 15/11/5.
    //  Copyright © 2015年 itcast. All rights reserved.
    //
    
    #include <stdio.h>
    #include <string.h>
    
    int main(int argc, const char * argv[]) {
        //先定义后初始化
        struct student{
            int age;
            char name[21];
        }stu1,stu2;
        stu1.age=10;
        //stu1.name="fffff";
        strcpy(stu1.name, "fanffff");
        
        //定义的同时初始化
        struct student stu={22,"ddd"};
        struct student stu3={.name="ssssssd"};
        
        printf("%s
    ",stu1.name);
        printf("%s
    ",stu.name);
        return 0;
    }

    3.结构体占用的内存空间是每个成员占用的字节数之和(考虑对齐的问题)

    计算结构体变量在内存中占用的字节数的方法

    1)先找对齐的模数:是结构体中的基本数据类型中占用字节数最大的那个

    2)在计算结构体变量的各个成员占用的字节和

    4.结构体作用域

    全局和局部

    5.结构数组

    struct student{
            int age;
            char name[21];
        }stu[3];

    6.结构指针:指向结构体变量的指针

      struct student *p=&stu;

      访问方式:(*p).age或者p->age

    7.结构体的嵌套:结构体的成员又是另外一个结构体变量,不可以嵌套自己这个类型的变量,但可以嵌套当前类型的指针

    访问的时候用多个点

    8.用结构体变量作为函数参数:值传递

    结构体指针作为函数参数:地址传递

    9.枚举

    可看做基本数据类型

    //
    //  main.c
    //  枚举
    //
    //  Created by fanyafang on 15/11/5.
    //  Copyright © 2015年 itcast. All rights reserved.
    //
    
    #include <stdio.h>
    
    int main(int argc, const char * argv[]) {
        
        //
        //enum Week{one,two,three};
        
        //enum Week week;
        enum Week{one,two,three}week;
        
        week=two;
        
        printf("%d
    ",week);
        return 0;
    }

    10.typeof给已经存在的类型取别名

    typeof int MALATANG;

    MALATANG a=10;

    用在数组:

    typeof int ARRAY[5];//int a[5];

    ARRAY a1={1,2,3,4,5};

    用在结构体:

    typeof struct person p;

    11.预处理指令

    以#开头的指令,宏定义define,文件包含include,条件编译

    宏定义:#define M 5*5+5

    1)替换时不加括号

    2)字符串中的不会被替换

    3)#undef M;//取消宏定义

    4)可以嵌套

    5)可以加参数 #define M(a)  a*a+5

    要把参数代入替换

    6)有参宏传递参数的时候最好加括号

    12.条件编译,减少.o文件的大小

    #if #else #elif #endif

    #ifdef//检测宏是否定义

    #ifndef

    13.static延长变量的生命周期

    1)static定义局部变量的语句只会被执行一次(放在数据区)

    2)static修饰的全局变量只能在当前文件中使用(内部变量)

      在不同的文件中static可以声明相同的变量

    3)static修饰的函数是内部函数,只能在当前文件中使用

    14.extern

    1)不能修饰局部变量

    2)extern修饰的全局变量,可以在其他文件中使用

       extern生命的全局变量在不同的文件中不能同名

       在使用之前可以声明,extern int a;

    3)extern修饰的函数可以在其他文件中使用

    15.文件

    ascii文件和二进制文件

    头文件stdio

    文件缓冲区,系统自动地在内存中为每个正在使用的文件开辟一个文件缓冲区

    1)文件指针FILE *fp;

    2)文件的打开:fp=fopen("a.txt",'r');打开成功返回首地址,打开失败返回NULL

    3)文件关闭:fclose(fp);正常关闭返回为0;

    4)文件的使用方式

    'r' 'w' 'a' 'r+' 'w+' 'a+' 't' 'b'

    5)文件输入输出函数

    fputc(字符,文件指针);

    fgetc(文件指针);//指针自动偏移每次读一个字符

    ///Users/fanyafang/Library/Developer/Xcode/DerivedData/OC2-fdozqblmcmvpugdcerdoucgzrwvl/Build/Products/Debug/
        //文件在这个目录下找
        //写入和读取一个字符
        FILE *fp=fopen("a.txt", "r");
        if(fp!=NULL){
            char ch='x';
            //fputc(ch,fp);
            //printf("写入成功");
            
            ch=fgetc(fp);
            
            printf("读取成功%c",ch);
        }else{
            printf("打开失败");
        }
        fclose(fp);
    //写入和读取一个字符串
        char ch[]="i love chaina";
        FILE *fp=fopen("a.txt", "r+");
        if(fp!=NULL){
            /*
             for(int i=0;i<strlen(ch);i++){
             fputc(ch[i],fp);
             }
             
             printf("写入成功");
             */
            
            char s=fgetc(fp);
            while (s!=EOF) {
                putchar(s);
                s=fgetc(fp);
            }
            
            printf("读取成功");
        }else{
            printf("打开失败");
        }
        fclose(fp);

    fputs(字符串,文件指针);

    fgets(字符串,长度,文件指针);遇到 或者EFO结束,读一行

    //写入和读取一个字符
        //char ch[]="i love chaina33333sssss";
        FILE *fp=fopen("a.txt", "r+");
        if(fp!=NULL){
            
            //int count=fputs(ch, fp);
            
            //printf("写入成功,写入%d个字符",count);
           
            
            char s[100];
            fgets(s, 100, fp);
            printf("%s",s);
    
        }else{
            printf("打开失败");
        }
        fclose(fp);
        

    fread(buffer,size,count,fp);

    fwrite(buffer,size,count,fp);

    //写入和读取
        char ch[]="i love chaina555555";
        FILE *fp=fopen("a.txt", "r+");//wb写入二进制文件
        if(fp!=NULL){
            
            fwrite(ch, strlen(ch), 1, fp);
            printf("写入成功");
           
            rewind(fp);//文件指针再指到开始位置
            char s[100];
            fread(s, sizeof(s), 1,fp);
            printf("%s",s);
    
        }else{
            printf("打开失败");
        }
        fclose(fp);

    fprintf(fp,"%d#%d",a,b);

    fscanf(fp,"%d#%d",&a,&b);

    文件的随机读写

    rewind(文件指针);//将指针移到文件首

    fseek(文件指针,位移量,起始点);//将指针从起始点移动,一般用于读写二进制文件

    起始点0SEEK_SET,1SEEK_CUR,2SEEK_END

    feof(文件指针);//检测文件是否到末尾

    ferror(文件指针);//判断是否读取错误

    clearerror(文件指针);//清楚出错标志

  • 相关阅读:
    (Java随机数举例)随机扔一千次硬币的正反次数
    hibernate+spring的整合思路加实例(配图解)
    从零开始学C++之IO流类库(三):文件的读写、二进制文件的读写、文件随机读写
    ssh连接Linux自动断开后再也无法连上的问题
    面试题10:二进制中1的个数
    C 语言统计关键字出现次数
    在Eclipse中Attach Source
    Visual Sudio 2012转换界面风格
    java 判断字符串IP合法性以及获取IP的数值形式
    java.lang.string split 以点分割字符串无法正常拆分字符串
  • 原文地址:https://www.cnblogs.com/fanglove/p/4940236.html
Copyright © 2011-2022 走看看