C語言 檔案I O操作

2021-08-25 05:38:36 字數 2821 閱讀 8266

c語言讀寫檔案的步驟一般是:

建立或開啟檔案 > 讀或寫檔案 > 關閉檔案

當然讀或寫的過程中還可以通過操作當前檔案偏移量來控制讀寫位置。

下面分別介紹這些函式:

標頭檔案:

#include 

//此標頭檔案定義了以下oflag

o_rdonly //唯讀0

o_wronly //只寫1

o_rdwr //讀寫2

//上面三個oflag必須選且只能選乙個,下面是可選oflag

o_creat //若不存在則建立。使用此選項時需要第三個引數mode,用以指定新檔案訪問許可權位。

o_excl //如果指定了o_creat,檔案存在則報錯,不存在則建立。測試檔案存在和建立檔案為原子操作。

o_trunc //若檔案存在,且以只寫或讀寫開啟,則將其長度截短為0。

o_noctty //若pathname為終端裝置,則不將該裝置分配作為此程序的控制終端。

o_nonblock //若pathname為fifo、塊特殊檔案或字元特殊檔案,則為檔案的本次開啟操作和後續i/o操作設定非阻塞模式。

o_rsync //使每乙個以檔案描述符作為引數的read操作等待,直至任何對檔案同一部分進行的未決寫操作都完成。

o_dsync //使每次write等待物理i/o操作完成,但是如果寫操作不影響讀取剛寫入的資料,則不等待檔案屬性被更新。

o_sync //使每次write等到物理i/o操作完成,包括由write操作引起的檔案屬性更新所需的i/o。

o_sync和o_dsync區別:

o_sync:每次write後檔案屬性更新完成,write才返回,不管write是否寫入新位元組或檔案內容是否被修改。

而o_dsync在write並不影響檔案資料內容時,檔案屬性不會變。

開啟:
#include 

int open(const char *pathname, int oflag, ... /* mode_t mode */);

//成功返回檔案描述符,出錯返回-1

建立:
#include 

int create(const

char *pathname, mode_t mode);

//成功返回檔案描述符,出錯返回-1

//相當於:

open(pathname,o_wronly |o_creat | o_trunc, mode);

//create後檔案是只寫方式開啟,若要讀,則需要先呼叫create、close,然後再open,也可以直接用下面的方式open:

open(pathname,o_rdwr |o_creat | o_trunc, mode);

關閉:
#include 

int close(int filedes);

//成功返回0,出錯返回-1。當乙個程序終止時,核心會自動關閉它所開啟的所有檔案。

移動檔案偏移量:
#include 

off_t lseek(int filedes, off_t offset, int whence);

//成功則返回新偏移量(從檔案頭開始計),出錯返回-1。off_t型別是長整型。

whence引數決定了offset引數是從何處開始計算偏移量:

seek_set //從檔案頭開始計,加上offset偏移量,offset為正

seek_cur //從當前位置開始計,加上offset偏移量,offset為正或負

seek_end //從檔案尾開始計,加上offset偏移量,offset為正正或負

lseek只將當前檔案偏移量記錄在核心中,不會引起任何i/o操作。

若是將偏移量移動到大於當前檔案的長度以後,再寫入資料,檔案中會形成乙個空洞,檔案大小會變為新的長度,但是雖然檔案大小很大,其空洞部分卻並不會占用額外的磁碟空間。

讀取:

#include 

ssize_t read(int filedes, void *buf, size_t nbytes);

//成功返回讀取位元組數,若已達到檔案結尾返回0, 出錯返回-1

void * 用於表示通用指標

ssize_t 為帶符號的整數

size_t 不帶符號整數

寫:
#include 

ssize_t write(int filedes, const

void *buf, size_t nbytes);

//成功返回已寫位元組數,出錯返回-1

c語言中,任何需要多個函式呼叫的操作都不可能是原子操作,所以:

lseek(fd, 0l, seek_end);

write(fd, buf, 100);

pread和pwrite:
#include 

ssize_t pread(int filedes, void *buf, size_t nbytes, off_t offset);

ssize_t pwrite(int filedes, const

void *buf, size_t nbytes, off_t offset);

//返回值分別同read、write

pread相當於lseek和read, pwrite相當於lseek和write,但是有以下不同:

1、呼叫pread或pwrite時,無法終端其定位和讀寫操作(原子的)。

2、pread或pwrite操作不會更新檔案偏移量。

C語言檔案IO操作(標準IO)

函式 file fopen const char path,const char mode 引數1 將要開啟的檔案路徑 引數2 開啟檔案的方式 1.r 唯讀的方式開啟 2.w 若檔案不存在則建立檔案,若存在此檔案則清空檔案內容並打卡 3.a 若檔案不存在則建立檔案,若存在則在末尾追加 不會清空原檔案...

C語言標準I O檔案操作

模式字串 意義 r 開啟乙個文字檔案,可以讀取檔案 w 開啟乙個文字檔案,可以寫入檔案,先將檔案的長度截為0,如果檔案不存在則建立之 a 開啟乙個文字檔案可以寫入檔案,向已有檔案的尾部追加內容,如果該檔案不存在則建立之 r 開啟乙個文字檔案,可以進行更新,也即可以讀取和寫入檔案 w 開啟乙個文字檔案...

C 檔案IO操作

3.檔案 a 檔案基本操作 public static filestream create string 給定檔案路徑名,建立檔案,並返回乙個filestream流物件。public static streamwriter createtext string 給定檔案路徑名,以文字的方式建立檔案,並...