C standard library

include

  • 編譯器會依您所撰寫的程式內容自己到所含括進來的標頭檔去擷取所需要的資訊,而沒有使用到的資訊則不屬於這個程式的範圍,故不會增加程式碼的大小‧當然,我們也沒有必要含括一些沒有必要的標頭檔到程式來,因為這只會徒增程式閱讀的困擾‧

printf

  • 如果只是要印出字串,不含變數時,使用puts()速度較快,且puts()會自動換行。反之應使用printf()。
    • 如果printf("hello world")中只有單純的字串時,此時等價於puts("hello world"),詳見編譯後的組合語言。
int puts(const char *s);
int printf(const char *format, ...);
Format Specifier Data Type Specified
%d , %i Integer
%u Unsigned Integer
%ld Long Signed Integer
%lu Long Unsigned Integer
%c Character
%e, %E, %f, %g, %G Floating Point Number
%lf Double
%o Octal
%x , %X Hexadecimal
%s String
%p Address Format
  • 跳脫字元
Escape Sequence Character Represented
\n Newline
\t Tab space
\b Backspace
\r Carriage Return

int, double轉字串(sprintf)

  • C語言並沒有提供一個函數專門將int, double轉字串,必須透過一個小技巧。
  • 字串或int, double使用atoi()
  • 有的compiler有提供itoa()與ltoa()將int, double轉字串,不過這些並非ANSI C標準,真正標準該使用sprintf()。
int i = 10;
double d = 1.23 ;
char s[256];

sprintf(s, "%d", i);
printf("%s\n", s);

d = 1.23;
sprintf(s, "%f", d);
printf("%s\n", s);
`

fileIO

fopen開啟的模式 |模式| 解釋| |---|---| |r |打開現有text file以便讀取| |w |生成新text file或截短現有text file至零長度以便寫入| |a |附加。生成新text file或打開現有text file以便在文件結束處寫入| |rb |打開現有binary file以便讀取| |wb |生成新binary file或將現有binary file截至零長度以便寫入| |ab |附加。生成新binary file或打開現有binary file以便在文件結束處寫入| |r+ |打開現有text file,以便更新(讀和寫)| |w+ |生成新text file或將現有text file截至零長度以便更新。| |a+ |附加。生成新text file或打開現有text file以便更新,在文件結束處寫入| |r+b或rb+| 打開現有binary file以便更新(讀和寫)| |w+b或wb+| 生成新binary file或截短現有文件至零長度以便更新| |a+b或ab+| 附加。生成新binary file或截短現有文件至零長度以便更新,在文件結束處寫入|

寫入binary file某個byte連續n byte的值

  • 有時程式會自己定義檔案格式,其header區會定義每個byte各代表某項資訊,所以常常需要直接對binary檔的某byte直接進行寫入,且連續寫入幾個byte表示某一數值資訊。

  • E.g. 將寫入wf.bin的0x33 byte處的連續4 byte值

    • 開檔的時候不可用'wb', 如果模式字串以w開始,那麼如果檔案不存在,就會建立一個新檔案;如果存在,那麼之前的內容就會遺失,因為在write中,fopen()函式會將檔案的長度截為0。
    • 因為如果模式字串以r開始,此檔案必須有存在檔案系統中才行。
#include <stdio.h>

int main() {
    FILE *fp;
    int filesize;
    unsigned char buff[4];

    // 以binary append方式開啟檔案
    fp = fopen("./wf.bin", "rb+");
    if (!fp) {
        fclose(fp);
        return -1;
    }

    // 要寫入檔案的內容,先存在buff中
    buff[0] = 0xAC;
    buff[1] = 0xFF;
    buff[2] = 0x1B;
    buff[3] = 0xAA;

    // 移到0x33處,SEEK_SET表示從檔頭開始
    fseek(fp, 0x33, SEEK_SET);
    // 由於單位是unsigned char且寫入4個bytes,所以size為4。
    fwrite(buff, sizeof(unsigned char), 4, fp);
    fclose(fp);

    return 0;
}
//讀取
#include <stdio.h>

int main() {
    FILE *fp;
    fpos_t pos;
     unsigned char buff[4];
    fp = fopen("./wf.bin", "rb");
    if (!fp)
        return 1;

    pos = 0x33;

    fsetpos(fp, &pos);
    // 也可用fseek
    // fseek(fp, pos, SEEK_SET);

    fread(buff, sizeof(char), 4, fp);

    printf("0x%02x\n", buff[0]);
    printf("0x%02x\n", buff[1]);
    printf("0x%02x\n", buff[2]);
    printf("0x%02x\n", buff[3]);

   return 0;
}

memset

  • memset常用於array、struct或指定記憶體區塊的初始化
// array的初始化
const int SIZE = 100;
int ia[SIZE];
memset(ia, 0, sizeof(ia));
// struct初始化
struct Foo {
    int no;
    double d;
};

Foo foo;
memset(&foo, 0, sizeof(foo));

clock.h之clock於效能測試

```c

inlcude

clock_t t = clock(); function(); t = clock() -t; printf("process time %f secs\n", (double)t/CLOCKS_PER_SEC);

results matching ""

    No results matching ""