檔案讀寫操作的函式

2021-08-17 05:41:26 字數 3192 閱讀 4868

筆記:

/*

#include

#include

#include

#include

intopen(const char *pathname, int flags);

intopen(const char *pathname, int flags, mode_t mode);

int creat(const char *pathname, mode_t mode);

當flags包含o_creat時,需要加引數mode。其他情況不用mode引數,加了也被忽略。

ssize_t read(int fd, void *buf, size_t count);

從fd中讀取count大小的位元組內容到buf中。返回讀到的長度,出錯返回-1。返回值可能比count小,這不被認為時錯誤,原因可能是檔案本來就沒有那麼多東西讀(已到達檔案末尾,或者從pipe或terminal讀),也可能是被訊號打斷了。

ssize_t write(int fd, const void *buf, size_t count);

從buf中寫count大小的位元組內容到fd。返回寫入的長度(0表示沒寫進去任何東西),出錯返回-1。實際寫入位元組數可能比count小,這不算錯誤,原因可能是因為磁碟中沒有更多空間讓你寫了,或者檔案大小已超過rlimit_fsize限制,或者寫的過程中被訊號打斷了。

o_creat需要讀寫buffer對齊。

o_rdonly, o_wronly, o_rdwr的值分別為0,1,2,因此,o_rdonly|o_wronly和o_rdwr不一樣哦。

open()可以建立裝置檔案,但creat()不行,可以用mknod。

o_nonblock通常只用在你想開啟檔案但不想去讀寫,例如開啟裝置檔案只進行ioctl操作。

用file指標開啟和讀寫檔案:

#include

file *fopen(const char *path, const char *mode);

其中mode可以取:

r 讀方式開啟,檔案pos在檔案開頭。

r+ 讀寫方式開啟,檔案pos在檔案開頭。

w 寫方式開啟,將檔案truncate到0,如果檔案不存在則新建。檔案pos在檔案開頭。

w+ 讀寫方式開啟,將檔案truncate到0,如果檔案不存在則新建。檔案pos在檔案開頭。

a 追加方式開啟,如果檔案不存在則新建。檔案pos在檔案末尾(eof)。

a+ 讀和追加方式開啟,如果檔案不存在則新建。讀時檔案pos在檔案開頭,寫時pos在檔案末尾(eof)。

b 二進位制方式,可加在上述mode的後面或mode組合的中間。在一些系統上,文字檔案和二進位制檔案處理方式不同,想要讀二進位制就要加這個。

size_t fread(void *ptr, size_t size, size_t nmemb, file *stream);

size_t fwrite(const void *ptr, size_t size, size_t nmemb,

file *stream);

注意fread不會區分end-of-file和error,返回值都會小於你本要寫的長度,要通過feof()和ferror()做進一步判斷。

int fseek(file *stream, long offset, int whence);//引數同lseek。第二個引數要傳long型。成功返回0.

long ftell(file *stream);//獲得當前pos。

void rewind(file *stream);//把檔案流的pos指向0位置。同(void) fseek(stream, 0l, seek_set);

char * readline (const char *prompt);

從命令列讀取一行,以字串形式給出結果。引數prompt通常為空,其他語言沒有這個引數。

readline遇到換行符或eof就返回,出錯也返回(null)。返回值為讀到的內容的指標(換行符被跳過,不返回)。

讀的buffer是內部分配的,所以用完後記得手動釋放掉。

讀不到換行是阻塞住不返回的。

如果一行除了eof沒有內容,函式返回null。

*/

示例程式:

#include 

#include

#include

#include

#include

#define test_file_name "./ftest.txt"

int main()

#if 1

memset(rwbuf, 0, 64);

readc = read(fd, rwbuf, 64);

printf("%d, %s\n", readc, rwbuf); //不會因為'\0'或'\r''\n'停下來,並且它們也算一位元組長度。

//offset指向已經讀的下乙個位元組

curoffset = lseek(fd, 0, seek_cur); //seek_set, seek_end, seek_data, seek_hole

printf("offset = %d\n", curoffset);

lseek(fd, 12, seek_set); //lseek64?

writec = write(fd, "zhenfg", 6);

#else

memset(rwbuf, 0, 64);

readc = read(fd, rwbuf, 64);

int i;

for (i = 0; i < readc; i++) //可以讀取二進位制檔案。不像fopen還要加"b"模式

printf("\n");

#endif

close(fd);

return

0;}

讀寫檔案時的判斷示例:

#if 0

raw發包:

while (send_left > 0/* && try_time--*/)

else

}if (0 == sent_bytes)

bufp += sent_bytes;

send_left -= sent_bytes;

}讀body:

while (判斷) else

if (ret == -1) else }}

#endif

檔案的讀寫操作

說明 首先以讀寫方式開啟 r w a 都可以,不過要注意讀寫位置指標分別指向檔案頭 檔案頭 檔案尾 一次讀乙個字元 此時讀寫位置指標指向此位元組後面,判斷後,若要轉換,移動讀寫位置指標fseek fp,1l,seek cur 再寫入,由於在c中規定 以上述三種方式開啟檔案,既可讀又可寫,但 在沒有插...

檔案的讀寫操作

1.讀寫字元函式fgetc fputc int fgetc file stream 將流指標指向的檔案中的乙個字元輸出。若檔案指標指到檔案尾,會遇到檔案結束標誌eof 1 我們可以通過檢查該函式的返回值是否是 1來判斷是否已讀到檔案尾。int fputc int ch,file stream 將字元...

檔案的讀寫操作

1.read 會一次性讀取檔案的全部內容。2.readline 每次讀取一行,並且自帶換行功能,每一行末尾會讀到 n。3.readlines 一次性以行的形式讀取檔案的所有內容並返回乙個list,需要去遍歷讀出來。4.file控制代碼是乙個可迭代的物件因此,可以迴圈讀取檔案中的內容,每次讀一行。a ...