
文章目錄
- 檔案讀寫
- C分檔案編程
- 盤點
- 運算子
- 關系運算子
- 邏輯運算子
- 賦值運算子
- 字串函式
- 重命名
- 前處理器
- 強制型別轉換
- static
- extern
在前面幾篇,基本知識也講的差不多了,再講一下檔案讀寫、分檔案編程與其他知識點,就可以進入第一輪的專案開發流程了,
檔案讀寫
在我剛接觸這一個知識點的時候,我是非常害怕的,不知道各位是什么心情,我那時候只是個培訓了一個月的菜鳥,
但是呢,隨著學習的深入,我現在反倒覺得,檔案讀寫,比前面的鏈表操作要簡單的多,甚至于比那個輸入輸出控制函式都要簡單,
使用 fopen( ) 函式來創建一個新的檔案或者打開一個已有的檔案:
FILE *fopen( const char * filename, const char * mode ); //回傳值是一個檔案句柄
第一個引數是檔案名,第二個引數是打開權限:
| 模式 | 描述 |
|---|---|
| r | 打開一個已有的文本檔案,允許讀取檔案, |
| w | 打開一個文本檔案,允許寫入檔案,如果檔案不存在,則會創建一個新檔案,程式會從檔案的開頭寫入內容,如果檔案存在,會造成覆寫, |
| a | 打開一個文本檔案,以追加模式寫入檔案,如果檔案不存在,則會創建一個新檔案,如果存在,程式會在已有的檔案內容中追加內容, |
| r+ | 打開一個文本檔案,允許讀寫檔案, |
| w+ | 打開一個文本檔案,允許讀寫檔案,如果檔案已存在,則檔案會被截斷為零長度,如果檔案不存在,則會創建一個新檔案, |
| a+ | 打開一個文本檔案,允許讀寫檔案,如果檔案不存在,則會創建一個新檔案,讀取會從檔案的開頭開始,寫入則只能是追加模式, |
二進制的話,加一個b,碧如:wb
關閉檔案的話:
int fclose( FILE *fp );
寫入檔案:
fwrite(data,size,1,fp);
引數釋義:
待寫入資料、寫入大小、默認為1、檔案句柄,
讀取檔案:
fread(data, size, 1, fp);
引數釋義:
存盤讀取資料、讀取大小、默認為1、檔案句柄
看個實體吧:
#include"public.h"
//打開檔案/
FILE * open(char * filename)
{
FILE *fp=NULL;
fp=fopen(filename,"r+");
if (fp==NULL)
{
fp=fopen(filename,"w+");
}
return fp;
}
/用戶鏈表寫入檔案//
void List_to_file(POINT_T * head,FILE * fp,int size)
{
遍歷鏈表并列印
POINT_T * pNode=head;
rewind(fp);
while(pNode->next!=NULL)
{
pNode=pNode->next;
//
// printf("%s %d\n",pNode->pData->t,pNode->pData->a); 這一行要不要放出來還沒想清楚
//將資料寫入檔案//
fwrite(pNode->pData,size,1,fp);
// printf("\n");
}
fflush(fp);
}
///檔案寫入鏈表//
POINT_T * File_to_list( FILE* p, int size)
{
void * data = NULL;
POINT_T * head = NULL;
int ret = -1;
// 創建鏈表頭節點
head = creat(NULL);
rewind(p);
// 對資料域開辟空間
data = malloc(size);
memset(data, 0, sizeof(size));
while (1)
{
// 讀取大小為size的資料內容
ret = fread(data, size, 1, p);
if (ret < 1)
{
// 未讀取到資料內容,表示檔案已到結尾
break;
}
// 添加到鏈表
add(head, data);
data = malloc(size);
memset(data, 0, sizeof(size));
}
return head;
}
C分檔案編程
在寫專案的時候,總不可能是把所有代碼都寫在一個檔案里面吧,這樣就太low了,
應該根據功能將代碼劃分到不同的檔案中去,
這里有些注意點:
1、創建同名的頭檔案(.h)和cpp檔案,
2、在頭檔案里寫函式宣告,在cpp檔案中寫函式定義,
3、在cpp檔案中寫#include "xx.h" //自定義頭檔案名
4、框架(include using namespace std;)寫在.h檔案中
慢慢就習慣了,
像這樣:

