1. 程式人生 > >C/C++標頭檔案彙總

C/C++標頭檔案彙總

C和傳統 C++

#include<assert.h>    //設定插入點
#include <ctype.h>                //字元處理    
#include <errno.h>     //定義錯誤碼
#include <float.h>     //浮點數處理
#include <fstream.h>   //檔案輸入/輸出
#include <iomanip.h>   //引數化輸入/輸出
#include<iostream.h>   //資料流輸入/輸出
#include<limits.h>    //定義各種資料型別最值常量
#include<locale.h>    //定義本地化函式
#include <math.h>     //定義數學函式
#include <stdio.h>    //定義輸入/輸出函式
#include<stdlib.h>    //定義雜項函式及記憶體分配函式
#include <string.h>    //字串處理
#include<strstrea.h>   //基於陣列的輸入/輸出
#include<time.h>     //定義關於時間的函式
#include <wchar.h>    //寬字元處理及輸入/輸出
#include <wctype.h>    //寬字元分類

//////////////////////////////////////////////////////////////////////////

標準 C++ (同上的不再註釋)

#include <algorithm>    //STL通用演算法
#include <bitset>     //STL位集容器
#include <cctype>                //字元處理
#include <cerrno>     //定義錯誤碼
#include <clocale>    //定義本地化函式
#include <cmath>     //定義數學函式
#include <complex>     //複數類
#include <cstdio>    //定義輸入/輸出函式
#include <cstdlib>    //定義雜項函式及記憶體分配函式
#include <cstring>    //字串處理
#include <ctime>     //定義關於時間的函式
#include <deque>      //STL雙端佇列容器
#include <exception>    //異常處理類
#include <fstream>   //檔案輸入/輸出
#include <functional>   //STL定義運算函式(代替運算子)
#include <limits>    //定義各種資料型別最值常量
#include <list>      //STL線性列表容器
#include <map>       //STL 對映容器
#include <iomanip>   //引數化輸入/輸出
#include <ios>      //基本輸入/輸出支援
#include<iosfwd>     //輸入/輸出系統使用的前置宣告
#include <iostream>   //資料流輸入/輸出
#include <istream>     //基本輸入流
#include <ostream>     //基本輸出流
#include <queue>      //STL佇列容器
#include <set>       //STL 集合容器
#include <sstream>    //基於字串的流
#include <stack>      //STL堆疊容器    
#include <stdexcept>    //標準異常類
#include <streambuf>   //底層輸入/輸出支援
#include <string>     //字串類
#include <utility>     //STL通用模板類
#include <vector>     //STL動態陣列容器
#include <cwchar>    //寬字元處理及輸入/輸出
#include <cwctype>    //寬字元分類

using namespace std;

//////////////////////////////////////////////////////////////////////////

C99 增加

#include <complex.h>  //複數處理
#include <fenv.h>    //浮點環境
#include <inttypes.h>  //整數格式轉換
#include <stdbool.h>   //布林環境
#include <stdint.h>   //整型環境
#include <tgmath.h>   //通用型別數學巨集

C標頭檔案大全

--------------------------------------------------------------------------------------------------------------------------------------------

分類函式,所在函式庫為ctype.h

int isalpha(int ch) 若ch是字母('A'-'Z','a'-'z')返回非0值,否則返回0

int isalnum(int ch) 若ch是字母('A'-'Z','a'-'z')或數字('0'-'9') 返回非0值,否則返回0

int isascii(int ch) 若ch是字元(ASCII碼中的0-127)返回非0值,否則返回0

int iscntrl(int ch) 若ch是作廢字元(0x7F)或普通控制字元(0x00-0x1F) 返回非0值,否則返回0

int isdigit(int ch) 若ch是數字('0'-'9')返回非0值,否則返回0

int isgraph(int ch) 若ch是可列印字元(不含空格)(0x21-0x7E)返回非0值,否則返回0

int islower(int ch) 若ch是小寫字母('a'-'z')返回非0值,否則返回0

int isprint(int ch) 若ch是可列印字元(含空格)(0x20-0x7E)返回非0值,否則返回0

int ispunct(int ch) 若ch是標點字元(0x00-0x1F)返回非0值,否則返回0

int isspace(int ch)  若ch是空格(''),水平製表符('\t'),回車符('\r'), 走紙換行('\f'),垂直製表符('\v'),換行符('\n')返回非0值,否則返回0

int isupper(int ch) 若ch是大寫字母('A'-'Z')返回非0值,否則返回0

int isxdigit(int ch)若ch是16進位制數('0'-'9','A'-'F','a'-'f')返回非0值, 否則返回0

int tolower(int ch) 若ch是大寫字母('A'-'Z')返回相應的小寫字母('a'-'z')

int toupper(int ch) 若ch是小寫字母('a'-'z')返回相應的大寫字母('A'-'Z')

--------------------------------------------------------------------------------------------------------------------------------------------

數學函式,所在函式庫為math.h、stdlib.h、string.h、float.h

int     abs(inti)                   返回整型引數i的絕對值

double  cabs(struct complexznum)     返回複數znum的絕對值

double  fabs(doublex)                返回雙精度引數x的絕對值

long   labs(longn)                  返回長整型引數n的絕對值

double   exp(doublex)                返回指數函式ex的值

double frexp(double value,int*eptr)  返回value=x*2n中x的值,n存貯在eptr中

double ldexp(double value,intexp);   返回value*2exp的值

double   log(doublex)                返回logex的值

double log10(doublex)                返回log10x的值

double   pow(double x,doubley)       返回xy的值

double pow10(intp)                   返回10p的值

double  sqrt(doublex)                返回+√x的值

double  acos(doublex)                返回x的反餘弦cos-1(x)值,x為弧度

double  asin(doublex)                返回x的反正弦sin-1(x)值,x為弧度

double  atan(doublex)                返回x的反正切tan-1(x)值,x為弧度

double atan2(double y,doublex)       返回y/x的反正切tan-1(x)值,y的x為弧度

double   cos(doublex)                返回x的餘弦cos(x)值,x為弧度

double   sin(doublex)                返回x的正弦sin(x)值,x為弧度

double   tan(doublex)                返回x的正切tan(x)值,x為弧度

double  cosh(doublex)                返回x的雙曲餘弦cosh(x)值,x為弧度

double  sinh(doublex)                返回x的雙曲正弦sinh(x)值,x為弧度

