1. 程式人生 > >linux下的標準文件庫

linux下的標準文件庫

uil 描述符 () 系統數據 literal atime 狀態 ring file

linux下的標準文件庫

查詢文件屬性

頭文件

<sys/types.h> <sys/stat.h>

函數

  • int stat(const char *filename, struct stat *buf)

    獲取文件屬性

  • int fstat(int fd, struct stat *buf)

    功能同stat,但是入參是文件描述符

  • int lstat(const char *filename, struct stat *buf)

    功能同 stat,但是能處理鏈接文件

stat結構體

>   dev_t st_dev         //設備ID
    mode_t  st_mode   //文件類型與權限
    nlink_t   st_nlink    //文件鏈接數
    uid_t      st_uid      //文件所有人 ID
    gid_t      st_gid       //文件所屬組 ID
    off_t       st_size     //文件大小
    time_t    st_atime  //最近訪問時間
    time_t    st_mtime //最近修改時間
    time_t    st_ctime //文件狀態最近改變時間

文件類型

  • S_IFREG 普通文件 -
  • S_IFDIR 目錄文件 d
  • S_IFCHR 字符文件 c
  • S_IFBLK 塊文件 b
  • S_IFIFO 管道文件 p
  • S_IFLNK 符號鏈接 l
  • S_IFSOCK 套接字文件
  • S_IFMT 掩碼

判斷方法: if (st_mode & S_IFMT)

宏判斷, 返回 0或者1 S_ISREG(st_mode) 判斷是否為普通文件 -

S_ISDIR(st_mode) 判斷是否為目錄文件 d

S_ISCHR(st_mode) 判斷是否為字符文件 c

S_ISBLK(st_mode) 判斷是否為塊文件 b

S_ISFIFO(st_mode) 判斷是否為管道文件 p

S_ISLNK(st_mode) 判斷是否為符號鏈接 l

S_ISSOCK(st_mode) 判斷是否位套接字文件

文件訪問權限屬性

S_IRUSR S_IWUSR S_IXUSR

S_IRGRP S_IWGRP S_IXGRP

S_IROTH S_IWOTH S_IXOTH

判斷方法:if (st_mode & S_IRUSR)

查詢文件系統相關信息

頭文件

#include <sys/statfs.h> 或者下面這個 #include<sys/vfs.h>

函數

int statfs(const char *path, struct statfs *buf)

int fstatfs(int fd, struct statfs *buf)

statfs結構體

long    f_type;       /* 文件系統類型  */ 
long    f_bsize;      /* 經過優化的傳輸塊大小  */ 
long    f_blocks;    /* 文件系統數據塊總數 */ 
long    f_bfree;      /* 可用塊數 */ 
long    f_bavail;     /* 非超級用戶可獲取的塊數 */ 
long    f_files;        /* 文件結點總數 */ 
long    f_ffree;        /* 可用文件結點數 */ 
fsid_t  f_fsid;          /* 文件系統標識 */ 
long    f_namelen;  /* 文件名的最大長度 */

文件操作

  • FILE* fopen(const char* filename, const char* mode)

    打開文件

  • FILE* freopen(const char* filename, const char* mode, FILE* stream)

    文件重定向 例如:

    FILE *pFile
        pFile= freopen(“1.txt”, “w”, stderr)
       // 所有輸出到stderr的內容被輸出到 1.txt
        pFile = freopen(“1.txt”, “r”, stdin)
        //所有有stdin輸入的地方,變成從 1.txt 輸入
  • int fclose(FILE* stream)

    關閉文件

  • int remove(const char *filename)

    刪除文件

  • int rename(const char *oldname, const char * newname)

    重命名文件

標準輸入

  • int getc(FILE *stream)

    從文件流中讀取字符,宏定義方式,效率高,括號裏面不要進行運算

  • int fgetc(FILE *stream)

    從文件中讀取字符,函數定義形式,效率比getc()低

  • int getchar(void)

    從stdin 讀入一個字符, 事實上,就是 getc(stdin)

  • char *gets(char *s)

    從stdin 中讀取字符存入 s,返回NULL或者s地址

  • char *fgets(char *s, int n, FILE *stream)

    加入流長度控制

格式化輸入

  • int scanf(const char *format, ...)
  • int fscanf(FILE stream, const char format, ...)
  • int sscanf(const char* s, const char* format, ...)

標準輸出

  • putc(int c, FILE *stream)

  • putchar(int c)

  • fput(int c, FILE *stream)

    行輸出:以 ‘\0’ 結束輸出

  • int puts(const char *s)

  • int fputs(const char *s, FILE *stream)

格式化輸出

  • int printf()
  • int fprintf()
  • int sprintf()

塊讀寫

  • size_t fread(void *ptr, size_t size, size_t nBlock, FILE *stream)
  • size_t fwrite(const void *ptr, size_t size, size_t nBlock, FILE *stream)

文件狀態

  • ferror(FILE*)

    發生IO錯誤 返回非0,正常返回0

  • feof(FILE*)

    文件結束EOF返回非0, 否則返回0

  • clearer(FILE*)

    清除IO錯誤標誌和 EOF標誌

文件緩沖

BUFSIZ 緩沖區大小的宏,256的整數倍

  • void setbuf(FILE*, char *buf)

    把文件緩沖區設置位 buf, 這裏buf大小位 BUFSIZ

    buf為NULL則關閉緩存

  • int setvbuf(FILE*, char *buf, int type, size_t size)

    指定緩沖區位置(buf)和大小(size)

    type 指定緩沖模式

    • _IOFBF:全緩沖:

      普通文件讀寫,緩沖區滿時寫入文件,讀出文件直到緩沖區滿

    • _IOLBF:行緩沖:

      遇到換行(‘\n’)刷新緩沖區, stdout, stdin

    • _IONBF:無緩沖:

      所有IO直接執行, stderr

  • int fflush(FILE *);

    強制刷新緩沖區

變長參數使用

頭文件: #include<stdarg.h>

va_list: 定義變量列表變量

va_start: 獲取變量列表起始地址

va_arg: 獲取變量,同時指向下一個變量

va_end: 結束變量獲取,釋放句柄(清零變量)

vsprintf/vsnprintf:從變量列表裏依次格式化取變量

變長參數常用來寫日記文件 例如:

#include<stdio.h>
#include<stdarg.h>
#include<string.h>
#include<unistd.h>
#include<fcntl.h>
#include<time.h>
int WriteLog(char *pBuf,...)
{
	va_list vl;
	va_start(vl,pBuf);

	char logBuf[256]={};
	time_t tmtime;
	time(&tmtime);
	struct tm *pTime;
	pTime=localtime(&tmtime);
	strftime(logBuf,255,"%Y-%m-%d %X",pTime);
	int ret=vsnprintf(logBuf+strlen(logBuf),strlen(logBuf)-1,pBuf,vl);
	if(!ret)
	{
		printf("%d\n",ret);
		perror("vsnprintf failed!");
		return -2;
	}
	va_end(vl);
	FILE *pFile;
	pFile=fopen("log.txt","a");
	if(pFile==NULL)
	{
		perror("open file failed!");
		return -1;
	}
	fprintf(pFile,"%s\n\r",logBuf);
	fclose(pFile);
	return 0;
}

linux下的標準文件庫