1. 程式人生 > >c51 函式庫函式 STDIO.H:一般I/O函式

c51 函式庫函式 STDIO.H:一般I/O函式

 

c51 函式 (3)

 

  3.2 STDIO.H:一般I/O函式

    在標頭檔案中增加include <stdio.h>

 

  C51編譯器包含字元I/O函式,它們通過處理器的序列介面操作,為支援其它I/O機制,只需修改_getkey()和putchar()函式,其它所有I/O支援函式依賴這兩個模組,不需要改動。在使用8051序列口之前,必須將它們初始化,下例以2400波特率,12MHz初始化串列埠:
  SCON=0x52 
  TMOD=0x20 
  TR1=1 
  TH1=0Xf3 

 

  其它工作模式和波特率等細節問題可以從8051使用者手冊中得到。

 

    函式名: _getkey
  原 型: extern char _getkey();
  功 能: _getkey()從8051串列埠讀入一個字元,然後等待字元輸入,這個函式是改變整個輸入埠機制應作修改的唯一一個函式。

 

    函式名: getchar
  原 型: extern char _getchar();
  功 能: getchar()使用_getkey從串列埠讀入字元,除了讀入的字元馬上傳給putchar函式以作響應外,與_getkey相同。不是說具有回顯功能。


  
  函式名: gets
  原 型: extern char *gets(char *s,int n);
  功 能:該函式通過getchar從控制檯裝置讀入一個字元送入由‘s’指向的資料組。考慮到ANSI標準的建議,限制每次呼叫時能讀入的最大字元數,函式提供了一個字元計數器‘n’,在所有情況下,當檢測到換行符時,放棄字元輸入。
  
  函式名: ungetchar
  原 型: extern char ungetchar(char);
  功 能: ungetchar將輸入字元推回輸入緩衝區,因此下次gets或getchar可用該字元。ungetchar成功時返回‘char’,失敗時返回EOF,不可能用ungetchar處理多個字元。

  
  函式名: _ungetchar
  原 型: extern char _ungetchar(char);
  功 能: _ungetchar將傳入字元送回輸入緩衝區並將其值返回給呼叫者,下次使用getkey時可獲得該字元,寫回多個字元是不可能的。
  
  函式名:putchar
  原 型: extern putchar(char);
  功 能: putchar通過8051串列埠輸出‘char’,和函式_getkey一樣,putchar是改變整個輸出機制所需修改的唯一一個函式。

 

    函式名: printf
  原 型: extern int printf(const char*,…);
  功 能: printf以一定格式通過8051串列埠輸出數值和串,返回值為實際輸出的字元數,參量可以是指標、字元或數值,第一個參量是格式串指標。
  注:允許作為printf參量的總位元組數由C51庫限制,因為8051結構上存貯空間有限,在SMALL和COMPACT模式下,最大可傳遞15個位元組的引數(即5個指標,或1個指標和3個長位元組),在LARGE模式下,至多可傳遞40個位元組的引數。格式控制串包含下列域(方括號內的域是可能的):
  %[flags][width][.precision]type
  “width”域定義了參量欲顯示的字元數(即顯示寬度),它必須是一個十進位制數,如果實際顯示的字元數小於“width”,輸出左端補以空格,如果“width”域以0開始,則左端補0。如%05d,則顯示5位十進位制數,若不足5位,則左端以0補齊。
  “flag”域用來定義下面選項:
  Falg意義-輸出左齊+輸出值如果是有符號數值,則加上+/-號‘ ‘(空格),輸出值如果為正則左邊補以空格顯示#,如果它與0,x或X聯用,則在輸出前加上字元0、0x,0X。當與值型別g、G、f、e、E聯用時,‘#’使輸出數產生一個十進位制小數點。

    b,B它們與格式型別d、i、o、u、x、X聯用,這樣參量型別被接受為‘[unsigned]char’,如:%bu,%bd或%bx。

    l,L它們與格式型別d、i、o、u、x、X聯用,這樣參量型別被接受為‘[unsigned]long’,如:%lu,%ld或%lx。

    *下一個參量不作輸出。型別d,表示int型別,u表示unsigned int型別

 

   “type“域定義參量如下型別:
  字元型別輸出格式dint有符號十進位制數(16位),Uint無符號十進位制數,oint無符號八進位制數X,xint無符號十六進位制數ffloat[-]dddd.dddd形式的浮點數e,Efloat[-]d.ddddE[sign]dd形式的浮點數g,Gfloate或f形式浮點數,看哪一種輸出形式好。cchar字元spointer指向一個帶結束符號的串ppointer帶存貯器指示符和偏移的指標。M:aaaa。M:=C(ode),D(ata),I(data),P(data) aaaa:指標偏移值。

 

    例子:
  printf(“Int-Val%d,Char-Val%bd,Long-Val%d”,I,c,l);
  printf(“String%s,Character%c”,array,character);
  printf(“Pointer%p”,&array[10]);  打印出指標地址
  
  函式名: sprintf
  原 型: extern int sprintf(char *s,const char*,…);
  功 能: sprintf與printf相似,但輸出不顯示在控制檯上,而是通過一個指標S,送入可定址的緩衝區。
  注:sprintf允許輸出的參量總位元組數與printf完全相同。
  
  函式名: puts
  原 型: extern int puts(const char*,…);
  功 能: puts將串‘s’和換行符寫入控制檯裝置,錯誤時返回EOF,否則返回一非負數。
  
  函式名: scanf
  原 型: extern int scanf(const char*,…);
  功 能: scanf在格式串控制下,利用getchar函式由控制檯讀入資料,每遇到一個值(符號格式串規定),就將它按順序賦給每個參量,注意每個參量必須都是指標。scanf返回它所發現並轉換的輸入項數。若遇到錯誤返回EOF。格式串包括:
  l 空格、製表符等,這些空白字元被忽略。
  l 字元,除需匹配的“%”(格式控制字元)外。
  l 轉換指定字元“%”,後隨幾個可選字元;賦值抑制符“*”,一個指定最大域寬的數。
  注:scanf參量允許的總位元組數與printf相同,格式控制串可包括下列域(方括號內是可選的):
  %[flags][width]type
  格式串總是以百分號開始,每個域包含一個或多個字元或數。
  “width”域定義了參量可接受的字元數,“width”必須是一個正十進位制數。如果實際輸入字元數量小於“width”,則不會進行填充。
  ‘flag’域用來定義下面選項:
  Flag意 義*輸入被忽略b,h它們用作格式型別d,i,o,u和x的字首,用這些變數可定義參量是字元指標還是無符號字元指標。如%bu,%bd,%bx。L它們被作格式型別d,i,o,u和x的字首,使用這個字首可定義參量是長指標還是無符號字長指標。如%lu,%ld,%lx。

 

“type”域定義參量為如下型別:
  描 述 符類 型輸 入 格 式dptr to int有符號十進位制數(16位)iptr to int如C中記號一樣,整型值uptr to int無符號十進位制數optr to int無符號八進位制數xptr to int無符號十六進位制數f,e,gptr to float浮點數cptr to char一個字元sptr to string一個字串
  
  
  例子:
  scanf(“%d%bd%ld”,&i,&c,&l);
  scanf(“%f”,&f);
  scanf(“%3s,%c”,&string[0],&character);
  
  函式名: sscanf
  原 型: extern int sscanf(const *s,const char*,…);
  功 能: sscanf與scanf方式相似,但串輸入不是通過控制檯,而是通過另一個以空結束的指標。
  注:sscanf參量允許的總位元組數由C-51庫限制,這是因為8051處理器結構記憶體的限制,在SMALL和COMPACT模式,最大允許15位元組引數(即至多5個指標,或2個指標,2個長整型或1個字元型)的傳遞。在LARGE模式下,最大允許傳送40個位元組的引數。