double  tanh(doublex)                返回x的雙曲正切tanh(x)值,x為弧度

double hypot(double x,doubley)       返回直角三角形斜邊的長度(z), x和y為直角邊的長度,z2=x2+y2

double  ceil(doublex)                返回不小於x的最小整數

double floor(doublex)                返回不大於x的最大整數

void   srand(unsignedseed)           初始化隨機數發生器

int    rand()                        產生一個隨機數並返回這個數

double  poly(double x,int n,double c[])從引數產生一個多項式

double  modf(double value,double *iptr)將雙精度數value分解成尾數和階

double  fmod(double x,doubley)       返回x/y的餘數

double frexp(double value,int*eptr)   將雙精度數value分成尾數和階

double  atof(char*nptr)              將字串nptr轉換成浮點數並返回這個浮點數

double  atoi(char*nptr)              將字串nptr轉換成整數並返回這個整數

double  atol(char*nptr)              將字串nptr轉換成長整數並返回這個整數

char   *ecvt(double value,intndigit,int *decpt,int *sign) 將浮點數value轉換成字串並返回該字串

char   *fcvt(double value,intndigit,int *decpt,int *sign) 將浮點數value轉換成字串並返回該字串

char   *gcvt(double value,intndigit,char *buf) 將數value轉換成字串並存於buf中,並返回buf的指標

char  *ultoa(unsigned long value,char*string,int radix) 將無符號整型數value轉換成字串並返回該字串,radix為轉換時所用基數

char   *ltoa(long value,char*string,int radix) 將長整型數value轉換成字串並返回該字串,radix為轉換時所用基數

char   *itoa(int value,char*string,int radix) 將整數value轉換成字串存入string,radix為轉換時所用基數

double atof(char *nptr) 將字串nptr轉換成雙精度數,並返回這個數,錯誤返回0

int   atoi(char *nptr) 將字串nptr轉換成整型數,  並返回這個數,錯誤返回0

long   atol(char *nptr)將字串nptr轉換成長整型數,並返回這個數,錯誤返回0

double strtod(char *str,char **endptr)將字串str轉換成雙精度數,並返回這個數,

long   strtol(char *str,char**endptr,int base)將字串str轉換成長整型數, 並返回這個數,

int         matherr(struct exception *e) 使用者修改數學錯誤返回資訊函式(沒有必要使用)

double      _matherr(_mexcep why,char *fun,double*arg1p, double *arg2p,double retval)使用者修改數學錯誤返回資訊函式(沒有必要使用)

unsigned int _clear87()  清除浮點狀態字並返回原來的浮點狀態

void        _fpreset()   重新初使化浮點數學程式包

unsigned int _status87()  返回浮點狀態字

--------------------------------------------------------------------------------------------------------------------------------------------

目錄函式,所在函式庫為dir.h、dos.h

int    chdir(char *path)使指定的目錄path(如:"C:\\WPS")變成當前的工作目錄,成 功返回0

int findfirst(char *pathname,struct ffblk *ffblk,intattrib)查詢指定的檔案,成功返回0

    pathname為指定的目錄名和檔名,如"C:\\WPS\\TXT"

        ffblk為指定的儲存檔案資訊的一個結構,定義如下:

   ┏━━━━━━━━━━━━━━━━━━┓

    ┃structffblk                       ┃

   ┃{                                  ┃

    ┃ charff_reserved[21]; ┃

    ┃ charff_attrib;      ┃

    ┃int ff_ftime;       ┃

    ┃int ff_fdate;       ┃

    ┃ longff_fsize;       ┃

    ┃ charff_name[13];       ┃

   ┃}                                  ┃

   ┗━━━━━━━━━━━━━━━━━━┛

    attrib為檔案屬性,由以下字元代表

   ┏━━━━━━━━━┳━━━━━━━━┓

   ┃FA_RDONLY 只讀檔案┃FA_LABEL  卷標號┃

   ┃FA_HIDDEN 隱藏檔案┃FA_DIREC  目錄 ┃

   ┃FA_SYSTEM 系統檔案┃FA_ARCH  檔案  ┃

   ┗━━━━━━━━━┻━━━━━━━━┛

    例:

    structffblk ff;

   findfirst("*.wps",&ff,FA_RDONLY);

int   findnext(struct ffblk*ffblk)     取匹配finddirst的檔案,成功返回0

void  fumerge(char *path,char *drive,char*dir,char *name,char *ext)

      此函式通過碟符drive(C:、A:等),路徑dir(\TC、\BC\LIB等),

      檔名name(TC、WPS等),副檔名ext(.EXE、.COM等)組成一個檔名

      存與path中.

int   fnsplit(char *path,char*drive,char *dir,char *name,char *ext)

      此函式將檔名path分解成碟符drive(C:、A:等),路徑dir(\TC、\BC\LIB等),

      檔名name(TC、WPS等),副檔名ext(.EXE、.COM等),並分別存入相應的變數中.

int   getcurdir(int drive,char*direc) 此函式返回指定驅動器的當前工作目錄名稱

       drive 指定的驅動器(0=當前,1=A,2=B,3=C等)

       direc儲存指定驅動器當前工作路徑的變數     成功返回0

char *getcwd(char *buf,iint n) 此函式取當前工作目錄並存入buf中,直到n個字

     節長為為止.錯誤返回NULL

int   getdisk()取當前正在使用的驅動器,返回一個整數(0=A,1=B,2=C等)

int   setdisk(int drive)設定要使用的驅動器drive(0=A,1=B,2=C等),

      返回可使用驅動器總數

int   mkdir(char*pathname)  建立一個新的目錄pathname,成功返回0

int   rmdir(char*pathname)  刪除一個目錄pathname,成功返回0

char *mktemp(char *template) 構造一個當前目錄上沒有的檔名並存於template中

char *searchpath(char *pathname) 利用MSDOS找出檔案filename所在路徑,

     ,此函式使用DOS的PATH變數,未找到檔案返回NULL

--------------------------------------------------------------------------------------------------------------------------------------------

程序函式,所在函式庫為stdlib.h、process.h

void  abort()此函式通過呼叫具有出口程式碼3的_exit寫一個終止資訊於stderr,

       並異常終止程式。無返回值

int   exec…裝入和執行其它程式

int   execl( char *pathname,char *arg0,char *arg1,…,char *argn,NULL)

int   execle( char*pathname,char *arg0,char *arg1,…,char *argn,NULL,char *envp[])

