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
intopen
(const
char
*pathname,
int oflag,..
./* mode_t mode */);
//成功返回檔案描述符,出錯返回-1
#include
intcreate
(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
intclose
(int filedes)
;//成功返回0,出錯返回-1。當乙個程序終止時,核心會自動關閉它所開啟的所有檔案。
lseek只將當前檔案偏移量記錄在核心中,不會引起任何i/o操作。
#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為正正或負
若是將偏移量移動到大於當前檔案的長度以後,再寫入資料,檔案中會形成乙個空洞,檔案大小會變為新的長度,但是雖然檔案大小很大,其空洞部分卻並不會占用額外的磁碟空間。
#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)
;
#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操作不會更新檔案偏移量。
IO檔案讀寫
b表示二進位制模式訪問,但是對於linux或者unix系統來說這個模式沒有任何意義,因為他們把所有檔案都看做二進位制檔案,包括文字檔案 一.三種方法讀取檔案 方法1 open f open d hello.txt r 已讀的方式開啟,open只能讀檔案,不能讀資料夾 fp f.read print ...
C語言檔案IO檔案的非讀寫操作3
非讀寫操作 1 lseek函式 調整檔案指標位置 該函式的用法基本和fseek一樣,唯一的區別是lseek使用檔案描述符代表乙個開啟的檔案 標準io 檔案io開啟 關閉 fopen fclose open close 讀 fgetc fgets fread fscanf read 寫 fputc f...
C語言標準IO檔案的讀寫操作2
3.檔案的讀寫操作 1 以位元組的方式進行讀寫 fputc fgetc 引數 stream 要讀的檔案流返回值 返回讀到的字元,讀到末尾或者發生錯誤返回eof引數 c 要寫入的字元 stream 要寫的檔案流返回值 成功返回寫的字元,失敗返回eof如果要區分讀到末尾還是讀出錯,可以使用以下兩個函式來...