1. 程式人生 > >C++IO流檔案指標

C++IO流檔案指標

預編譯器內建巨集

__LINE__    行數
__TIME__    時間
__FUNCTION__   函式
__FINE__     檔名

呼叫

void ioStreamPoint() {
    char write_buf[32] = "Hello Word !!";
    //fd是當前檔案的的標示
    int fd;
    //O_RDWR 可讀寫 O_CREAT 建立 O_TRUNC 檔案清空
    //open匯入的是#include <io.h>和#include <fcntl.h>兩個頭
    if ((fd = open("../example_63.c"
, O_RDWR | O_CREAT | O_TRUNC)) ==-1) my_err("open", __LINE__); else { printf("Creat file success !!\n"); } //寫入檔案,write 的返回值是實際寫入的位元組數 if (write(fd, write_buf, strlen(write_buf)) != strlen(write_buf)) my_err("write", __LINE__); int ret = my_read(fd); printf
("my_read . ret = %d\n", ret); printf("/*-----------------繼續寫入write_buf-------------------*/\n") ; if(lseek(fd,10,SEEK_END)== -1) //從檔案結尾處向後移動10位 my_err("lseek",__LINE__) ; //_LINE_ 預編譯器內建巨集,表示行數 if(write(fd,write_buf,strlen(write_buf)) != strlen(write_buf) ) //寫入檔案,write 的返回值是實際寫入的位元組數 my_err("write"
,__LINE__) ; }

my_read 函式 :

1.實際它必須在ioStreamPoint之前申明
2.邏輯其實就是將檔案指標先移動到結尾(SEEK_END),然後使用(SEEK_CUR)的出到檔案頭的距離,即檔案大小。
3.read方法也可以返回實際讀取到的檔案大小(str)。

int my_read(int fd) //讀資料函式
{
    int len;
    int ret;
    int i;
    char read_buf[64];
    if ((lseek(fd, 0, SEEK_END)) == -1) //移動檔案指標到結尾
        my_err("lseek", __LINE__); //__LINE__  預編譯器內建巨集,表示行數
    if ((len = lseek(fd, 0, SEEK_CUR)) == -1) //求相對於檔案開頭的偏移量,用於表明檔案開始處到檔案當前位置的位元組數 len
        my_err("lseek", __LINE__);
    if ((lseek(fd, 0, SEEK_SET)) == -1) //移動檔案指標到開頭
        my_err("lseek", __LINE__);
    printf(" 位元組數是 : %d \n", len);
    if ((ret = read(fd, read_buf, len)) < 0) //成功時返回實際讀到的位元組數,失敗返回 -1
        my_err("read", __LINE__);
    for (i = 0; i < len; i++)
        printf("%c", read_buf[i]);
    printf("\n");
    return ret;
}

my_err:輸出錯誤提示

void my_err(const char *err_string, int line) {
    //fprintf()函式根據指定的格式(format)向輸出流(stream)寫入資料,把後面的寫到前面
    fprintf(stderr, "line:%d ", line); 
    perror(err_string);//先輸出err_string ,再輸出錯誤原因
    exit(1);
}

輸出結果:

Creat file success !!
位元組數是 : 13
Hello Word !!
my_read . ret = 13
/*-----------------再次寫入write_buf-------------------*/
 位元組數是 : 36
Hello Word !!          Hello Word !!

方式二:

檔案流提供以下成員函式來讀取或配置檔案指標:

tellg()      返回讀取檔案指標的當前位置
tellp()      返回寫入檔案指標的當前位置
seekg(指標偏移量)      將讀取檔案指標移到指定位置
seekg(指標偏移量,參照位置)      將讀取檔案指標移到指定位置
seekp(指標偏移量)      將寫入檔案指標移到指定位置
seekp(指標偏移量,參照位置)  將寫入檔案指標移到指定位置
這些成員函式名和引數,容易混淆,下面就簡單解釋一下:

備註:以上函式中的最後一個字母不是g就是p,代表什麼意思呢?其中,g代表get,表示讀取;p代表put,表示寫入。
另外,函式引數中的“檔案中的位置”和“指標偏移量”為 long整型,以位元組為單位。“參照位置”是一個有以下值的列舉:
ios::beg      檔案開頭計算偏移量
ios::cur      檔案當前位置計算偏移量
ios::end      檔案結尾計算偏移量

例項

    ifstream fs_in;
    fs_in.open("../example_63.c",ios::in);
    if (!fs_in) my_err("read", __LINE__);
    char buff[1024] = {0};
    //通過getline函式讀取字串
    fs_in.getline(buff, 1024);        
    cout << "buff = " << buff << endl;
    fs_in.seekg(ios::end);
    long size = fs_in.tellg();
    cout << "檔案大小:" << size << endl;
    fs_in.close();

輸出:
1.並沒有預期的32位元組
2.getline方法遇到‘\0’將會停止讀取。

buff = Hello Word !!
檔案大小:2

總結:

1.檔案指標能幫助我們繼續新增內容,而避免覆蓋。
2.檔案指標能得到檔案的大小
3.fcntl.h更加簡單的操作IO流。