int   execlp( char*pathname,char *arg0,char *arg1,…,NULL)

int   execlpe(char*pathname,char *arg0,char *arg1,…,NULL,char *envp[])

int   execv( char *pathname,char *argv[])

int   execve( char*pathname,char *argv[],char *envp[])

int   execvp( char*pathname,char *argv[])

int   execvpe(char*pathname,char *argv[],char *envp[])

        exec函式族裝入並執行程式pathname,並將引數

         arg0(arg1,arg2,argv[],envp[])傳遞給子程式,出錯返回-1

      在exec函式族中,字尾l、v、p、e新增到exec後,

      所指定的函式將具有某種操作能力

     有後綴  p時,函式可以利用DOS的PATH變數查詢子程式檔案。

             l時,函式中被傳遞的引數個數固定。

             v時,函式中被傳遞的引數個數不固定。

             e時,函式傳遞指定引數envp,允許改變子程序的環境,

                  無後綴e時,子程序使用當前程式的環境。

void  _exit(int status)終止當前程式,但不清理現場

void  exit(int status)終止當前程式,關閉所有檔案,寫緩衝區的輸出(等待輸出),

                      並呼叫任何暫存器的"出口函式",無返回值

int   spawn…執行子程式

int  spawnl(  int mode,char *pathname,char *arg0,char*arg1,…,char *argn,NULL)

int   spawnle( int mode,char*pathname,char *arg0,char *arg1,…, char*argn,NULL,char *envp[])

int   spawnlp( int mode,char*pathname,char *arg0,char *arg1,…, char*argn,NULL)

int   spawnlpe(int mode,char*pathname,char *arg0,char *arg1,…, char*argn,NULL,char *envp[])

int  spawnv(  int mode,char *pathname,char *argv[])

int   spawnve( int mode,char*pathname,char *argv[],char *envp[])

int   spawnvp( int mode,char*pathname,char *argv[])

int   spawnvpe(int mode,char*pathname,char *argv[],char *envp[])

      spawn函式族在mode模式下執行子程式pathname,並將引數

       arg0(arg1,arg2,argv[],envp[])傳遞給子程式.出錯返回-1

      mode為執行模式

       mode為 P_WAIT  表示在子程式執行完後返回本程式

              P_NOWAIT 表示在子程式執行時同時執行本程式(不可用)

              P_OVERLAY表示在本程式退出後執行子程式

       在spawn函式族中,字尾l、v、p、e新增到spawn後,

       所指定的函式將具有某種操作能力

       有後綴 p時, 函式利用DOS的PATH查詢子程式檔案

              l時, 函式傳遞的引數個數固定.

              v時, 函式傳遞的引數個數不固定.

              e時, 指定引數envp可以傳遞給子程式,允許改變子程式執行環境.

                 當無後綴e時,子程式使用本程式的環境.

int   system(char *command)將MSDOS命令command傳遞給DOS執行

--------------------------------------------------------------------------------------------------------------------------------------------

轉換子程式,函式庫為math.h、stdlib.h、ctype.h、float.h

char   *ecvt(double value,intndigit,int *decpt,int *sign)

        將浮點數value轉換成字串並返回該字串

char   *fcvt(double value,intndigit,int *decpt,int *sign)

        將浮點數value轉換成字串並返回該字串

char   *gcvt(double value,intndigit,char *buf)

        將數value轉換成字串並存於buf中,並返回buf的指標

char  *ultoa(unsigned long value,char*string,int radix)

        將無符號整型數value轉換成字串並返回該字串,radix為轉換時所用基數

char   *ltoa(long value,char*string,int radix)

        將長整型數value轉換成字串並返回該字串,radix為轉換時所用基數

char   *itoa(int value,char*string,int radix)

        將整數value轉換成字串存入string,radix為轉換時所用基數

double atof(char *nptr) 將字串nptr轉換成雙精度數,並返回這個數,錯誤返回0

int   atoi(char *nptr) 將字串nptr轉換成整型數,  並返回這個數,錯誤返回0

long   atol(char *nptr)將字串nptr轉換成長整型數,並返回這個數,錯誤返回0

double strtod(char *str,char **endptr)將字串str轉換成雙精度數,並返回這個數,

long   strtol(char *str,char**endptr,int base)將字串str轉換成長整型數,

                                              並返回這個數,

int   toascii(int c)   返回c相應的ASCII

int   tolower(int ch) 若ch是大寫字母('A'-'Z')返回相應的小寫字母('a'-'z')

int   _tolower(intch)  返回ch相應的小寫字母('a'-'z')

int   toupper(int ch) 若ch是小寫字母('a'-'z')返回相應的大寫字母('A'-'Z')

int   _toupper(intch)  返回ch相應的大寫字母('A'-'Z')

--------------------------------------------------------------------------------------------------------------------------------------------

診斷函式,所在函式庫為assert.h、math.h

void   assert(int test)一個擴充套件成if語句那樣的巨集,如果test測試失敗,

       就顯示一個資訊並異常終止程式,無返回值

void   perror(char *string)本函式將顯示最近一次的錯誤資訊,格式如下:

       字串string:錯誤資訊

char   *strerror(char *str)本函式返回最近一次的錯誤資訊,格式如下:

       字串str:錯誤資訊

int   matherr(struct exception *e)

       使用者修改數學錯誤返回資訊函式(沒有必要使用)

double _matherr(_mexcep why,char *fun,double *arg1p,

               double *arg2p,double retval)

       使用者修改數學錯誤返回資訊函式(沒有必要使用)

輸入輸出子程式,函式庫為io.h、conio.h、stat.h、dos.h、stdio.h、signal.h

int  kbhit()   本函式返回最近所敲的按鍵

int   fgetchar()從控制檯(鍵盤)讀一個字元,顯示在螢幕上

int  getch()   從控制檯(鍵盤)讀一個字元,不顯示在螢幕上

int  putch()   向控制檯(鍵盤)寫一個字元

int  getchar()  從控制檯(鍵盤)讀一個字元,顯示在螢幕上

int  putchar()  向控制檯(鍵盤)寫一個字元

int  getche()  從控制檯(鍵盤)讀一個字元,顯示在螢幕上

int   ungetch(int c)把字元c退回給控制檯(鍵盤)

char *cgets(char *string) 從控制檯(鍵盤)讀入字串存於string中

