[TOC]
Linux 文件IO 和 標(biāo)準(zhǔn)IO
Linux 文件IO
Linux中做文件IO最常用到的5個(gè)函數(shù)是: open , close , read , write 和 lseek ,不是ISO C的組成部分,這5個(gè)函數(shù)是不帶緩沖的IO姐扮,也即每個(gè)read和write都調(diào)用了內(nèi)核的一個(gè)系統(tǒng)調(diào)用广匙。
#include <fcntl.h>
#include <unistd.h>
int open(const char *pathname, int oflag, ... /* mode_t mode */);/* 成功返回文件描述符双絮, 失敗返回-1 */
int close(int filedes);/* 成功返回0器紧, 失敗返回-1 */
off_t lseek(int filedes, off_t offset, int whence);/* 成功返回新的文件偏移量邓尤,出錯(cuò)返回-1 */
ssize_t read(int filedes, void *buf, size_t nbytes);/* 成功則返回讀取到的字節(jié)數(shù)畔况,若已到文件的結(jié)尾返回0,出錯(cuò)返回-1 */
ssize_t write(int filedes, void *buf, size_t nbytes);/* 成功則返回寫入的字節(jié)數(shù)澄干,出錯(cuò)返回-1 */
Linux 標(biāo)準(zhǔn)IO
標(biāo)準(zhǔn)IO庫提供緩沖功能逛揩,減少系統(tǒng)調(diào)用柠傍。
- 全緩沖。即填滿IO緩沖區(qū)后才進(jìn)行IO操作息尺。
- 行緩沖携兵。遇到換行符時(shí)執(zhí)行IO操作。 * 無緩沖搂誉。
一般情況下徐紧,標(biāo)準(zhǔn)出錯(cuò)無緩沖。如果涉及終端設(shè)備炭懊,一般是行緩沖并级,否則是全緩沖。
可用 setbuf 和 setvbuf 函數(shù)設(shè)置緩沖類型已經(jīng)緩沖區(qū)大小侮腹,使用fflush函數(shù)沖洗緩沖區(qū)嘲碧。
打開流
使用 fopen , freopen , fdopen 三個(gè)函數(shù)打開一個(gè)流,這三個(gè)函數(shù)都返回FILE類型的指針父阻。
#include <stdio.h>
FILE *fopen(const char *restrict pathname, const char *restrict type);
FILE *freopen(const char *restrict pathname, const char *restrict type, FILE *restrict fp);
FILE *dopen(int filedes, const char *type);
/* 成功返回FILE類型指針愈涩,出錯(cuò)返回NULL */
- fopen 打開一個(gè)指定的文件。
- freopen 在一個(gè)指定的流上打開一個(gè)文件加矛,比如在標(biāo)準(zhǔn)輸出流上打開某文件履婉。
- dopen 打開指定的文件描述符代表的文件。常用于讀取管道或者其他特殊類型的文件斟览,因?yàn)檫@些文件不能直接用fopen打開毁腿。
- type 參數(shù)指定操作類型,入讀寫苛茂,追加等等已烤。
關(guān)閉流
fclose 函數(shù)關(guān)閉一個(gè)流:
#include <stdio.h>
int flose(FILE *fp);
/* 成功返回0,出錯(cuò)返回EOF */
讀寫流
- 每次一個(gè)字符的IO流
#include <stdio.h>
/* 輸入 */
int getc(FILE *fp);
int fgetc(FILE *fp);
int getchar(void);
/* 上面三個(gè)函數(shù)的返回值為int妓羊,因?yàn)镋OF常實(shí)現(xiàn)為-1胯究,返回int就能與之比較 */
/* 判斷出錯(cuò)或者結(jié)束 */
int ferror(FILE *fp);
int feof(FILE *fp);
void clearerr(FILE *fp); /* 清除error或者eof標(biāo)志 */
/* 把字符壓送回流 */
int ungetc(intc FILE *fp);
/* 輸出 */
int putc(int c, FILE *fp);
int fputc(int c, FILE *fp);
int putchar(int c);
- 每次一行的IO流
#include <stdio.h>
/* 輸入 */
char *fgets(char *restrict buf, int n, FILE *restrict fp);
char *gets(char *buf);
/* gets由于沒有指定緩沖區(qū),所以有可能造成緩沖區(qū)溢出躁绸,要小心 */
/* 輸出 */
int fputs(char *restrict buf, FILE *restrict fp);
int puts(const char *buf);
- 二進(jìn)制讀取讀寫文件流唐片,常作為讀取打開的整個(gè)流文件
#include <stdio.h>
size_t fread(void *restrict ptr, size_t size, size_t nobj,FILE *restrict fp);
size_t fwrite(const void *restrict ptr, size_t size, size_t nobj,FILE *restrict fp);
/* 返回值:讀或?qū)懙膶?duì)象數(shù) */
定位流
#include <stdio.h>
long ftell(FILE *fp);
/* 成功則返回當(dāng)前文件位置指示,出錯(cuò)返回-1L */
int fseek(FILE *fp, long offset, int whence);
/* 成功返回0涨颜, 出錯(cuò)返回非0 */
int fgetpos(FILE *restrict fp, fpos_t *restrict pos);
int fsetpos(FILE *fp, fpos_t *pos);
/* 成功返回0,出錯(cuò)返回非0 */
格式化輸出IO流
執(zhí)行格式化輸出的主要是4個(gè) printf 函數(shù):
- printf 輸出到標(biāo)準(zhǔn)輸出
- fprintf 輸出到指定流
- sprintf 輸出到指定數(shù)組
- snprintf 輸出到指定數(shù)組并在數(shù)組的尾端自動(dòng)添加一個(gè)null字節(jié)
格式化輸入IO流
格式化輸入主要是三個(gè) scanf 函數(shù):
- scanf 從標(biāo)準(zhǔn)輸入獲取
- fscanf 從指定流獲取
- sscanf 從指定數(shù)組獲取