接下來,我們盤點一下前邊落下的那些知識點:
盤點
運算子
A = 20,B = 10;
| 運算子 | 描述 | 實體 |
|---|---|---|
| + | 把兩個運算元相加 | A + B 將得到 30 |
| - | 從第一個運算元中減去第二個運算元 | A - B 將得到 10 |
| * | 把兩個運算元相乘 | A * B 將得到 200 |
| / | 分子除以分母(去尾法保留整數) | B / A 將得到 0 |
| % | 取模運算子,整除后的余數 | B % A 將得到 10 |
| ++ | 自增運算子,整數值增加 1 | A++ 將得到 21 |
| – | 自減運算子,整數值減少 1 | A-- 將得到 19 |
關系運算子
| 運算子 | 描述 | 實體 |
|---|---|---|
| == | 檢查兩個運算元的值是否相等,如果相等則條件為真, | (A == B) 為假, |
| != | 檢查兩個運算元的值是否相等,如果不相等則條件為真, | (A != B) 為真, |
| > | 檢查左運算元的值是否大于右運算元的值,如果是則條件為真, | (A > B) 為真, |
| < | 檢查左運算元的值是否小于右運算元的值,如果是則條件為真, | (A < B) 為假, |
| >= | 檢查左運算元的值是否大于或等于右運算元的值,如果是則條件為真, | (A >= B) 為真, |
| <= | 檢查左運算元的值是否小于或等于右運算元的值,如果是則條件為真, | (A <= B) 為假, |
邏輯運算子
A = 1,B = 0;
| 運算子 | 描述 | 實體 |
|---|---|---|
| && | 稱為邏輯與運算子,如果兩個運算元都非零,則條件為真, | (A && B) 為假 |
| 兩豎桿 | 稱為邏輯或運算子,如果兩個運算元中有任意一個非零,則條件為真, | (A 兩豎桿 B) 為真 |
| ! | 稱為邏輯非運算子,用來逆轉運算元的邏輯狀態,如果條件為真則邏輯非運算子將使其為假, | !(A && B) 為真, |
賦值運算子
| 運算子 | 描述 | 實體 |
|---|---|---|
| = | 簡單的賦值運算子,把右邊運算元的值賦給左邊運算元 | C = A + B 將把 A + B 的值賦給 C |
| += | 加且賦值運算子,把右邊運算元加上左邊運算元的結果賦值給左邊運算元 | C += A 相當于 C = C + A |
| -= | 減且賦值運算子,把左邊運算元減去右邊運算元的結果賦值給左邊運算元 | C -= A 相當于 C = C - A |
| *= | 乘且賦值運算子,把右邊運算元乘以左邊運算元的結果賦值給左邊運算元 | C *= A 相當于 C = C * A |
| /= | 除且賦值運算子,把左邊運算元除以右邊運算元的結果賦值給左邊運算元 | C /= A 相當于 C = C / A |
| %= | 求模且賦值運算子,求兩個運算元的模賦值給左邊運算元 | C %= A 相當于 C = C % A |
字串函式
| 函式 | 目的 |
|---|---|
| strcpy(s1, s2); | 復制字串 s2 到字串 s1, |
| strcat(s1, s2); | 連接字串 s2 到字串 s1 的末尾, |
| strlen(s1); | 回傳字串 s1 的長度, |
| strcmp(s1, s2); | 如果 s1 和 s2 是相同的,則回傳 0;如果 s1<s2 則回傳小于 0;如果 s1>s2 則回傳大于 0, |
| strchr(s1, ch); | 回傳一個指標,指向字串 s1 中字符 ch 的第一次出現的位置, |
| strstr(s1, s2); | 回傳一個指標,指向字串 s1 中字串 s2 的第一次出現的位置, |
重命名
typedef unsigned char BYTE;
在這個型別定義之后,識別符號 BYTE 可作為型別 unsigned char 的縮寫
前處理器
在頭檔案中,一般開頭會這么寫:
這是一個other.h的檔案
#ifndef _OTHER_H_
#define _OTHER_H_
末尾:
#endif
| 指令 | 描述 |
|---|---|
| #define | 定義宏 |
| #include | 包含一個源代碼檔案 |
| #undef | 取消已定義的宏 |
| #ifdef | 如果宏已經定義,則回傳真 |
| #ifndef | 如果宏沒有定義,則回傳真 |
| #if | 如果給定條件為真,則編譯下面代碼 |
| #else | #if 的替代方案 |
| #elif | 如果前面的 #if 給定條件不為真,當前條件為真,則編譯下面代碼 |
| #endif | 結束一個 #if……#else 條件編譯塊 |
| #error | 當遇到標準錯誤時,輸出錯誤訊息 |
| #pragma | 使用標準化方法,向編譯器發布特殊的命令到編譯器中 |
強制型別轉換
強制型別轉換是把變數從一種型別轉換為另一種資料型別,
像這樣:
(type_name) expression
int main()
{
int sum = 17, count = 5;
double mean;
mean = (double) sum / count;
printf("Value of mean : %f\n", mean );
}
強轉有風險,使用需謹慎,
static
使用 static 修飾區域變數可以在函式呼叫之間保持區域變數的值,
static 修飾符也可以應用于全域變數,當 static 修飾全域變數時,會使變數的作用域限制在宣告它的檔案內,
extern
extern 存盤類用于提供一個全域變數的參考,全域變數對所有的程式檔案都是可見的,當您使用 extern 時,對于無法初始化的變數,會把變數名指向一個之前定義過的存盤位置,
盤點完畢,下一篇進專案!!!


轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/281307.html
標籤:其他
