日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

文件I/O读写操作

發(fā)布時間:2024/1/1 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 文件I/O读写操作 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在上一篇文章中,我簡單講述了如何進行打開文件操作。而在這一篇文章中,我將會對打開的文件進行操作。
在進行文件讀寫操作之前,需要了解一個緩沖區(qū)(buff)的概念,緩沖區(qū)是在內存中預留指定大小的存儲空間用來對I/O的數(shù)據(jù)做臨時存儲,這部分預留的內存空間叫緩沖區(qū)。說白了就是內核把數(shù)據(jù)從文件中讀出來,沒地方放,只能在內存中開辟一塊臨時的空間去存放這個數(shù)據(jù),直到這個數(shù)據(jù)再次被操作,這時候緩沖區(qū)中的數(shù)據(jù)就被拿走了。
下面是read函數(shù)和write函數(shù),這兩個函數(shù)參數(shù)差不多,我把他們并在一起講下面先看函數(shù)定義:

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

是不是非常類似,在這里ssize_t是經(jīng)過類型重定義的int型。
對于第一個參數(shù)fd,就是之前使用open函數(shù)打開的文件描述符,第二個參數(shù)就是最上面所說的緩沖區(qū),我們需要自己定義一個緩沖區(qū)buff,一般都是
char buff[buffsize]=”\0”;在這里我把緩沖區(qū)buff給初始化了,這是為了防止緩沖區(qū)原本有亂碼。第三個參數(shù)是要讀字節(jié)的大小,一般來說我們直接填sizeof(buff)就好了。
他們的返回值都是已近操作的字節(jié)數(shù)(讀入的,讀出的),而錯誤都是返回-1。在這里我寫一段代碼用于計算文件大小。已知文件描述符fd,打開的文件中有字。

#include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <sys/stat.h>#define N 64int main(int argc,char *argv[]) {int fd,sum=0;int ret;char buff[N] = "\0";while((ret = read(fd,buff,sizeof(buff)))>0)//循環(huán)從文件中讀取數(shù)據(jù),直至文件尾部{sum += ret;//每次讀取計數(shù)}printf("the length of the txt is:%d\n",sum);close(fd);return 0; }

這樣子就完成了對一個文件中字節(jié)的計數(shù)。
下面我要講下lseek函數(shù),即文件偏移量(current file offset),讀/寫操作是從當前文件偏移處開始的,在成功進行讀/寫操作后,文件偏移量增加,增加量是進行讀/寫的字節(jié)數(shù)。當文件剛剛打開時,文件偏移量被初始化為0。還記得之前的O_APPEND文件打開參數(shù),則每次寫操作前,將文件位移量設置在文件的當前結尾處。

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

off_t也是類型重定義后int類型,fd是文件描述符,offset是對于基準點的偏移量,可正可負(向前移,向后移),whence是基準點,一般是宏定義,但是也可以寫成數(shù)字的形式。有以下三個基準點:
SEEK_SET:代表文件起始位置,數(shù)字表示為0
SEEK_CUR:代表文件當前的讀寫位置,數(shù)字表示為1
SEEK_END:代表文件結束位置,數(shù)字表示為2
最后,lseek函數(shù)返回值成功就是當前文件偏移量,失敗返回-1。
這里需要注意的是:
lseek函數(shù)不直接進行任何I/O操作,而是把數(shù)據(jù)記錄在內核中。而且該函數(shù)只對常規(guī)文件有效,對于管道,FIFO等無法進行操作。標準I/O中有個fseek與之類似。

最后再補充下文件偏移量實際中的應用:
文件位移量可以大于文件的當前長度,在這種情況下,對該文件的寫操作會延長文件,并形成空洞。
在UNIX/Linux文件操作中,文件位移量可以大于文件的當前長度,在這種情況下,對該文件的下一次寫將延長該文件,并在文件中構成一個空洞,這一點是允許的。位于文件中但沒有寫過的字節(jié)都被設為’\0’,用read讀取空洞部分讀出的數(shù)據(jù)是‘\0’。
空洞文件作用很大,例如迅雷下載文件,在未下載完成時就已經(jīng)占據(jù)了全部文件大小的空間,這時候就是空洞文件。下載時如果沒有空洞文件,多線程下載時文件就都只能從一個地方寫入,這就不是多線程了。如果有了空洞文件,可以從不同的地址寫入,就完成了多線程的優(yōu)勢任務。
Tips:可以使用ls -lh 和 du -sh 對比看空洞文件和正常文件的區(qū)別

總結

以上是生活随笔為你收集整理的文件I/O读写操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。