int   scanf(char*format[,argument…])從控制檯讀入一個字串,分別對各個引數進行

      賦值,使用BIOS進行輸出

int   vscanf(char*format,Valist param)從控制檯讀入一個字串,分別對各個引數進行

      賦值,使用BIOS進行輸出,引數從Valist param中取得

int   cscanf(char*format[,argument…])從控制檯讀入一個字串,分別對各個引數進行

      賦值,直接對控制檯作操作,比如顯示器在顯示時字元時即為直接寫頻方式顯示

int   sscanf(char *string,char*format[,argument,…])通過字串string,分別對各個

      引數進行賦值

int   vsscanf(char*string,char *format,Vlist param)通過字串string,分別對各個

      引數進行賦值,引數從Vlist param中取得

int   puts(char*string)  發關一個字串string給控制檯(顯示器),

      使用BIOS進行輸出

void  cputs(char *string)傳送一個字串string給控制檯(顯示器),

      直接對控制檯作操作,比如顯示器即為直接寫頻方式顯示

int   printf(char*format[,argument,…]) 傳送格式化字串輸出給控制檯(顯示器)

      使用BIOS進行輸出

int   vprintf(char*format,Valist param) 傳送格式化字串輸出給控制檯(顯示器)

      使用BIOS進行輸出,引數從Valist param中取得

int   cprintf(char*format[,argument,…]) 傳送格式化字串輸出給控制檯(顯示器),

      直接對控制檯作操作,比如顯示器即為直接寫頻方式顯示

int   vcprintf(char*format,Valist param)傳送格式化字串輸出給控制檯(顯示器),

      直接對控制檯作操作,比如顯示器即為直接寫頻方式顯示,

      引數從Valist param中取得

int   sprintf(char*string,char *format[,argument,…])

       將字串string的內容重新寫為格式化後的字串

int   vsprintf(char*string,char *format,Valist param)

       將字串string的內容重新寫為格式化後的字串,引數從Valist param中取得

int   rename(char*oldname,char *newname)將檔案oldname的名稱改為newname

int   ioctl(int handle,intcmd[,int *argdx,int argcx])

       本函式是用來控制輸入/輸出裝置的,請見下表:

       ┌───┬────────────────────────────┐

       │cmd值│功能                                                   │

       ├───┼────────────────────────────┤

       │  0  │取出裝置資訊                                           │

       │  1  │設定裝置資訊                                           │

       │  2  │把argcx位元組讀入由argdx所指的地址                       │

       │  3  │在argdx所指的地址寫argcx位元組                           │

       │  4  │除把handle當作裝置號(0=當前,1=A,等)之外,均和cmd=2時一樣 │

       │  5  │除把handle當作裝置號(0=當前,1=A,等)之外,均和cmd=3時一樣 │

       │  6  │取輸入狀態                                             │

       │  7  │取輸出狀態                                             │

       │  8  │測試可換性;只對於DOS3.x                               │

       │  11  │置分享衝突的重算計數;只對DOS3.x                       │

       └───┴────────────────────────────┘

