小豬的C語言快速入門系列(八)

coder-pig發表於2017-10-17

小豬的C語言快速入門系列(八)

標籤: C語言


本節引言

本節講解的是C語言中的位運算與檔案,相信這兩章對於部分童鞋來說是陌生的,
因為很多大學的老師都會選擇跳過這兩個知識點,其實這兩個知識點也是非常
重要的,比如位運算,比如讓你算a*2,怎麼寫效率(裝逼)高,如果你會位運算
你會 a<<1,效率可比a*2高哦,另外一個常見的問題,怎麼不使用中間值
變數交換兩個變數的值?而檔案操作的重要性也不用說吧,一般期末都會讓你
做一個xx管理系統之類的東東,存取檔案基本是必不可少的!


本節學習路線圖


位運算

Tips:

位運算子並不改變自身的值,如果你想要改變自身的值,可以在運算子的後面
加上等號: a &= b; 等價於 a = a & b;


檔案


1.文字檔案的使用方式

讀寫字元 作用
r 只讀方式開啟一個文字檔案,只允許度資料,不存在則開啟失敗
w 只寫方式開啟或建立一個文字檔案,只允許寫資料
a 追加的方式開啟一個文字檔案,可在檔案尾寫資料,不存在則建立一個
r+” 讀寫方式開啟一個文字檔案,允許讀寫,不存在,開啟失敗
w+” 讀寫方式開啟或建立一個文字檔案,允許讀寫
a+” 讀寫方式開啟文字檔案,在檔案末尾追加資料,不存在則建立一個

2.檔案詳細學習圖


3.使用程式碼示例


  • 單個字元寫入(fputc())/讀取(fgetc())
#include <stdio.h>  
#include <string.h>  
int main()  
{  
    FILE *fp;  
    char str[] = "Write The Data to File!";  
    int index = 0;  
    fp = fopen("test1.txt","w");  
    if(fp == NULL)  
    {  
        printf("檔案開啟失敗!\n");  
        exit(1);  
    }  
    //因為是一個個字元輸入的,所以要獲得長度   
    while(index < strlen(str))  
      fputc(str[index++],fp);  
    fclose(fp);   
    return 0;  
} 
#include "stdio.h"  
int main()  
{  
    FILE *fp;  
    char c;  
    int n = 1;  
    if((fp = fopen("test1.txt","r")) == NULL)  
    {  
        printf("檔案開啟失敗!\n");  
        exit(1);   
    }  
    //EOF是檔案結尾的標誌,此處是判斷是否到檔案尾     
    while((c = fgetc(fp)) != EOF)  
    {  
        printf("%c",c);  
        n++;  
    }  
    printf("\n");  
    fclose(fp);  
    return 0;  
}

執行結果

PS:如果不寫完整路徑的話,比如:d:\\c_code\\day 8的話,會在程式碼所在的
目錄下生成對應的檔案。


  • 讀(fgets())寫(fputs())一個字串
/* 
    fputs(字串,fp) 
    作用:向fp所指的檔案中,將字串寫入,'\0'並不寫入!  
*/  

#include <stdio.h>  
int main()  
{  
    char str[] = "通過fputs方法往檔案中寫入資訊!";  
    FILE *fp = fopen("test2.txt","w");  
    if(fp == NULL)  
    {  
        printf("檔案開啟失敗!\n");  
        exit(1);  

    }  
    fputs(str,fp);  
    fclose(fp);  
    return 0;  
}
/* 
     fgets(字串陣列,n,檔案指標) 
     就是:從fp執指向的檔案中讀取一個長度為n - 1的字串, 
     儲存在一維字元陣列中,因為字串會預設新增一個'\0'  
*/  

#include <stdio.h>  
int main()  
{  
    FILE *fp;  
    char str[20];  
    if((fp = fopen("test2.txt","r")) == NULL)  
    {  
        printf("檔案開啟失敗!\n");  
        exit(1);  
    }  
    //這裡寫3是因為,漢字是佔2個位元組的   
    while(fgets(str,3,fp) != NULL)  
    printf("%s",str);  
    printf("\n");  
    fclose(fp);  
    return 0;  
}

執行結果


  • 格式化讀(fprintf)寫(fscanf)函式

這個和前面學的scanf和printf使用方法是一樣的,不過前者們
是針對記憶體中的資料的!而後者是針對檔案讀寫的,fprintf
將控制檯的內容列印到檔案中,所以是寫入fscanf則是將
檔案的內容輸入到控制檯,所以是讀取

