C語言編程注意點7

1、C語言支持文本形式二進制形式的文件操作,無論那種形式,都把文件看作一個字節的序列,對文件的存取是以字節爲單位進行的。
在這裏插入圖片描述
文本文件便於顯示,二進制文件節省存儲空間,處理速度快,一般用於保存大量數據。

2、以二進制流打開文件的方式包括
在這裏插入圖片描述

3、二進制流文件結束判斷
在二進制文件中不設EOF標誌(因爲-1爲合法數據)

爲了判斷文件是否結束,提供了文件結束測試函數:
feof ( fp );
若最近一次讀取fp所指向的文件時,讀取了文件尾部,則返回非0值,否則返回0

feof()函數讀取到尾部最後一個字節後,如下圖:
在這裏插入圖片描述
(feof對於文本文件也適用)

4、行輸入、行輸出

char  *fgets(char  *s,  int  n,  FILE  *fp)

//常見使用方式
while ( fgets( s, 81, fp ) != NULL )
{
}

從fp上最多讀入n-1個字符,放入s 字符數組中。返回s或NULL。

 int  fputs( char  *s,  FILE  *fp)

把字符串s(不一定含\n)寫入文件fp中。返回非負數或EOF。

  1. fgets正常讀入換行字符(與gets不同);
  2. fputs不在輸出後自動加換行字符(與puts不同);
  3. fgets能設置字符的最大個數,因此,當無法確定所讀入的數據行有多長時,最好使用fgets,而不用gets。如:fgets(buf, 81, stdin);
  4. getc, putc和fgetc,fputc的另外一個區別是fgetc和fputc是函數,而getc和putc是宏定義

5、文件格式化輸入/輸出

fscanf(fp, format,)    //返回成功讀入的數據個數,若到達文件末尾或轉換出錯,則返回EOF
fprintf(fp, format,)

比scanf、printf函數分別多了一個文件指針參數。

6、塊輸入/輸出

size_t  fwrite(const void *ptr,  size_t size,  size_t  nobj,  FLE *fp)

從指針ptr所指的對象中,向文件fp中寫入大小爲size的nobj個對象。其返回值爲實際寫入的對象數。

size_t  fread(void *ptr,  size_t size,  size_t nobj,  FILE *fp)

從文件fp中讀入大小爲size的nobj個對象,放入指針ptr所指的對象中。其返回值爲實際讀入的對象數。

通常它們被用來輸入或輸出象結構這樣的成塊數據。如:

fwrite(buf, sizeof(struct student), n, fp); 
fread(buf,  sizeof(struct student), n, fp);

注意:

  1. 塊輸入/輸出又稱直接輸入/輸出,不進行數據格式的轉換 ,因此屬於二進制流形式的輸入/輸出操作。
  2. 用fwrite函數寫入數據的文件,其內容一般無法用普通的編輯器查看或修改。
  3. 一般用於保存數據,爲了以後重新讀取使用。
  4. fwrite和fread函數一般配對使用: 用fwrite寫入的數據一般通過fread函數讀取;用fread讀取的數據也一般是用fwrite函數寫入的。

7、文件讀寫位置與隨機輸入/輸出

long ln = ftell(fp);

返回fp所指文件的讀寫指針當前位置,即相對於文件開始處的位移量,單位是字節。若調用失敗,返回-1

可用下面函數來改變文件讀寫位置:

 fseek ( fp, offset, origin );

將fp所指向文件的讀寫指針相對於origin移動offset個字節若成功,返回0,否則返回非0值
在這裏插入圖片描述
文件復位函數:

void rewind ( FILE * fp );

將fp所指向文件的讀寫指針重新定位到文件的開始。

8、常用庫函數
【1】

sscanf(char * s, char *format [, pointer…])    

從字符串s中讀取數據並轉換成相應數據格式的變量;
格式轉換方式同scanf。
sscanf適合用來將字符數據轉換成整數、浮點數或較短的字符串,它通常用以將事先讀入的一行數據,依其不同的字段分開。使用如下:

char  *buf = "123.456 + 595.36";
float val1, val2;
char oper;
sscanf(buf, "%f %c %f", &val1, &oper, &val2);

【2】

sprintf(char * s, char *format [, arg…])      

把變量轉換成相應格式後,保存到字符串s中;
格式轉換方式同printf。
當需要把某種類型的數據轉換成字符串時,sprintf就特別有用。使用方式如下:

char buf[100], *cmd= "test";
int  width = 80;
double  x = 5.67;
sprintf(buf, "%s  %d  %f", cmd, width, x);
printf("%s\n", buf);

【3】
在這裏插入圖片描述
【4】
在這裏插入圖片描述
【5】
在這裏插入圖片描述

9、#include
在這裏插入圖片描述
使用#include的優點:
可以把所有公共的、需要給程序各個函數共享的外部變量說明、函數原型和宏定義、類型定義等都放在某一文件上(通常以.h爲文件後綴)。其它文件的開頭只須用一條#include “該.h”文件的語句,就可以省去重寫這些說明、定義的麻煩,而且程序結構更爲清晰

10、#if (條件編譯)
在這裏插入圖片描述
我們經常可在一些頭文件中見到下面語句:

#ifndef   FIRST
#define  FIRST#endif

可用它們來避免該頭文件被重複包含。

11、變量作用域

  1. 變量作用域:變量的使用範圍;
  2. 在同一個作用域內,不允許定義同名變量;
  3. 在不同作用域內,允許定義同名變量。如果同名變量作用域重疊,則內層變量將屏蔽外層變量;

12、靜態變量(static)
① 內部靜態變量
在局部變量前加上“static”關鍵字就成爲內部靜態變量。
內部靜態變量仍是局部變量,其作用域仍在定義它的函數內。但該變量採用靜態存貯分配(由編譯程序在編譯時分配,而一般的自動變量和函數形參均採用動態存貯分配,即在運行時分配空間),當函數執行完,返回調用點時,該變量並不撤消,其值將繼續保留,若下次再進入該函數時,其值仍存在。
②外部靜態變量
在函數外部定義的變量前加上“static”關鍵字便成了外部靜態變量。
外部靜態變量的作用域爲定義它的文件,即成爲該文件的的“私有”(private)變量,其它文件上的函數一律不得直接進行訪問,除非通過它所在文件上的各種函數來對它進行操作,這可實現數據隱藏。(在C++中提供進一步的數據隱藏。)

13、變量初始化

  1. 外部和靜態變量由編譯程序給予隱含的初值0。
  2. 程序員可在變量定義時對它進行初始化(不是賦值表達式)。
  3. 自動變量的初始化每進入該函數時便初始化一次。 外部或靜態變量的初始化僅(在編譯時)進行一次。
  4. 自動變量或寄存器變量只能顯式初始化,否則,自動變量和寄存器變量有不確定的值。
  5. *外部數據的說明,如果帶有初始化項,即當成一個定義。

14、枚舉類型(enum)
枚舉值是標識符

對枚舉變量的賦值並不是將標識符字符串傳給它,而是把該標識符所對應的各值表中常數值賦於變量。C語言編譯程序把值表中的標識符視爲從0開始的連續整數;

枚舉類型變量的作用範圍與一般變量的定義相同;

枚舉類型用途:枚舉類型通常用來說明變量取值爲有限的一組值之一;用來定義常量;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章