無標題文章

O_APPEND//追加(在文件后面寫)

=======================================================

復制mp3
#include <stdio.h>
#include <errno.h>  //errno  
#include <string.h>  //strerror()
#include <unistd.h>  //read()  write()
/*open*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


#define PER_IO_BYTES 4096

int myOpen(const char *pathname, mode_t mode)
{
    int fd  = -1;
    if (NULL != pathname)
    {
        fd = open(pathname, mode | O_CREAT
                  , S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
        if (-1 == fd)
        {
            printf("open error: %s\\n", strerror(errno));
        }
    }
    return fd;
}

int main(int argc, char *argv[])
{
    int fdForRead = -1;
    fdForRead = myOpen(argv[1], O_RDONLY);
    if (-1 == fdForRead)
    {
        return -1;
    }   
    int fdForWrite = -1;
    fdForWrite = myOpen(argv[2], O_WRONLY);
    if (-1 == fdForWrite)
    {
        close(fdForRead);
        return -1;
    }   

    unsigned char caBuf[PER_IO_BYTES] = {'\\0'};
    int ret = 0;
    while (1)
    {
        memset(caBuf, '\\0', PER_IO_BYTES);
        ret = read(fdForRead, caBuf, PER_IO_BYTES);
        if (-1 == ret)
        {
            printf("read error: %s\\n", strerror(errno));
            return -1;
        }       
        else if (0 == ret)
        {
            printf("copy file success\\n");
            break;
        }
        else
        {
            printf("read %d bytes from %s\\n", ret, argv[1]);
            ret = write(fdForWrite, caBuf, ret);
            if (-1 == ret)
            {
                printf("write error: %s\\n", strerror(errno));
                return -1;  
            }
            printf("write %d bytes to %s\\n", ret, argv[2]);
        }
    }

    return 0;
}

11.PNG

=======================================================

偏移量
#include <stdio.h>
#include <errno.h>  //errno  
#include <string.h>  //strerror()
//lseek()
#include <unistd.h>  //read()  write()
/*open*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc,char *argv[])
{
    int fd  = -1;
    fd = open(argv[1], O_RDONLY | O_CREAT 
            , S_IRUSR | S_IWUSR | S_IRGRP );
    if (-1 == fd)
    {
        return -1;
    }
        //偏移參照位置:
        //        文件首部映穗,當前位置,文件尾
        //返回值為距離文件首的偏移量

        //第一個參數(shù):文件描述符
        //第二個參數(shù):相對參照位置的偏移量
                    當偏移量為正數(shù)時她肯,往參照物位置后偏移
                    當偏移量為負數(shù)時,往參照物位置前偏移
        //第三個參數(shù):參照位置
    off_t offset =lseek(fd,0,SEEK_END);
    if(-1==offset)
    {
        printf("sleek error: %s\\n", strerror(errno));
    }
    else
    {
        printf("file size: %ld\\n", offset);
    }
    return 0;
}

2.PNG

=======================================================

lseek(設置讀寫位置)

#include <stdio.h>
#include <errno.h>  //errno
#include <string.h>  //strerror()

/*lseek()*/
#include <sys/types.h>
#include <unistd.h>   //read() write()

/*open()*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
    int fd = -1;
    //當打開一個文件時秕脓,讀寫位置默認在文件首部
    fd = open(argv[1], O_RDWR | O_CREAT
              , S_IRUSR | S_IWUSR | S_IRGRP);
    if (-1 == fd)
    {
        printf("open error:%s\\n", strerror(errno));
        return -1;
    }

    //偏移參照位置:
    //    文件首部拐迁,當前位置胸私,文件尾
    //返回值為距離文件首的偏移量

    //第一個參數(shù):文件描述符
    //第二個參數(shù):相對參照位置的偏移量
    //    當偏移量為正數(shù)時挫掏,往參照位置后偏移
    //    當偏移量為負數(shù)時措伐,往參照位置前偏移
    //第三個參數(shù):參照位置 SEEK_SET,SEEK_CUR,SEEK_END
    off_t offset = lseek(fd, 0, SEEK_END);
    if (-1 == offset)
    {
        printf("lseek error:%s\\n", strerror(errno));
        return -1;
    }
    else
    {
        printf("file size: %ld\\n", offset);
    }
    //將讀寫位置偏移到距離文件首部10字節(jié)的地方
    offset = lseek(fd, 10, SEEK_SET);
    printf("offset = %ld\\n", offset);
    char *pData = "888";
    //寫入數(shù)據(jù)時
    //會將以讀寫位置開始的strlen(pData)個字節(jié)的數(shù)據(jù)
    //用新寫入的數(shù)據(jù)覆蓋掉
    write(fd, pData, strlen(pData));

    //將讀寫位置從當前位置往后偏移5字節(jié)
    lseek(fd, 5, SEEK_CUR);
    write(fd, "666", 3);

    //當成功讀寫n個字節(jié)時特纤,
    //讀寫位置會從沒有發(fā)生讀寫前的位置
    //開始往后偏移n個字節(jié)

    //每次讀寫文件時,都是從當前的讀寫位置開始讀寫

    close(fd);

    return 0;
}

pwrite,pread(當一個程序存在多個運行分支)
#include <stdio.h>
#include <errno.h>  //errno
#include <string.h>  //strerror()

/*lseek()*/
#include <sys/types.h>
#include <unistd.h>   //read() write()

