C語言回顧-結構體、枚舉和文件

1.構造類型數組

根據已經定義的一個或多個數據類型用構造的方法來定義。函數

分爲:數組、結構體和共用體ui

2.結構體spa

struct 結構體名{指針

  成員列表;  code

};blog

1)結構體定義完成之後,計算機不會給結構體分配存儲空間three

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\n",stu1.name);
    printf("%s\n",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\n",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(字符串,長度,文件指針);遇到\n或者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(文件指針);//清楚出錯標誌

相關文章
相關標籤/搜索