C語言快速入門系列(八),c語言快速入門系列
C語言快速入門系列(八)
C語言位元運算與檔案
本章引言:
在不知不覺中我們的C快速入門系列已經慢慢地接近尾聲了,而在這一節中,我們會對
C語言中的位元運算和檔案進行解析,相信這兩章對於一些人來說是陌生的,因為很多
老師都會跳過這兩個大知識點,其實這兩個也是灰常重要的!比如一個問題,叫你算
變數a乘以2,怎麼寫效率高?直接a *2,很多人都這樣寫,但是如果你會位元運算的話,你會a<<1;
位元運算的效率可是比a*2高的哦!另一個問題,不用變數左中間值,直接交換兩個變數的值?
你怎麼做?也是用到位元運算!檔案操作重要性就不用說啦!好了,請讀者跟隨筆者的腳步
對C語言中的位元運算與檔案讀寫的核心知識點進行剖析吧~
本節學習路線圖:
位元運算:
ps:位元運算符並不改變變數自身的值,可以在運算子後加上等號: a &= b
等同於a = a&b !
檔案:
文字檔的使用方式:
| "r" |
唯讀方式開啟一個文字檔,只允許度資料,不存在則開啟失敗 |
| "w" |
唯寫方式開啟或建立一個文字檔,只允許寫資料 |
| "a" |
追加的方式開啟一個文字檔,可在檔案尾寫資料,不存在則建立一個 |
| "r+" |
讀寫方式開啟一個文字檔,允許讀寫,不存在,開啟失敗 |
| "w+" |
讀寫方式開啟或建立一個文字檔,允許讀寫 |
| "a+" |
讀寫方式開啟文字檔,在檔案末尾追加資料,不存在則建立一個 |
ps:對於二進位檔案,對應的只要改成在每個後面加上一個b就可以了:
如: r --> rb r+ = rb+
檔案詳細學習圖:
使用程式碼範例:
①單個字元寫入/讀取
寫入: fputc()
<span style="font-family:Microsoft YaHei;">#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;} </span>
讀取:fgetc()
<span style="font-family:Microsoft YaHei;">#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;} </span>
運行:
ps:如果不寫完整路徑的話,比如:d:\\c_code\\day 8的話,會在代碼所在的目錄下產生對應的文字檔!
②讀寫一個字串:
寫入fputs()
<span style="font-family:Microsoft YaHei;">/*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;}</span>
讀取:fgets()
<span style="font-family:Microsoft YaHei;">/* 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;}</span>
運行:
③格式化讀寫函數
這個和之前學的scanf()和printf()使用方法一樣,但是,前者是針對記憶體中的資料的;
而fscanf(0和fprintf()則對應檔案讀寫的!
ps:要注意哦!fprintf是將控制台的內容列印到檔案中哦!所以是寫入
fscanf()是將檔案中的內容輸入到控制台哦! 所以是讀取
寫入fprint:
<span style="font-family:Microsoft YaHei;">#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;}</span>
讀取fscanf()
<span style="font-family:Microsoft YaHei;">#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;}</span>
運行:
二進位檔案的讀寫
範例程式碼:將學生資訊儲存到結構體中,然後通過fwrite()函數將結構體內容寫入檔案中;
在通過fread()函數讀取出來
①資料區塊方式寫入:
範例程式碼:
<span style="font-family:Microsoft YaHei;">#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;}</span>
運行:
②資料區塊方式讀取:
範例程式碼:
<span style="font-family:Microsoft YaHei;">#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;}</span>
②字輸入/輸出函數
getw和putw兩個函數並不是ANSI C標準定義的函數,但很多的C語言編譯系統都提供這兩個函數,
如果沒提供也可以自己寫,這個用的不多,就不給出程式碼範例了,只給出函數用法:
putw(n,fp):以二進位的形式將一個int類型的資料寫入到fp所指向的二進位檔案中!
n為寫入的整數,執行正常返回寫入的整數,否則返回EOF
getw(fp):從fp指向的二進位檔案中以二進位的方式讀取一個字
執行正常返回所讀取的二進位整數,否則返回EOF
本章小結:
①位元運算:
1.什麼是位元運算,位元運算的6個運算子的作用
2.位元運算的使用,原碼,補碼與反碼的概念
3.位元運算的相關應用(代替乘法運算,不使用中間變數等)
②檔案
1.為什麼要用檔案?檔案的分類
2.檔案類型指標 FILE *fp;
3.檔案開啟關閉: fopen()開啟 fclose()關閉
4.檔案的讀寫操作 1)字元讀寫:fgetc 和 fputc 2)字串讀寫:fgets 和 fputs
3)格式化讀寫:fscanf 和 fprintf 4)資料區塊讀寫:fwrite 和 fread
5)字讀寫(整數) getw和putw
5.檔案定位: rewind(fp) 移動指標到檔案頭 fseek()將指標移動到某個地方
ftell(fp) 返回指標的相對位移量
6.檔案狀態檢查函數:feof(fp)檔案是否結束 ferror(fp)執行輸入輸出時檔案是否出錯,返回0表示沒出錯
clearerr(fp):重新設定檔案出錯標誌,無返回值
C語言怎快速入門
入門的話,基本就是資料類型、幾種文法結構、C語言書寫格式知道就好,其他主要看自己的思維怎麼樣(就是演算法了),還有的話就是自訂函數
一個C語言小白,怎快速入門
很多人對學習C語言感到無從下手,經常問我同一個問題:究竟怎樣學習C語言?我是一個教師,已經開發了很多年的程式,和很多剛剛起步的人一樣,學習的第一個電腦語言就是C語言。經過這些年的開發,我深深的體會到C語言對於一個程式設計人員多麼的重要,如果不懂C語言,你想寫底層程式這幾乎聽起來很可笑,不懂C語言,你想寫出優秀高效的程式,這簡直就是天方夜譚。為什麼C語言如此重要呢? 第一:C語言文法結構很簡潔精妙,寫出的程式也很高效,很便於描述演算法,大多數的程式員願意使用C語言去描述演算法本身,所以,如果你想在程式設計方面有所建樹,就必須去學它。第二:C語言能夠讓你深入系統底層,你知道的作業系統,哪一個不是C語言寫的?所有的windows,Unix,Linux,Mac,os/2,沒有一個裡外的,如果你不懂C語言,怎麼可能深入到這些作業系統當中去呢?更不要說你去寫它們的核心程式了。第三:很多新型的語言都是衍生自C語言,C++,Java,C#,J#,perl...哪個不是呢?掌握了C語言,可以說你就掌握了很多門語言,經過簡單的學習,你就可以用這些新型的語言去開發了,這個再一次驗證了C語言是程式設計的重要基礎。還有啊,多說一點:即使現在招聘程式員,考試都是考C語言,你想加入it行業,那麼就一定要掌握好C語言。那麼究竟怎樣學習C語言呢?1:工欲善其事,必先利其器這裡介紹幾個學習C語言必備的東東:一個開發環境,例如turbo C 2.0,這個曾經佔據了DOS時代開發程式的大半個江山。但是現在windows時代,用turbo C有感覺不方面,編輯程式起來很吃力,並且拖放,更沒有函數變數自動感應功能,查詢參考資料也不方便。建議使用Visual C++,這個東西雖然比較大塊頭,但是一旦安裝好了,用起來很方便。一本學習教程,現在C語言教材多如牛毛,但推薦大家使用《C語言程式設計》譚浩強主編 第二版 清華大學出版社,此書編寫的很適合初學者,並且內容也很精到。除此以外,現在有很多輔助學習的軟體,畢竟現在是Window時代了,學習軟體多如牛毛,不象我們當初學習,只有讀書做題這麼老套。我向大家推薦一個“整合學習環境(C語言)”,裡邊的知識點總結和常式講解都非常好,還有題庫測試環境,據說有好幾千題,甚至還有一個windows下的trubo C,初學者甚至不用裝其它的編譯器,就可以練習編程了,非常適合初學者。還有一個“C語言學習系統”軟體,不過感覺只是一個題庫系統,如果你覺得題做的不夠,不妨也可以試試。 2:葵花寶典學習電腦語言最好的方法是什嗎?答曰:讀程式。沒錯,讀程式是學習C語言入門最快,也是最好的方法。如同我,現在學習新的J#,C#等其他語言,不再是抱著書本逐行啃,而是學習它們的常式。當然,對於沒有學過任何電腦語言的初學者,最好還是先閱讀教程,學習完每一章,都要認真體會這一章的所有概念,然後不放過這一章中提到的所有常式,然後仔細研讀程式,直到每一行都理解了,然後找幾個編程題目,最好是和常式類似的或一樣的,自己試圖寫出這段已經讀懂的程式,不要以為常式你已經讀懂了,你就可以寫出和它一樣的程式,絕對不一定,不相信你就試一試吧,如果寫不出來,也不要著急,回過頭來再繼續研究常式,想想自己為什麼寫不出來,然後再去寫這段程式,反反覆複,直到你手到擒來為止,祝賀你,你快入門了。3:登峰造極寫程式的最高境界其實就是掌握各種解決問題的手段(資料結構)和解決問題的方法(演算法)。是不是寫出底層程式就是程式設計高手呢?非也,寫底層程式,無非是掌握了硬體的結構,況且硬體和硬體還不一樣,要給一個晶片寫驅動......餘下全文>>