/*open()*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

//運行方式:./可執(zhí)行文件名 要進行讀取操作的文件名
// ---> ./autoOpe test.data
int main(int argc, char *argv[])
{
    int fd = -1;
    fd = open(argv[1], O_RDWR | O_CREAT
              , S_IRUSR | S_IWUSR | S_IRGRP);
    if (-1 == fd)
    {
        printf("open error:%s\\n", strerror(errno));
        return -1;
    }

    //當一個程序存在多個運行分支侥加,
    //并且每個運行分支都有可能操作文件時捧存,
    //存在以下問題:
    //    當A分支使用lseek設置讀寫位置完成時,
    //    A分支的運行暫停担败,B分支開始運行昔穴,并且B分支對
    //    文件進行了讀寫操作,從而改變了A分支設這的讀寫位置
    //    當B分支運行暫停提前,A分支重新接著往后運行時
    //    若A分支要對文件進行讀寫吗货,
    //    那么讀寫的位置并不是之前設置的位置,
    //    而是B分支運行后的讀寫位置
    //    從而得不到預期結果

    //原子操作:操作部分狈网,要么都執(zhí)行宙搬,要么都不執(zhí)行
    //問題解決方案:
    //    將A分支的lseek和之后的讀寫操作合成原子操作
    //    方法1, 將操作部分使用鎖,鎖住孙援,合成原子操作
    //    方法2, 調用pread() 或者 pwrite()函數(shù)來完成操作
#if 0
    lseek(fd, -5, SEEK_END);
    write(fd, "666", 3);
#endif

    //pread()/pwrite():
    //    偏移到距離文件首部n字節(jié)的地方進行讀寫操作

    char *pData = "Hello World";
    //第四個參數(shù):從文件首部開始的偏移量
    //第三個參數(shù):要寫入的字節(jié)數(shù)
    ssize_t size = pwrite(fd, pData, strlen(pData), 5);
    if (-1 == size)
    {
        printf("pwrite error:%s\\n", strerror(errno));
    }
    char caBuf[32] = {'\\0'};
    //第四個參數(shù):從文件首部開始的偏移量
    //第三個參數(shù):要讀取的字節(jié)數(shù)
    size = pread(fd, caBuf, 4, 3);
    if (-1 != size)
    {
        printf("%s\\n", caBuf);
    }

    close(fd);

    return 0;
}

運行結果:
test.data里的字符


2.PNG

運行后的結果:(從偏移量為3的位置開始讀取4個字節(jié))


1.PNG

write(寫入數(shù)組stu[6])

#include <stdio.h>
#include <unistd.h>  //write()
#include <errno.h>   //errno
#include <string.h>  //strerror()
/*open()*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define NAME_LEN 32
typedef struct Student
{
    int iId;
    char caName[NAME_LEN];
    char cSex;
    float fScore;

}Student;

int myOpen(const char *pathname)
{
    int fd  = -1;
    if (NULL != pathname)
    {
        fd = open(pathname, O_WRONLY | O_CREAT
                  , S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
        if (-1 == fd)
        {
            printf("open error: %s\\n", strerror(errno));
        }
    }
    return fd;
}

int main(void)
{
    int fd = -1;
    fd = myOpen("stu.info");
    if (-1 != fd)
    {
        Student stu[6] = {{1001, "zhangsan", 'f', 99}
                          , {1002, "lisi", 'm', 79}
                          , {1003, "wangwu", 'f', 89}
                          , {1004, "zhaoliu", 'f', 99}
                          , {1005, "xiaoqi", 'm', 79}
                          , {1006, "laoba", 'm', 89}};
        int ret = -1;
        int i = 0;
        for (; i < 6; i++)
        {
            ret = write(fd, stu+i, sizeof(Student));
            if (-1 == ret)
            {
                printf("write error: %s\\n", strerror(errno));
            }
            else
            {
                printf("write %d bytes to file\\n", ret);
            }
        }
    }   

    return 0;
}

read(讀出1,3,6位置的字符)

#include <stdio.h>
#include <unistd.h>  //write()  read()
#include <errno.h>   //errno
#include <string.h>  //strerror()
/*open()*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define NAME_LEN 32
typedef struct Student
{
    int iId;
    char caName[NAME_LEN];
    char cSex;
    float fScore;

}Student;

void showStuInfo(const Student *pStu)
{
    if (NULL != pStu)
    {
        printf("id:%d, name:%s, sex:%c, score:%.1f\\n"
               , pStu->iId, pStu->caName
               , pStu->cSex, pStu->fScore);
    }
}

int myOpen(const char *pathname)
{
    int fd  = -1;
    if (NULL != pathname)
    {
        fd = open(pathname, O_RDONLY | O_CREAT
                  , S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
        if (-1 == fd)
        {
            printf("open error: %s\\n", strerror(errno));
        }
    }
    return fd;
}

int main(void)
{
    int fd = -1;
    fd = myOpen("stu.info");
    if (-1 != fd)
    {
        int ret = -1;
        Student stu;
            //將Student對象的空間都設置為'\\0'
        memset(&stu, '\\0', sizeof(Student));
        ret = read(fd, &stu, sizeof(Student));
        if (-1 != ret)
        {
            showStuInfo(&stu);
        }

        off_t offset = lseek(fd, sizeof(Student), SEEK_CUR);
        if (-1 != offset)
        {
            memset(&stu, '\\0', sizeof(Student));
            ret = read(fd, &stu, sizeof(Student));
            if (-1 != ret)
            {
                showStuInfo(&stu);
            }
        }
        
        offset = lseek(fd, 2*sizeof(Student), SEEK_CUR);
        if (-1 != offset)
        {
            memset(&stu, '\\0', sizeof(Student));
            ret = read(fd, &stu, sizeof(Student));
            if (-1 != ret)
            {
                showStuInfo(&stu);
            }
        }
        close(fd);
    }   

    return 0;
}

3.PNG
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末害淤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拓售,更是在濱河造成了極大的恐慌窥摄,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件础淤,死亡現(xiàn)場離奇詭異崭放,居然都是意外死亡,警方通過查閱死者的電腦和手機鸽凶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門币砂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人玻侥,你說我怎么就攤上這事决摧。” “怎么了凑兰?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵掌桩,是天一觀的道長。 經(jīng)常有香客問我姑食,道長波岛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任音半,我火速辦了婚禮则拷,結果婚禮上贡蓖,老公的妹妹穿的比我還像新娘。我一直安慰自己煌茬,他們只是感情好斥铺,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宣旱,像睡著了一般仅父。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上浑吟,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天笙纤,我揣著相機與錄音,去河邊找鬼组力。 笑死省容,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的燎字。 我是一名探鬼主播腥椒,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼候衍!你這毒婦竟也來了笼蛛?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤蛉鹿,失蹤者是張志新(化名)和其女友劉穎滨砍,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妖异,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡惋戏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了他膳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片响逢。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖棕孙,靈堂內(nèi)的尸體忽然破棺而出舔亭,到底是詐尸還是另有隱情,我是刑警寧澤蟀俊,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布分歇,位于F島的核電站,受9級特大地震影響欧漱,放射性物質發(fā)生泄漏。R本人自食惡果不足惜葬燎,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一误甚、第九天 我趴在偏房一處隱蔽的房頂上張望缚甩。 院中可真熱鬧,春花似錦窑邦、人聲如沸擅威。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽郊丛。三九已至,卻和暖如春瞧筛,著一層夾襖步出監(jiān)牢的瞬間厉熟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工较幌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留揍瑟,地道東北人。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓乍炉,卻偏偏與公主長得像绢片,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子岛琼,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 轉至元數(shù)據(jù)結尾創(chuàng)建: 董瀟偉底循,最新修改于: 十二月 23, 2016 轉至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,732評論 0 9
  • 【2017年最新】? iOS面試題及答案 設計模式是什么? 你知道哪些設計模式槐瑞,并簡要敘述熙涤? 設計模式是一種編碼經(jīng)...
    紫色冰雨閱讀 607評論 0 1
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,238評論 0 4
  • [TOC] ##Assoc 顯示或修改文件擴展名關聯(lián) Assoc [.Ext[=[Filetype]]] .Ex...
    btijjj閱讀 349評論 0 1
  • 前幾天我去醫(yī)院檢查,發(fā)現(xiàn)身體長東西了随珠。醫(yī)生說要做手術灭袁,可是我前兩年已經(jīng)做過手術了,不想再做手術窗看。便問醫(yī)生可不可以吃...
    蘭奕閱讀 241評論 0 0