#include <stdio.h>  
int main()  
{  
    char c[] = "Today is 2014 July ";  
    int day = 22;  
    char a = 't',b = 'h';  
    FILE *fp;  
    if((fp = fopen("test3.txt","w"))== NULL)  
    {  
        printf("檔案開啟失敗!\n");  
        exit(1);      
    }  
    fprintf(fp,"%s%d %c%c",c,day,a,b);  
    fclose(fp);  
    return 0;  
}
#include <stdio.h>  
int main()  
{  
    //這裡很容易出問題,所以我並不喜歡用fscanf這個函式   
    char c1[5],c2[5],c3[5],c4[5],c5[5],c6[5];  
    int day,year;  
    FILE *fp;  
    if((fp = fopen("test3.txt","r"))== NULL)  
    {  
        printf("檔案開啟失敗!\n");  
        exit(1);      
    }  
    //這個要按照讀取的檔案的格式寫,我弄了N久還是不行  
    //就直接用6個字串了...   
    fscanf(fp,"%s%s%s%s%s%s",&c1,&c2,&c3,&c4,&c5,&c6);  
    printf("%s %s %s %s %s %s\n",c1,c2,c3,c4,c5,c6);  
    fclose(fp);  
    return 0;  
}

執行結果


  • 二進位制檔案的讀寫

資料塊方式寫入(fwrite())與讀取(fread())

程式碼示例

將學生資訊儲存到結構體中,然後通過fwrite()函式將結構體內容寫入檔案中;
在通過fread()函式讀取出來

#include <stdio.h>  

typedef struct  
{  
    int id;  
    char name[20];  
    int age;  
}STU;  

int main()  
{  
    STU stu;  
    FILE *fp;  
    char c;  
    //內容是追加的!   
    if((fp = fopen("test4.data","ab"))== NULL)  
    {  
        printf("檔案開啟失敗!\n");  
        exit(1);      
    }  
    //錄入多個學生的資訊:  
    while(1)  
    {  
        printf("請輸入學號: ");scanf("%d",&stu.id);  
        printf("\n請輸入姓名: ");scanf("%s",&stu.name);  
        printf("\n請輸入年齡: ");scanf("%d",&stu.age);  
        //引數依次是: 資料起始地址,每次寫入的資料塊的位元組數,資料塊的數目,檔案指標   
        fwrite(&stu,sizeof(stu),1,fp);  
        printf("\n繼續輸入?(Y/N)\n");  
        getchar();  
        c = getchar();  
        if(c == 'y' || c == 'Y')continue;  
        else break;  
    }   
    fclose(fp);  
    return 0;  
}
#include <stdio.h>  

typedef struct  
{  
    int id;  
    char name[20];  
    int age;  
}STU;  

int main()  
{  
    STU stu;  
    FILE *fp;  
    if((fp = fopen("test4.data","rb"))== NULL)  
    {  
        printf("檔案開啟失敗!\n");  
        exit(1);      
    }  
    //讀取儲存的學生資訊   
    printf("輸出檔案中的內容:\n");  
    printf("學生學號     學生姓名        學生年齡\n");  
    //從fp指向的二進位制檔案讀取資料,每次讀取大小為size個位元組的資料  
    //執行 1 次;最後將這些資料儲存到結構體變數的地址記憶體中  
    //返回值正常時是讀取的資料庫個數(count)的值,否則返回0(錯誤或檔案尾)   
    while(fread(&stu,sizeof(stu),1,fp) == 1)  
    {  
        printf("%-15d%-15s%-15d\n",stu.id,stu.name,stu.age);  
    }  
    fclose(fp);  
    return 0;  
}

輸出結果

   


字寫入(putw(n,fp))/讀取(getw(fp))函式

getw與putw兩個函式並不是ANSI C標準定義的函式,但很多C語言編譯系統都有
提供這兩個函式,如果沒有提供也可以自己寫,這個用得不多,就不給出具體
程式碼示例了,只給出函式的用法介紹。

  • putw(n,fp):以二進位制的形式將一個int型別的資料寫入到fp所指向的
    二進位制檔案中! n為寫入的整數,執行正常返回寫入的整數,否則返回EOF
  • getw(fp):從fp指向的二進位制檔案中以二進位制的方式讀取一個字
    執行正常返回所讀取的二進位制整數,否則返回EOF

本文連結小豬的C語言快速入門系列(八)
作者:Coder-Pig
出處http://blog.csdn.net/coder_pig
本文基於知識共享署名-相同方式共享 4.0 國際許可協議釋出,歡迎轉載,
演繹或用於商業目的,但是必須保留本文的署名及連結。åç


相關文章