int   (*ssignal(intsig,int(*action)())()執行軟體訊號(沒必要使用)

int   gsignal(intsig)                  執行軟體訊號(沒必要使用)

int   _open(char *pathname,intaccess)為讀或寫開啟一個檔案,

       按後按access來確定是讀檔案還是寫檔案,access值見下表

       ┌──────┬────────────────────┐

       │access值   │意義                                   │

       ├──────┼────────────────────┤

       │O_RDONLY   │讀檔案                                 │

       │O_WRONLY   │寫檔案                                 │

       │O_RDWR     │即讀也寫                               │

       │O_NOINHERIT│若檔案沒有傳遞給子程式,則被包含        │

       │O_DENYALL  │只允許當前處理必須存取的檔案           │

       │O_DENYWRITE│只允許從任何其它開啟的檔案讀           │

       │O_DENYREAD │只允許從任何其它開啟的檔案寫           │

       │O_DENYNONE │允許其它共享開啟的檔案                 │

       └──────┴────────────────────┘

int   open(char *pathname,intaccess[,int permiss])為讀或寫開啟一個檔案,

       按後按access來確定是讀檔案還是寫檔案,access值見下表

       ┌────┬────────────────────┐

       │access值│意義                                   │

       ├────┼────────────────────┤

       │O_RDONLY│讀檔案                                 │

       │O_WRONLY│寫檔案                                 │

       │O_RDWR │即讀也寫                               │

       │O_NDELAY│沒有使用;對UNIX系統相容                │

       │O_APPEND│即讀也寫,但每次寫總是在檔案尾新增      │

       │O_CREAT │若檔案存在,此標誌無用;若不存在,建新檔案 │

       │O_TRUNC│若檔案存在,則長度被截為0,屬性不變      │

       │O_EXCL │未用;對UNIX系統相容                    │

       │O_BINARY│此標誌可顯示地給出以二進位制方式開啟檔案  │

       │O_TEXT  │此標誌可用於顯示地給出以文字方式開啟檔案│

       └────┴────────────────────┘

       permiss為檔案屬性,可為以下值:

        S_IWRITE允許寫  S_IREAD允許讀 S_IREAD|S_IWRITE允許讀、寫

int   creat(char *filename,intpermiss)  建立一個新檔案filename,並設定

      讀寫性。permiss為檔案讀寫性,可以為以下值

       S_IWRITE允許寫  S_IREAD允許讀 S_IREAD|S_IWRITE允許讀、寫

int  _creat(char *filename,intattrib)  建立一個新檔案filename,並設定檔案

     屬性。attrib為檔案屬性,可以為以下值

       FA_RDONLY只讀  FA_HIDDEN隱藏 FA_SYSTEM系統

int   creatnew(char*filenamt,int attrib) 建立一個新檔案filename,並設定檔案

      屬性。attrib為檔案屬性,可以為以下值

        FA_RDONLY只讀  FA_HIDDEN隱藏 FA_SYSTEM系統

int   creattemp(char*filenamt,int attrib) 建立一個新檔案filename,並設定檔案

      屬性。attrib為檔案屬性,可以為以下值

        FA_RDONLY只讀  FA_HIDDEN隱藏 FA_SYSTEM系統

int   read(int handle,void*buf,int nbyte)從檔案號為handle的檔案中讀nbyte個字元

      存入buf中

int  _read(int handle,void *buf,intnbyte)從檔案號為handle的檔案中讀nbyte個字元

      存入buf中,直接呼叫MSDOS進行操作.

int   write(int handle,void*buf,int nbyte)將buf中的nbyte個字元寫入檔案號

      為handle的檔案中

int  _write(int handle,void *buf,intnbyte)將buf中的nbyte個字元寫入檔案號

      為handle的檔案中

int   dup(int handle)複製一個檔案處理指標handle,返回這個指標

int   dup2(int handle,intnewhandle) 複製一個檔案處理指標handle到newhandle

int   eof(int*handle)檢查檔案是否結束,結束返回1,否則返回0

long  filelength(int handle)返回檔案長度,handle為檔案號

int   setmode(inthandle,unsigned mode)本函式用來設定檔案號為handle的檔案的打

      開方式

int   getftime(inthandle,struct ftime *ftime) 讀取檔案號為handle的檔案的時間,

       並將檔案時間存於ftime結構中,成功返回0,ftime結構如下:

       ┌─────────────────┐

       │structftime                     │

       │{                                │

       │ unsigned ft_tsec:5;      │

       │ unsigned ft_min:6;       │

       │ unsigned ft_hour:5;      │

       │ unsigned ft_day:5;       │

       │ unsignedft_month:4;      │

       │ unsigned ft_year:1;   │

       │}                                │

       └─────────────────┘

int   setftime(inthandle,struct ftime *ftime) 重寫檔案號為handle的檔案時間,

      新時間在結構ftime中.成功返回0.結構ftime如下:

       ┌─────────────────┐

       │structftime                     │

       │{                                │

       │ unsigned ft_tsec:5;      │

       │ unsigned ft_min:6;       │

       │ unsigned ft_hour:5;      │

       │ unsigned ft_day:5;       │

       │ unsignedft_month:4;      │

       │ unsigned ft_year:1;   │

       │}                                │

       └─────────────────┘

long  lseek(int handle,long offset,intfromwhere) 本函式將檔案號為handle的檔案

       的指標移到fromwhere後的第offset個位元組處.

        SEEK_SET 檔案開關   SEEK_CUR當前位置   SEEK_END 檔案尾

long  tell(int handle)本函式返回檔案號為handle的檔案指標,以位元組表示

int   isatty(inthandle)本函式用來取裝置handle的型別

int   lock(int handle,longoffset,long length)  對檔案共享作封鎖

int   unlock(int handle,longoffset,long length) 開啟對檔案共享的封鎖

int   close(int handle)關閉handle所表示的檔案處理,handle是從_creat、creat、

       creatnew、creattemp、dup、dup2、_open、open中的一個處呼叫獲得的檔案處理

       成功返回0否則返回-1,可用於UNIX系統

int  _close(int handle)關閉handle所表示的檔案處理,handle是從_creat、creat、

      creatnew、creattemp、dup、dup2、_open、open中的一個處呼叫獲得的檔案處理

      成功返回0否則返回-1,只能用於MSDOS系統

FILE *fopen(char *filename,char *type)開啟一個檔案filename,開啟方式為type,

       並返回這個檔案指標,type可為以下字串加上字尾

     ┌──┬────┬───────┬────────┐

     │type│讀寫性  │文字/2進位制檔案│建新/開啟舊檔案 │

     ├──┼────┼───────┼────────┤

     │r  │讀     │文字         │開啟舊的檔案    │

     │w  │寫     │文字         │建新檔案       │

     │a  │新增   │文字         │有就開啟無則建新│

     │r+  │讀/寫  │不限制       │開啟           │

     │w+  │讀/寫  │不限制       │建新檔案       │

     │a+  │讀/新增│不限制       │有就開啟無則建新│

     └──┴────┴───────┴────────┘

     可加的字尾為t、b。加b表示檔案以二進位制形式進行操作,t沒必要使用

     例: ┌──────────────────┐

         │#include<stdio.h>                  │

         │main()                             │

         │{                                  │

         │ FILE*fp;                         │

         │ fp=fopen("C:\\WPS\\WPS.EXE","r+b");│

         └──────────────────┘

FILE *fdopen(int ahndle,char *type)

FILE *freopen(char *filename,char *type,FILE *stream)

int   getc(FILE*stream)  從流stream中讀一個字元,並返回這個字元

int   putc(int ch,FILE*stream)向流stream寫入一個字元ch

int   getw(FILE *stream)從流stream讀入一個整數,錯誤返回EOF

int   putw(int w,FILE*stream)向流stream寫入一個整數

int   ungetc(char c,FILE*stream) 把字元c退回給流stream,下一次讀進的字元將是c

int   fgetc(FILE *stream)從流stream處讀一個字元,並返回這個字元

int   fputc(int ch,FILE*stream) 將字元ch寫入流stream中

char *fgets(char *string,int n,FILE *stream)從流stream中讀n個字元存入string中

int   fputs(char *string,FILE*stream) 將字串string寫入流stream中

int   fread(void *ptr,intsize,int nitems,FILE *stream) 從流stream中讀入nitems

      個長度為size的字串存入ptr中

int   fwrite(void *ptr,intsize,int nitems,FILE *stream) 向流stream中寫入nitems

      個長度為size的字串,字串在ptr中

int   fscanf(FILE *stream,char*format[,argument,…]) 以格式化形式從流stream中

      讀入一個字串

int   vfscanf(FILE*stream,char *format,Valist param) 以格式化形式從流stream中

      讀入一個字串,引數從Valist param中取得

int   fprintf(FILE*stream,char *format[,argument,…]) 以格式化形式將一個字元

      串寫給指定的流stream

int   vfprintf(FILE*stream,char *format,Valist param) 以格式化形式將一個字元

      串寫給指定的流stream,引數從Valist param中取得

int   fseek(FILE *stream,longoffset,int fromwhere) 函式把檔案指標移到fromwhere

      所指位置的向後offset個位元組處,fromwhere可以為以下值:

      SEEK_SET 檔案開關   SEEK_CUR當前位置   SEEK_END 檔案尾

long  ftell(FILE *stream) 函式返回定位在stream中的當前檔案指標位置,以位元組表示

int   rewind(FILE *stream)將當前檔案指標stream移到檔案開頭

int   feof(FILE *stream)檢測流stream上的檔案指標是否在結束位置

int   fileno(FILE *stream)取流stream上的檔案處理,並返回檔案處理

int   ferror(FILE *stream)檢測流stream上是否有讀寫錯誤,如有錯誤就返回1

void  clearerr(FILE *stream)清除流stream上的讀寫錯誤

void  setbuf(FILE *stream,char *buf)給流stream指定一個緩衝區buf

void  setvbuf(FILE *stream,char *buf,inttype,unsigned size)

      給流stream指定一個緩衝區buf,大小為size,型別為type,type的值見下表

     ┌───┬───────────────────────────────┐

     │type值│意義                                                         │

     ├───┼───────────────────────────────┤

     │_IOFBF│檔案是完全緩衝區,當緩衝區是空時,下一個輸入操作將企圖填滿整個緩│

     │     │衝區.在輸出時,在把任何資料寫到檔案之前,將完全填充緩衝區.     │

     │_IOLBF│檔案是行緩衝區.當緩衝區為空時,下一個輸入操作將仍然企圖填整個緩│

     │     │衝區.然而在輸出時,每當新行符寫到檔案,緩衝區就被清洗掉.       │

     │_IONBF│檔案是無緩衝的.buf和size引數是被忽略的.每個輸入操作將直接從文 │

     │     │件讀,每個輸出操作將立即把資料寫到檔案中.                     │

     └───┴───────────────────────────────┘

int   fclose(FILE *stream)關閉一個流,可以是檔案或裝置(例如LPT1)

int  fcloseall()         關閉所有除stdin或stdout外的流

int   fflush(FILE *stream)關閉一個流,並對緩衝區作處理

       處理即對讀的流,將流內內容讀入緩衝區;

       對寫的流,將緩衝區內內容寫入流。成功返回0

int  fflushall()         關閉所有流,並對流各自的緩衝區作處理

       處理即對讀的流,將流內內容讀入緩衝區;

       對寫的流,將緩衝區內內容寫入流。成功返回0

int   access(char*filename,int amode) 本函式檢查檔案filename並返回檔案的屬性,

       函式將屬性存於amode中,amode由以下位的組合構成

         06可以讀、寫      04可以讀  02可以寫  01執行(忽略的)   00檔案存在

     如果filename是一個目錄,函式將只確定目錄是否存在

     函式執行成功返回0,否則返回-1

int   chmod(char *filename,intpermiss) 本函式用於設定檔案filename的屬性

       permiss可以為以下值

          S_IWRITE允許寫  S_IREAD允許讀 S_IREAD|S_IWRITE允許讀、寫

int  _chmod(char *filename,int func[,intattrib]);

      本函式用於讀取或設定檔案filename的屬性,

      當func=0時,函式返回檔案的屬性;當func=1時,函式設定檔案的屬性

      若為設定檔案屬性,attrib可以為下列常數之一

      FA_RDONLY只讀  FA_HIDDEN隱藏 FA_SYSTEM系統 

介面子程式,所在函式庫為:dos.h、bios.h

unsigned sleep(unsigned seconds)暫停seconds微秒(百分之一秒)

int     unlink(char *filename)刪除檔案filename

unsigned FP_OFF(void far *farptr)本函式用來取遠指標farptr的偏移量

unsigned FP_SEG(void far *farptr)本函式用來沒置遠指標farptr的段值

void far *MK_FP(unsigned seg,unsignedoff)根據段seg和偏移量off構造一個far指標

unsigned getpsp()取程式段字首的段地址,並返回這個地址

char *parsfnm(char *cmdline,struct fcb *fcbptr,int option)

      函式分析一個字串,通常,對一個檔名來說,是由cmdline所指的一個命令列.

      檔名是放入一個FCB中作為一個驅動器,檔名和副檔名.FCB是由fcbptr所指

      定的.option引數是DOS分析系統呼叫時,AL文字的值.

int   absread(int drive,intnsects,int sectno,void *buffer)本函式功能為讀特定的

      磁碟扇區,drive為驅動器號(0=A,1=B等),nsects為要讀的扇區數,sectno為開始的邏

      輯扇區號,buffer為儲存所讀資料的儲存空間

int   abswrite(int drive,intnsects,int sectno,void *buffer)本函式功能為寫特定的

      磁碟扇區,drive為驅動器號(0=A,1=B等),nsects為要寫的扇區數,sectno為開始的邏

      輯扇區號,buffer為儲存所寫資料的所在空間

void  getdfree(int drive,struct dfree*dfreep)本函式用來取磁碟的自由空間,

      drive為磁碟號(0=當前,1=A等).函式將磁碟特性的由dfreep指向的dfree結構中.

      dfree結構如下:

      ┌───────────────────┐

      │structdfree                         │

      │{                                    │

      │ unsigned df_avail;    │

      │ unsigned df_total;    │

      │ unsigned df_bsec;  │

      │ unsigned df_sclus;   │

      │}                                    │

      └───────────────────┘

char far*getdta()            取磁碟轉換地址DTA

void     setdta(char far *dta)設定磁碟轉換地址DTA

void  getfat(int drive,fatinfo *fatblkp)

      本函式返回指定驅動器drive(0=當前,1=A,2=B等)的檔案分配表資訊

      並存入結構fatblkp中,結構如下:

      ┌──────────────────┐

      │structfatinfo                     │

      │{                                  │

      │ char fi_sclus;    │

      │ char fi_fatid; │

      │ int  fi_nclus;       │

      │ int  fi_bysec;   │

      │}                                  │

      └──────────────────┘

void  getfatd(struct fatinfo *fatblkp)本函式返回當前驅動器的檔案分配表資訊,

      並存入結構fatblkp中,結構如下:          

      ┌──────────────────┐

      │structfatinfo                     │

      │{                                  │

      │ char fi_sclus;    │

      │ char fi_fatid; │

      │ int  fi_nclus;       │

      │ int  fi_bysec;   │

      │}                                  │

      └──────────────────┘

int   bdos(int dosfun,unsigneddosdx,unsigned dosal)本函式對MSDOS系統進行呼叫,

      dosdx為暫存器dx的值,dosal為暫存器al的值,dosfun為功能號

int   bdosptr(int dosfun,void*argument,unsiigned dosal)本函式對MSDOS系統進行呼叫,

      argument為暫存器dx的值,dosal為暫存器al的值,dosfun為功能號

int   int86(int intr_num,unionREGS *inregs,union REGS *outregs)

      執行intr_num號中斷,使用者定義的暫存器值存於結構inregs中,

      執行完後將返回的暫存器值存於結構outregs中.

int   int86x(intintr_num,union REGS *inregs,union REGS *outregs,

            struct SREGS *segregs)執行intr_num號中斷,使用者定義的暫存器值存於

      結構inregs中和結構segregs中,執行完後將返回的暫存器值存於結構outregs中.

int   intdos(union REGS*inregs,union REGS *outregs)

      本函式執行DOS中斷0x21來呼叫一個指定的DOS函式,使用者定義的暫存器值

      存於結構inregs中,執行完後函式將返回的暫存器值存於結構outregs中

int   intdosx(union REGS*inregs,union REGS *outregs,struct SREGS *segregs)

      本函式執行DOS中斷0x21來呼叫一個指定的DOS函式,使用者定義的暫存器值

      存於結構inregs和segregs中,執行完後函式將返回的暫存器值存於結構outregs中

void  intr(int intr_num,struct REGPACK*preg)本函式中一個備用的8086軟體中斷介面

      它能產生一個由引數intr_num指定的8086軟體中斷.函式在執行軟體中斷前,

      從結構preg複製使用者定義的各暫存器值到各個暫存器.軟體中斷完成後,

      函式將當前各個暫存器的值複製到結構preg中.引數如下:

      intr_num 被執行的中斷號

      preg為儲存使用者定義的暫存器值的結構,結構如下

      ┌──────────────────────┐

      │structREGPACK                             │

      │{                                          │

      │ unsignedr_ax,r_bx,r_cx,r_dx;             │

      │ unsigned r_bp,r_si,r_di,r_ds,r_es,r_flags; │

      │}                                          │

      └──────────────────────┘

      函式執行完後,將新的暫存器值存於結構preg中

void  keep(int status,intsize)以status狀態返回MSDOS,但程式仍保留於記憶體中,所佔

      用空間由size決定.

void  ctrlbrk(int (*fptr)())設定中斷後的對中斷的處理程式.

void  disable() 禁止發生中斷

void  enable()  允許發生中斷

void  geninterrupt(intintr_num)執行由intr_num所指定的軟體中斷

void  interrupt(* getvect(int intr_num))()返回中斷號為intr_num的中斷處理程式,

      例如: old_int_10h=getvect(0x10);

void  setvect(int intr_num,void interrupt(*isr)()) 設定中斷號為intr_num的中

      斷處理程式為isr,例如: setvect(0x10,new_int_10h);

void  harderr(int (*fptr)()) 定義一個硬體錯誤處理程式,

      每當出現錯誤時就呼叫fptr所指的程式

void  hardresume(int rescode)硬體錯誤處理函式

void  hardretn(int errcode) 硬體錯誤處理函式

int   inport(int prot)從指定的輸入埠讀入一個字,並返回這個字

int   inportb(intport)從指定的輸入埠讀入一個位元組,並返回這個位元組

void  outport(int port,int word)將字word寫入指定的輸出埠port

void  outportb(int port,charbyte)將位元組byte寫入指定的輸出埠port

int   peek(intsegment,unsigned offset) 函式返回segment:offset處的一個字

char  peekb(int segment,unsignedoffset)函式返回segment:offset處的一個位元組

void  poke(int segment,int offset,char value)將字value寫到segment:offset處

void  pokeb(int segment,int offset,int value)將位元組value寫到segment:offset處

int   randbrd(struct fcb*fcbptr,int reccnt)

      函式利用開啟fcbptr所指的FCB讀reccnt個記錄.

int   randbwr(struct fcb*fcbptr,int reccnt)

      函式將fcbptr所指的FCB中的reccnt個記錄寫到磁碟上

void  segread(struct SREGS*segtbl)函式把段暫存器的當前值放進結構segtbl中

int  getverify()        取檢驗標誌的當前狀態(0=檢驗關閉,1=檢驗開啟)

void  setverify(int value)設定當前檢驗狀態,

      value為0表示關閉檢驗,為1表示開啟檢驗

int  getcbrk()本函式返回控制中斷檢測的當前設定

int   setcbrk(intvalue)本函式用來設定控制中斷檢測為接通或斷開

      當value=0時,為斷開檢測.當value=1時,為接開檢測

int   dosexterr(struct DOSERR*eblkp)取擴充套件錯誤.在DOS出現錯誤後,此函式將擴充的

      錯誤資訊填入eblkp所指的DOSERR結構中.該結構定義如下:

     ┌──────────────┐

     │structDOSERR              │

     │{                          │

     │ int  exterror; │

     │ char class;   │

     │ char action;     │

     │ char locus;   │

     │}                          │

     └──────────────┘

int   bioscom(int cmd,chartype,int port) 本函式負責對資料的通訊工作,

       cmd可以為以下值:

       0置通訊引數為位元組byte值    1 傳送字元通過通訊線輸出

       2從通訊線接受字元          3 返回通訊的當前狀態

       port為通訊埠,port=0時通訊埠為COM1,port=1時通訊埠為COM2,以此類推

       byte為傳送或接收資料時的引數,為以下位的組合:

       ┌───┬─────┬───┬─────┬───┬─────┐

       │byte值│意義     │byte值│意義     │byte值│意義     │               │

       ├───┼─────┼───┼─────┼───┼─────┤

       │0x02  │7資料位  │0x03  │8資料位  │0x00  │1停止位  │               │

       │0x04  │2停止位  │0x00  │無奇偶性 │0x08 │奇數奇偶性│               │

       │0x18  │偶數奇偶性│0x00 │110波特   │0x20 │150波特  │               │

       │0x40  │300波特  │0x60  │600波特  │0x80  │1200波特 │               │

       │0xA0  │2400波特 │0xC0  │4800波特 │0xE0  │9600波特 │               │

       └───┴─────┴───┴─────┴───┴─────┘

       例如:0xE0|0x08|0x00|0x03即表示置通訊口為9600波特,奇數奇偶性,1停止位,

            8資料位.

       函式返回值為一個16位整數,定義如下:

       第15位 超時

       第14位 傳送移位暫存器空

       第13位 傳送固定暫存器空

       第12位 中斷檢測

       第11位 幀錯誤

       第10位 奇偶錯誤

       第 9位 過載執行錯誤

       第 8位 資料就緒

       第 7位 接收線訊號檢測

       第 6位 環形指示器

       第 5位 資料設定就緒

       第 4位 清除傳送

       第 3位 δ接收線訊號檢測器

       第 2位 下降邊環形檢測器

       第 1位 δ資料設定就緒

       第 0位 δ清除傳送

int   biosdisk(int cmd,intdrive,int head,int track,

              int sector,int nsects,void *buffer)

      本函式用來對驅動器作一定的操作,cmd為功能號,

      drive為驅動器號(0=A,1=B,0x80=C,0x81=D,0x82=E等).cmd可為以下值:

       0 重置軟磁碟系統.這強迫驅動器控制器來執行硬復位.忽略所有其它引數.

       1 返回最後的硬碟操作狀態.忽略所有其它引數

       2 讀一個或多個磁碟扇區到記憶體.讀開始的扇區由head、track、sector給出。

         扇區號由nsects給出。把每個扇區512個位元組的資料讀入buffer

       3 從記憶體讀資料寫到一個或多個扇區。寫開始的扇區由head、track、sector

         給出。扇區號由nsects給出。所寫資料在buffer中,每扇區512個位元組。

       4 檢驗一個或多個扇區。開始扇區由head、track、sector給出。扇區號由

         nsects給出。

       5 格式化一個磁軌,該磁軌由head和track給出。buffer指向寫在指定track上

         的扇區磁頭器的一個表。

         以下cmd值只允許用於XT或AT微機:

       6 格式化一個磁軌,並置壞扇區標誌。

       7 格式化指定磁軌上的驅動器開頭。

       8 返回當前驅動器引數,驅動器資訊返回寫在buffer中(以四個位元組表示)。

       9 初始化一對驅動器特性。

      10 執行一個長的讀,每個扇區讀512加4個額外位元組

      11 執行一個長的寫,每個扇區寫512加4個額外位元組

      12 執行一個磁碟查詢

      13 交替磁碟復位

      14 讀扇區緩衝區

      15 寫扇區緩衝區

      16 檢查指定的驅動器是否就緒

      17 複核驅動器

      18 控制器RAM診斷

      19 驅動器診斷

      20 控制器內部診

      函式返回由下列位組合成的狀態位元組:

      0x00 操作成功

      0x01 壞的命令

      0x02 地址標記找不到

      0x04 記錄找不到

      0x05 重置失敗

      0x07 驅動引數活動失敗

      0x09 企圖DMA經過64K界限

      0x0B 檢查壞的磁碟標記

      0x10 壞的ECC在磁碟上讀

      0x11 ECC校正的資料錯誤(注意它不是錯誤)

      0x20 控制器失效

      0x40 查詢失敗

      0x80 響應的連線失敗

      0xBB 出現無定義錯誤

      0xFF 讀出操作失敗

int   biodquip()檢查裝置,函式返回一位元組,該位元組每一位表示一個資訊,如下:

      第15位 印表機號

      第14位 印表機號

      第13位 未使用

      第12位 連線遊戲I/O

      第11位 RS232埠號

      第 8位 未使用

      第 7位 軟磁碟號

      第 6位 軟磁碟號,

             00為1號驅動器,01為2號驅動器,10為3號驅動器,11為4號驅動器

      第 5位 初始化

      第 4位 顯示器模式

             00為未使用,01為40x25BW彩色顯示卡

             10為80x25BW彩色顯示卡,11為80x25BW單色顯示卡

      第 3位 母扦件

      第 2位 隨機存貯器容量,00為16K,01為32K,10為48K,11為64K

      第 1位 浮點共用處理器

      第 0位 從軟磁碟引導

int   bioskey(intcmd)本函式用來執行各種鍵盤操作,由cmd確定操作。

      cmd可為以下值:

      0 返回敲鍵盤上的下一個鍵。若低8位為非0,即為ASCII字元;若低8位為0,

        則返回擴充了的鍵盤程式碼。

      1 測試鍵盤是否可用於讀。返回0表示沒有鍵可用;否則返回下一次敲鍵之值。

        敲鍵本身一直保持由下次呼叫具的cmd值為0的bioskey所返回的值。

      2 返回當前的鍵盤狀態,由返回整數的每一個位表示,見下表:

       ┌──┬───────────┬───────────┐

       │ 位│為0時意義            │為1時意義            │

       ├──┼───────────┼───────────┤

       │ 7 │插入狀態             │改寫狀態             │

       │ 6 │大寫狀態             │小寫狀態             │

       │ 5  │數字狀態,NumLock燈亮 │游標狀態,NumLock燈熄 │

       │ 4 │ScrollLock燈亮       │ScrollLock燈熄       │

       │ 3 │Alt按下              │Alt未按下            │

       │ 2 │Ctrl按下             │Ctrl未按下           │

       │ 1 │左Shift按下          │左Shift未按下        │

       │ 0 │右Shift按下          │右Shift未按下        │

       └──┴───────────┴───────────┘

int  biosmemory()返回記憶體大小,以K為單位.

int   biosprint(int cmd,intbyte,int port)控制印表機的輸入/輸出.

      port為印表機號,0為LPT1,1為LPT2,2為LPT3等

      cmd可以為以下值:

        0 列印字元,將字元byte送到印表機

        1 印表機埠初始化

        2 讀印表機狀態

      函式返回值由以下位值組成表示當前印表機狀態

        0x01 裝置時間超時

        0x08 輸入/輸出錯誤

        0x10 選擇的

        0x20 走紙

        0x40 認可

        0x80 不忙碌

int   biostime(int cmd,longnewtime)計時器控制,cmd為功能號,可為以下值

       0 函式返回計時器的當前值

       1 將計時器設為新值newtime

struct country *country(int countrycmode,struct country*countryp)

      本函式用來控制某一國家的相關資訊,如日期,時間,貨幣等.

      若countryp=-1時,當前的國家置為countrycode值(必須為非0).否則,由countryp

      所指向的country結構用下列的國家相關資訊填充:

      (1)當前的國家(若countrycode為0或2)由countrycode所給定的國家.

      結構country定義如下:

     ┌────────────────────┐

     │structcountry                         │

     │{                                      │

     │ int co_date;            │

     │ charco_curr[5];         │

     │ charco_thsep[2];       │

     │ charco_desep[2];          │

     │ charco_dtsep[2];       │

     │ charco_tmsep[2];       │

     │ charco_currstyle;       │

     │ charco_digits;          │

     │ int (far *co_case)(); │

     │ charco_dasep;          │

     │ charco_fill[10];        │

     │}                                      │

     └────────────────────┘

      co_date的值所代表的日期格式是:

       0 月日年    1日月年    2 年月日

      co_currstrle的值所