算法的主要特征:
1.有窮性
2.确定性
3.可行性
4.零個或多個輸入
5.一個或多個輸出
注釋格式:
// 單行注釋
/**/ 多行注釋
VC++6.0快捷鍵:
F10:單步執行,不進入函數的内部。
F11:單步執行,進入函數的内部。
F5:執行到下一個斷點。
Ctrl+F10:運作到光标處中斷。
Shift+F5:停止調試。
C語言的資料類型:
基本資料類型:
整型:int
實型:float、double
字元型:char
構造資料類型:
數組:[]
結構體:struct
共用體:union
枚舉:enum
指針資料類型:*
空類型:void
常見的轉義字元:
'\0' 結束标志,這是八進制的表示方法。
'\n' 輸出到螢幕和文本檔案是回車或換行,如果輸出到二進制檔案僅僅是換行。
'\r' 回車,不換行。
'\t' 制表鍵,占用8個字元。
'\f' 換頁。
'\b' 倒退。
'\\' 反斜線。
'\'' 單引号。
'\"' 雙引号。
'\ddd' 1~3位ASCII碼對應的字元。
'\xhh' 1~2十六進制的數組對應的字元。
使用const關鍵字定義常變量。
運算符的優先級:
1. () [] . -> 圓括号運算符 下标運算符 成員運算符
2. ! ~ ++ -- + - (資料類型) * & sizeof 邏輯運算符 按位取反運算符 自增、自減運算符 正、負運算符 類型運算符 指針運算符 取位址運算符 求類型長度運算符
3. * / % 乘法運算符 除法運算符 取模運算符
4. + - 加減運算符
5. << >> 左移運算符 右移運算符
6. < <= > >= 關系運算符
7. == != 關系運算符
8. & 按位與運算符
9. ^ 按位異或運算符
10. | 按位或
11. && 邏輯與運算符
12. || 邏輯或運算符
13. ?: 條件運算符
14. = += -= *= /= %= >>= <<= &= ^= |= 指派及符合運算符
自動資料類型轉換法則:
char、short---->int---->unsigned---->long---->double
float---------------------------------------->double
單字元輸入輸出函數:
putchar(int ch)
如果輸出失敗,就傳回EOF。
int getchar()
接受過程中出現錯誤傳回EOF。
getchar()是一個緩沖輸入函數。在輸入字元後必須按ENTER鍵才可以接受資料。
如果接受的是數字,也會當做字元處理。
空格、Tab鍵、Enter鍵等都會作為getchar()函數的能接受的有效字元。
如果輸入多于一個字元,就隻會接受一個字元,如果要接受一個字元串,要結合循環使用。
printf()格式輸出函數:
printf(格式控制串,輸出清單)
格式說明:
%标志字元 輸出最小寬度 .精度 長度 格式字元
格式字元功能:
int:
d 以十進制形式輸出帶符号的整數,整數不輸出符号。
o 以八進制形式輸出無符号的整數,不輸出字首0。
x 以十六進制形式輸出無符号整數,不輸出字首0x。
u 以十六進制形式輸出無符号整數。
char:
c 輸出一個字元
s 輸出一個字元串
float:
f 以小數形式輸出單雙精度實數,預設小數位數是6位。
e 以指數的形式輸出單雙精度的實數。
g 以%f%e中較短的輸出寬度輸出單雙精度實數。
其他:
% 輸出百分号。
标志字元功能:
- 輸出結果預設右對齊,如果實際位數少于定義的寬度,則左邊的使用空格補齊,使用-左對齊的時候,右邊填充的空格。
+ 輸出資料前面使用符号(正号或負号)
# 對c/s/d/u類無任何影響;對于o,在輸出時加上字首0x;對于e/g/f,當有結果存在小數點時i,才會加上小數點。
空格 輸出資料為正數的時候前面有空格。
0 如果實際位數少于定義的寬度,就會左邊用0補齊,但是與“-”一起使用的時候不起作用,此時使用空格填充。
scanf(格式控制串,位址清單)格式化輸入函數:
%* 寬度 長度 格式字元
d 輸入十進制整數
o 輸入八進制整數
x 輸入十六進制整數
u 輸入無符号十進制整數
c 輸入一個字元
s 輸入一個字元串
float:
f或e 輸入實型數(用小數形式或指數形式)
使用scanf()函數的問題:
1.雖然scanf()函數的本質是從鍵盤輸入資料存放到變量鎖對應的記憶體空間中,但是scanf()函數的位址清單中要求給出的是變量的首位址。
2.遇到目前的資料的輸入認為是資料的結束:
1.遇到間隔符:空格、Tab、Enter
2.遇到寬度限制
3.遇到非法資料
常用的數學函數math.h:
double sqrt(double x):求平方根
int abs(int x):求整數絕對值
double fabs(double x):求實數絕對值
double pow(double x,double y):幂函數
常用字元函數ctype.h:
int tolower(int c):轉換為小寫字母
int toupper(int c):轉換為大寫字母
int isalpha(int c):判斷是否為英文字元,A-Z傳回為1,a-z傳回為2,其他傳回0。
常用工具函數:
time_t time(time_t *t):擷取目前系統的月曆時間如果參數為NULL,傳回目前時間。time.h。
int rand():随機數函數,傳回0-RAND_MAX之間的随機數。stdlib.h。
void srand(unsigned seed):提供随機數種子,常用系統時間最為随機種子。stdlib.h。
void exit(int status):結束目前程式,參數為1表示正常結束,參數為0表示異常結束。stdlib.h。
選擇結構:
if(表達式){
語句;
}else{
}
}else if(表達式){
條件表達式:
表達式?表達式:表達式
switch(表達式){
case 常量表達式 :
語句序列;
break;
...
default:
循環結構:
while(表達式){
do{
}whlie(表達式);
for(循環變量初始化;循環控制條件;變量值改變){
break語句:
結束循環,執行下面的語句。
continue語句:
結束本次循環,執行下一次循環。
return語句:
跳出函數,結束程式。
main()也是函數。
資料類型的轉換:
1.若參與運算量的類型不同,則先轉換成統一類型,然後進行運算。
2.轉換按照資料資料類型長度增加的方向進行,以保證精度不降低。
3.所有浮點數運算都是以雙精度進行的,即使是單精度的表達式,也要轉換成double類型進行運算。
4.char型和shaort型參與運算時,必須轉換成int型。
強制資料類型轉換:
(類型說明符)(表達式)
基本的算術運算符:
+ 向右結合
- * / 向左結合
自增自減運算符:
++ --
逗号運算符:
間隔多個表達式。
C語言不允許動态定義數組的大小,也就是C語言的數組大小不依賴于運作中變量的值。
數組的初始化指派是在編譯階段進行的,這樣減少運作時間,提高了程式的運作效率。
C語言編譯系統會為二維數組配置設定一片連續的空間,按照行優先原則存儲數組中的各個元素值。
數組的初始化可以使用循環代替。
一維數組的定義:
存儲類型 資料類型 數組名 [整型常量表達式]
一維數組的使用:
數組名[下标]
一維數組的初始化:
存儲類型 類型說明符 數組名 [整型常量表達式] = {初始值清單};
二維數組的定義:
存儲類型 資料類型 數組名 [一維數組常量表達式][二維數組整型常量表達式]
二維數組的初始化:
二維數組的初始化可以預設第一位數組的長度。
使用數組求斐波那契數列(第N個資料和第N+1個資料的和等于第N+2個資料):
#include <stdio.h>
void main() {
int fibs[20] = { };
fibs[0] = 1;
fibs[1] = 1;
for (int i = 1; i < 20; i++) {
fibs[i + 1] = fibs[i - 1] + fibs[i];
for (int i = 0; i < 20; i++) {
printf("%d", fibs[i]);
printf("\t");
實作數組的冒泡排序:
int arr[] = {12,45,7,24,57,58,4};
int i;
for(i = 0; i < 7; i++) {
printf("%d",arr[i]);
printf(" ");
int temp = 0;
int j;
for(j = 0; j < 6; j++) {
for(i = 0; 6 - i; i++) {
if(arr[i+1] > arr[i]) {
temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
printf("\n");
字元串常量:
C語言中沒有專門存儲字元串的變量,如果要存儲字元串變量需要使用字元數組。
字元數組的末尾使用'\0'表示結束。
可以使用字元串輸入函數char *gets(char *str)來輸入字元,使用回車符作為結束标志,并将回車符轉換為'\0'存儲到數組。
使用函數int puts( char *str )輸出字元串。
char
字元常量使用單引号,字元串常量使用雙引号。
字元常量隻可以是單個字元,字元串常量可以是多個字元。
字元常量占一個記憶體空間。
字元串常量占的字元數加1.
增加的一個位元組中存放字元"\0",表示字元串結束。
求字元串長度函數:unsigned int strlen(const char *str)函數.
字元串複制函數:char * strcpy(char *str1,const char *str2)包含結束标志複制str2到str1中。函數傳回str1的位址。
字元串連接配接函數:char *strcat(char *str1,const char *str2),函數傳回str1的位址。str1追加到尾部,str2不變。
字元串比較函數:int strcmp(const char *str1,const char *str2),如果str1小于str2傳回-1,如果str1大于str2傳回1,相同傳回0。
注意:
1.strcmp()功能是比較兩個字元串的大小而不是長短,按照ASCII值逐個進行比較。
2.隻是比較字元串的大小,不會改變字元串。
3.比較兩個不可以直接使用關系運算符。
一個源檔案有N個函數組成。
一個源檔案是一個編譯機關。
在程式編譯的時候是以源檔案為機關進行編譯的。
C從main函數開始執行。
函數從使用者的角度進行分類:标準函數(庫函數)、使用者自定義函數。
函數從形式上分為:無參函數、有參函數。
在定義的函數中指定的形式參數,在未出現函數的調用時,并不會占用記憶體空間。
在發生函數的調用的時候,函數中的形式參數才會占用記憶體空間。
函數一旦調用完畢,形式參數占用的記憶體單元會被釋放。
在C語言中,實參向形參的傳遞是值傳遞。
在記憶體中實參與形參配置設定到不同的記憶體單元。
在C語言中凡是不加資料類型說明的,編譯器都會按照整型處理。
C++要求所有函數必須都指定函數類型。
如果函數的資料類型與return傳回的資料類型不一緻,将會進行資料類型轉換。
函數的資料類型将會決定傳回值的資料類型。
如果實參清單包括多個實參,對實參求值的順序并不是确定的。
有的系統按照自左到右的順序進行實參的傳值。
有的系統按照自右到左的順序進行實參的傳值。
函數的聲明和定義并不是一回事:
函數的定義是指對函數功能的确定,包括制定函數名,函數值類型,形參及其類型,函數體等等。
它是一個完整的、獨立的函數機關。
函數的聲明作用是把函數的名字,函數類型以及形參的類型、個數、順序通知編譯系統。
以便于在調用函數的時候按照對此進行對照檢查。
變量的存儲方式:
1.所謂靜态存儲方式是指在程式運作期間有系統配置設定固定的存儲空間的方式。
2.動态存儲方式是在程式運作期間根據需要進行動态配置設定存儲空間的方式。
函數定義:
函數傳回值類型 函數名(形參清單){
函數功能語句;
函數調用:
函數名(實參清單);
使用者存儲空間:
1.程式區
2.動态存儲區
3.靜态存儲區
變量的存儲類别:
在C語言中每一個變量和函數有兩個屬性:資料類型和資料的存儲類别。
存儲類别指的是資料在記憶體中存儲方式。
存儲方式分為兩大類:
靜态存儲類和動态存儲類。
自動的:auto
函數中局部變量,如果不專門聲明為static存儲類别,都是動态的配置設定存儲空間的(棧),資料存儲在動态存儲區中。
函數中的形式參數和在函數中定義的變量(包括在複合語句中定義的變量),都屬于此類變量。
在函數調用結束時,就會自動釋放這些存儲變量。
auto關鍵字可以省略。預設就是auto類型。
靜态的:static
有時候希望函數中的局部變量的值在函數調用結束後不希望消失。
就是函數調用結束後保留這個值。
這就要指定問靜态局部變量。
雖然靜态局部變量在函數調用結束後仍然存在,但是其他函數不能引用它的。
寄存器的:register
為了執行效率,C語言允許将局部變量的值放在CPU中的寄存器中,需要時直接取出參數參加運算。
不需要再到記憶體中讀取。
外部的:extern
外部變量就是全局變量,它的作用域是從變量的定義處開始的,到本程式檔案的末尾。
在此作用域内,全局變量可以為程式中的各個函數鎖引用。編譯的時候外部變量配置設定在靜态存儲區。
有時候需要使用extern來聲明外部變量的作用域。
有時候在程式設計中希望某些外部變量隻限于被本檔案引用,而不是被其他檔案引用。
這時候可以定義外部變量是加一個static聲明。
關于變量的聲明和定義:
對于變量而言,聲明與定義的關系稍微有點複雜,在聲明部分出現的變量有兩種情況:
1.需要建立存儲空間的
2.不需要建立存儲空間的
前者成為定義性聲明,叫做定義。
廣義的說,聲明包括定義,但是所有的聲明都是定義。
對于int a;既是聲明也是定義,對于extern a;僅僅是聲明。
一般為了叙述友善,把建立存儲空間的聲明稱為定義,把不需要建立存儲空間的聲明叫做聲明。
記憶體區的每一個位元組都有編号,這就是位址。
如果在程式中定義了一個變量,在程式編譯的時候,系統就會給這個變量配置設定記憶體單元。
在C語言中,對變量的通路有兩種方式:直接通路,間接通路。
* :取值操作符
& :取址操作符
知道了變量的位址,就可以通過這個位址通路這個變量,是以又把變量的位址稱為這個變量的指針。
C語言中可以定義一類特殊的變量,這個變量專門用來存放變量的位址,叫做指針變量。
不要把一個任何非位址類型的資料指派給指針變量,否則編譯器會當做一個位址來處理。
&和*的優先級是相同的,但是自右向左結合。
需要說明的:C語言中調用函數時虛實結合的方法都是采用"值傳遞"方式。
當用變量名作為函數參數時傳遞的是變量的值。
當用數組名作為函數參數時。
由于組名代表的是數組的首元素位址,是以傳遞的值是位址,是以要求形式參數是指針變量。
多元數組與指針:
用指針變量可以指向一維數組中的元素,也可以執行多元數組中的元素。
字元數組用來存放一個字元串,然後輸出該字元串。
可以使用指針變量指向整型變量、字元串、數組、函數。
一個函數在編譯的時候被配置設定給一個入口位址。這個函數的入口位址就成為函數的指針。
指針數組:一個數組中的元素都是指針類型資料,指針數組中的每一個元素都是一個指針變量。
指針數組作為main函數的形參:
void main()
int main()使用return語句傳回0.
void指針:
void *p表示指針變量p不指向一個确定的類型資料,他僅僅是用來存放一個位址。
void指針它可以指向任何資料類型。
也就是說,可以用任何類型的指針直接給void指針指派。
但是,如果需要将void指針的值指派給其他類型指針,則需要進行強制類型轉換。
無參數宏定義:
#define 辨別符 字元串
凡是使用#開頭的代碼都是一條預處理指令。
define是宏定義指令。
辨別符是定義的宏名。
字元串可以是常數、表達式、格式串。
在編譯源程式的時候都需要先由預處理指令進行宏代換,然後再進行編譯。
宏定義是用宏名表示一個字元串,在宏展開的時候又以字元串取代宏名。
這是一個簡單的替換,字元串可以包含任何字元,可以是常數可以是表達式。
預處理程式對它不做任何檢查。
如果有錯誤,隻可以在編譯的時候宏展開後的源程式時發現。
宏定義不是說明或者是語句。在行末不必加入分号。如果加上了分号就會連分号也會置換。
宏定義必須寫在函數之外,其作用域是宏定義指令起到源程式結束。
如果過要終止其作用域可以使用#undef指令。
宏名在源程式中若用括号括起來,則預處理了程式不多其做宏替換。
宏定義允許嵌套,在宏定義的字元串中可以使用已經定義的宏名。在宏展開的時候由預處理程式層代換。
習慣上,宏名的定義使用大寫字母。
可以使用宏定義表示資料類型。
宏定義隻是簡單的字元串替換,是在預處理的時候完成的。
而typeof是在編譯的時候完後完成的。
typeof不會是簡單的替換,而是對類型說明符重新命名,被命名的辨別符具有類型定義說明的功能。
帶參數宏定義:
C語言允許帶參數宏定義,在宏定義中的參數叫做形式參數,在宏調用中的參數叫做實際參數。
對帶參的宏,在調用中,不僅會宏展開,而且要用實參去代換形參。
帶參宏定義的一般形式:
define 宏名(形參表) 字元串
帶參宏定義中,宏名和形參清單之間不可以有空格出現。
在帶參宏定義中,形式參數不配置設定記憶體單元,是以不需要做類型定義。
而調用中的實參有具體的值,要用它們去代換形參,是以必須要有類型說明。
這是與函數不同的情況。在函數的定義中,形式參數和實參是兩個不同的量,各自有自己的作用域。
調用時需要把實參值指派給形參,進行值傳遞。
在帶參宏中,隻是符号的代換,不存在值的傳遞。
宏定義中形參是辨別符,而宏調用中的實參可以是表達式。
宏定義中,字元串内的形參通常是要用括号括起來的,避免出錯。
宏定義也可以用來定義多個語句。
檔案包含:
一個include指令隻可以包含一個檔案。
檔案的包含允許嵌套。
包含指令中的檔案名可以使用尖括号或雙引号修飾。
使用尖括号,首先查找系統預定義的檔案。
使用雙引号,首先查找使用者自定義的檔案。
預處理程式提供了條件編譯的功能。可以按照不同的條件去編譯不同的程式部分,因而産生不同的目标代碼檔案。
這是對于程式的移植和調試很有用的。
1.控制條件為常量表達式的條件編譯:
#if 常量表達式
程式段
#endif
或:
#else
2.控制條件是定義辨別符的條件編譯:
#ifdef 辨別符
#endif 辨別符
結構體和共用體:
定義結構體:
struct 結構名{
成員清單
};
成員清單:
成員資料類型 成員名;
使用 結構體名.成員名; 調用。
定義并初始化結構體:
struct 結構體名{
}變量名1,變量名2={值初始化清單};
指向結構體類型的資料:
(*結構指針變量).成員名
結構指針變量->成員名
動态存儲配置設定:
C語言提供了一些記憶體管理函數,這些記憶體管理函數可以按需動态的配置設定記憶體空間。
可以把不在使用的空間回收,有效的利用記憶體資源。
配置設定記憶體空間函數:malloc、calloc
釋放記憶體空間函數:free
void *malloc(unsigned size)函數:
其作用是在記憶體的動态存儲區配置設定一個長度為size的連續空間。
此函數的傳回值是一個指向配置設定域起始位址的指針。類型是void。
如果此函數沒有成功的執行,則傳回空指針NULL。
void *calloc(unsigned n,unsigned size)函數:
其作用是在記憶體的動态存儲區中配置設定N個長度為size的連續空間。
函數傳回一個指向配置設定域起始位址的指針。
如果配置設定不成功,傳回NULL。
使用calloc函數可以為一維數組開辟動态存儲空間,n為數組的元素,每個元素的長度問size。
void free(void *p)函數:
其作用是釋放由調用calloc函數或malloc 函數傳回的值。
連結清單:
連結清單是一種動态的進行存儲配置設定的一種結構。
頭指針:存放一個位址,改位址指向第一個元素。
結點:使用者需要的實際資料和連結清單節點的指針。
動态連結清單:
是指在程式執行過程中從無到右的建立一個連結清單。
也就是一個一個的開辟結點和輸入各個結點的資料,并建立起前後互相連結的關系。
使用typeof定義類型:
共用體:
使用幾個不同變量工占用一段記憶體的結構成為共用體結構。
共用體的結構形式:
union 共用體名{
成員清單;
}變量清單;
結構體和共用體的比較:
1.結構體變量所占記憶體長度是各自成員占的記憶體長度之和。每個成員分别占有其自己的記憶體單元。
2.共用體變量所占的記憶體長度等于最長的成員的長度。
隻有先定義了共用體變量才能引用它,而且不能引用共用體變量,而隻能引用共用體變量中的成員。
共用體資料類型的特點:
同一個記憶體段可以用來存放幾種不同的類型的成員,但是每一瞬間隻能存放一種,而不是同時存放幾種。
共用體變量中起作用的成員是最後一次存放的成員,存入一個新的成員後原有的成員就會消失作用。
共用體變量的位址和它的歌成員的位址都是同一個位址。
不能對共用體變量名指派,也不能企圖引用變量名來得到一個值,又不能在定義共用體變量是對它初始化。
不能把共用體變量作為函數參數,也不能是函數帶回共用體變量,但是可以使用指向共用體變量的指針。
共用體類型可以出現在結構體類型定義中,也可以定義共用體數組。
結構體也可以出現在共用體的類型定義中,數組也可以作為共用體的成員。
枚舉類型:
在枚舉類型的定義中累出所有可能的取值。被說明的枚舉類型的變量的取值不可以超出定義的範圍。
枚舉是一種基本的資料類型,而不是一種構造類型,因為它不能再分解為任何基本類型。
在枚舉值清單中列出所有可用的值。這些值成為枚舉元素。
檔案操作:
檔案:是指一組相關資料的有序集合。
這個資料集有一個名稱,叫做檔案名。
從使用者的角度分為普通檔案和裝置檔案。
檔案駐留在外部媒體上,在使用的時候才會調入記憶體。
作業系統是以檔案為機關對資料進行管理的。
ASCII檔案和二進制檔案的比較:
ASCII檔案便于對字元進行逐個處理,也便于輸出字元。
但是ASCII檔案占用存儲空間比較多,而且要花費轉換時間。
二進制檔案可以節省外存空間和轉換時間,但是一個位元組并不對應一個字元,不能直接輸出字元形式。
一般中間結果資料要暫時儲存在外存上,以後需要輸入記憶體的,常用二進制檔案儲存。
C語言對檔案的處理方法:
緩沖檔案系統:
系統自動的在記憶體區為每一個正在使用的檔案開辟一個緩沖區。
用緩沖檔案系統進行輸入輸出又叫做進階磁盤輸入輸出。
非緩沖檔案系統:
系統不自動開辟确定大小的緩沖區,而是由程式為每個檔案設定緩沖區。
用非檔案系統進行的輸入輸出叫做低級輸入輸出系統。
在UNIX中,用緩沖檔案系統來處理文本檔案,用非緩沖檔案系統來處理二進制檔案。
ANSI C标準值采用緩沖檔案系統來處理文本檔案和二進制檔案。
C語言中對檔案的讀寫都是用庫函數來實作的。
檔案型指針變量:
FILE *fp;
fp是一個指向FILE類型結構體的指針變量。
使fp指向某一個檔案的結構體變量,進而通過該結構體變量中的檔案資訊能夠通路該檔案。
檔案的打開:
fopen(檔案名,使用檔案方式)函數。
fp = fopen(FileName,Operation);
檔案的使用方式:
r 隻讀文本檔案,檔案必須存在。
w 隻寫文本檔案,如果不存在就建立,存在就删除重新建立。
a 追加文本資料,檔案必須存在。
rb 隻讀二進制檔案
wb 隻寫二進制檔案
ab 追加二進制資料
r+ 讀寫文本檔案,打開
w+ 讀寫文本檔案,建立
a+ 讀寫文本檔案,打開
rb+ 讀寫二進制檔案,打開
wb+ 讀寫二進制檔案,建立
ab+ 打開二進制檔案
檔案的關閉:
fclose(檔案指針)函數。
使檔案的指針變量不指向該檔案,也就是檔案指針變量與檔案脫鈎,此後不能通過該指針對原來與其聯系的檔案進行讀寫操作。
傳回值:
關閉成功傳回值為0,否則傳回為EOF(-1)。
對檔案的讀或寫是最常用的檔案操作。
在C語言中提供了多種檔案的讀寫操作。
字元讀寫函數:fgetc()和fputc()。
fputc(ch,fp)函數調用:
函數功能:将字元輸出到fp所指向的檔案中。
用寫或讀的方式打開一個已存在的檔案時,将清除原有的檔案内容。
寫入字元從檔案頭開始。
如果需要保留檔案内容,希望寫入字元從檔案末尾開始,必須以追加的方式打開檔案。
被寫入的檔案不存在就會建立該檔案。
每寫入一個字元,檔案内部位置指針想後移動一個字元。
fputs()函數有一個傳回值,若果寫入成功就傳回寫入的字元,否則傳回一個EOF。
fgetc(ch,fp)函數調用:
在fgetc()函數的調用中,讀取的檔案必須是以讀或讀寫的方式打開。
在檔案内部有一個位置指針,用來指向檔案的目前讀寫的位元組。
在檔案的打開的時候,該指針總是指向檔案的第一個位元組。
使用fgetc()函數後,該位置指針将會向後移動一個位元組。
是以可以連續多次使用該函數讀取多個字元。
應該注意檔案指針和檔案内部的位置指針不是一回事。
檔案指針是指向整個檔案的,必須在程式中定義說明,隻要不重新指派,檔案指針的值是不變的。
檔案内部的位置指針用以訓示檔案内部的目前讀寫位置。
每讀寫一次,該指針都會向後移動。
它不需要在程式中定義說明,而是由系統自動設定的。
EOF不是可輸出字元,是以不能再螢幕上顯示。
由于字元的ASCII碼不可能出現-1.
是以EOF定義為-1是合适的。
當讀入的字元值等于-1時,表示讀入的已不是正常的字元而是檔案結束字元。
ANSIC提供一個feof()函數來判斷檔案是否真的結束。
如果是檔案結束,函數feof()的傳回值是1,否則是0。
檔案合成器:
字元串讀寫函數:fgets()和fputs()。
fgets(str,len,fp)函數:
從fp所指的檔案中讀出len-1個字元送入字元數組str中,并在最後加上一個\0。
fputs("字元串",fp)函數:
其意義是把字元串寫入fp所指的檔案之中。
輸出成功傳回0,輸出失敗傳回EOF。
資料塊讀寫函數:fread()和fwrite()。
fread(buffer,size,count ,fp)函數:
fwrite(buffer,size,count,fp)函數:
buffer是一個指針,對于fread()說,它是資料的存放起始位址;對于fwrite()來說,它是輸出資料的起始位址。
size是要讀寫的位元組數。
count是要讀寫多少個位元組的資料項。
fp是檔案型指針。
格式化讀寫函數:fscanf()和fprintf()。
fscanf(檔案指針,格式字元串,輸入清單)
fprintf(檔案指針,格式字元串,輸出清單)
從磁盤檔案中按照格式輸入輸出字元。
順序讀寫:
位置指針按位元組位置順序移動。
随機讀寫:
讀寫完成上一個字元(位元組)後,并不一定要讀寫其後續的字元(位元組),而可以讀些檔案中的任意位置上所需的字元。
fseek()函數一般用于二進制檔案,作用是改變檔案的位置指針。
函數的調用形式:
fseek(檔案類型指針,位移量,起始點)
檔案開頭 SEEK_SET
檔案目前位置 SEEK_CUR
檔案末尾 SEEK_END
位移量:以起始點為基點,向前移動的位元組數。
ftell()函數:
得到流式檔案的目前位置,用相對于檔案開頭的位移量來表示。
傳回目前的位置,出錯傳回-1。
ferror()函數:
出錯檢測。
調用形式:
feeror(fp)
傳回0,表示未出錯
傳回非0,表示出錯。
注意在調用一個輸入輸出函數後立即檢查ferror()函數的值,否則資訊會丢失。
在執行fopen()函數的時候,ferror()函數的初始值自動為0。
clearerr()函數:
clearerr(fp);
函數的作用:
是檔案錯誤辨別和檔案結束标志置為0。
隻要出現錯誤标志,就會一直保留,知道對同一檔案調用clearerr()函數或rewind()函數,或任何其他一個輸出輸入函數。
以上函數包含在stdio.h檔案中。
位運算:位運算是指按照二進制位進行的運算。
因為系統軟體中,經常要處理二進制問題。
C語言提供位運算的功能,與其他進階語言相比,具有很大的優越性。
符号:
& 按位與
| 按位或
^ 按位異或
~ 取反
<< 左移
>> 右移
運算符隻能是整型或者是字元型資料。
清零操作:
如果想對一個存儲單元進行清零,即使全部二進制位為0,隻要找一個二進制數,其中各個位符合以下條件:
原來的數中為1的位,新數中相應位為0.然後使二者進行& 運算即可可達到清零的目的。
左移一位相當于這個數乘2,但是隻适用于左移時被溢出的高位不含1的情況。
對于無符号數,右移時左邊高位移入0;
對于有符号數,如果原來符号位為0(這個數為正數),則左邊也是移入0;如果是原來的位為1(這個數是負數)要取決于所用的計算機系統。
有的系統移入0,有的系統移入1。移入0叫做邏輯右移,也叫做簡單右移;移入1叫做算術右移。
位段:
位段也叫作位域,是把一個位元組中的二進制位劃分為幾個不同的區域,并說明每個區域的位數。
每個域有個域名,允許在程式中按照域名進行操作,這樣就可以把幾個不同的對象用一個位元組的二進制位段來表示。
位段實際上是資料的一種壓縮方式,每個位段是一種特殊形式的結構體成員。
資訊的存儲一般以位元組為機關。實際上有時候一個資訊不必用一個或多個位元組。
在計算機用于過程控制、參數檢測或資料通信領域時,控制資訊往往隻占用一個位元組中的一個或幾個二進制位。
常常在一個位元組中放幾個資訊。
C語言允許在一個結構體中以位為機關來指定其成員所占用記憶體的長度。
這種以位為機關的成員叫做位段或位域。
利用位段能夠用較少的位數存儲資料。
位段的定義與引用:
位段成員的類型必須指定為unsigned或int類型。
如果某一位段要從另一個字開始存放,可用一下形式定義:
unsigned a:1;
unsigned b:2;
unsigned :0;
unsigned c:3;
本來a b c 應該連續存放在一個存儲單元,由于用了長度為0的位段,其作用是使下一個位段從下一個存儲單元開始存放。
是以,隻将a b存儲在一個存儲單元中,c存放在下一個存儲單元(存儲單元可能是一個位元組,也可能是兩個位元組,視編譯系統不同而定)。
一個位段必須存儲在同一個存儲單元中,不能跨兩個單元。如果第一個單元空間不能容納下一個位段,則空間不用。
而從下一個單元起存放該位段。
可以定義無名位段。
位段的長度不可以大于存儲單元的長度,也不能定義位段數組。
位段可以用整數格式符輸出。
位段可以在數值表達式中引用,它會被系統自動的轉換成整型資料。
位段的定義:
struct 位段名{位段清單};
位段清單的表示方式:
類型說明符 位段名 : 位段長度;
位段長度就是每個域所占的二進制位數。
一個位段必須存儲在同一個存儲單元,不可以跨兩個單元,如果一個存儲單元所剩餘的空間不夠存放另一個位段時,應該從下一個存儲單元存放該位段。
可以有意使某位段從下一個單元開始。
位段的類型通常為征稅或無符号整數類型。
在位段結構體定義中,也可以定義非位段成員。
位段的使用形式和結構體成員的使用相同:
位段變量名.位段名
本文轉自 棋帥小七 51CTO部落格,原文連結:http://blog.51cto.com/xvjunjie/2058200