linux下的標準文件庫
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下的標準文件庫