文件操作相關函數(POSIX 標准 open,read,write,lseek,close)


POSIX標准

open函數屬於Linux中系統IO,用於“打開”文件,代碼打開一個文件意味着獲得了這個文件的訪問句柄。

int fd = open(參數1,參數2,參數3);

int fd = open(const char *pathname,int flags,mode_t mode);

1.句柄(file descriptor 簡稱fd)

   首先每個文件都屬於自己的句柄,例如標准輸入是0,標准輸出是1,標准出錯是2。

   每打開一個文件就會返回句柄來操作這個文件,一般是從3開始,然后4,5,6一直下去。

   close(fd)之后句柄就返回給系統,例如打開一個文件后fd是3,close之后再打開另外一個文件也還是3,但代表的文件不一樣了。

2.使用open前需要先包含頭文件

  #include <sys/types.h>

  #inlcude <sys/stat.h>

  #inlcude <fcntl.h>

3.參數1(pathname)

  即將要打開的文件路徑,例如:“a.txt”當前目錄下的a.txt文件

4.參數2(flags)

  flags分為兩類:主類,副類

  主類:O_RDONLY 以只讀方式打開   /   O_WRONLY 以只寫方式打開   /O_RDWR 以可讀可寫方式打開

  三這是互斥的

  副類:

  O_CREAT 如果文件不存在則創建該文件

  O_EXCL 如果使用O_CREAT選項且文件存在,則返回錯誤消息

  O_NOCTTY 如果文件為終端,那么終端不可以調用open系統調用的那個進程的控制終端

  O_TRUNC 如果文件已經存在則刪除文件中原有數據

  O_APPEND 以追加的方式打開主副可以配合使用,

  例如:O_RDWR|O_CREAT|O_TRUNC

5.參數3(mode)

  mode:如果文件被新建,指定其權限未mode

  mode是八進制權限碼,0777表示文件所有者   該文件用戶組     其他用戶都有可讀可寫可執行權限

//例:
int fd;
fd = open("file",O_RDONLY);            
if(fd < 0)
    打開失敗
else
    打開成功

  

read函數 讀取文件  磁盤上一份 內存中一份

ssize_t count = read(參數1,參數2,參數3)

ssize_t read(int filedes,void *buf,size_t nbytes);

1.count 返回讀到的字節數

若成功返回讀到的字節數,若讀到文件末尾返回0,若失敗返回-1。

2.使用read前需要先包含頭文件

#include <unistd.h>

3.參數1 (filedes)

filedes:open函數的成功返回值

4.參數2 (buf)

內存地址(開辟空間 棧、堆)

5.參數3 (nbytes)

數據大小(空間大小)

例如:
  1 #include <stdio.h>
  2 #include <fcntl.h>
  3 
  4 int main(int argc,char **argv)
  5 {
  6     int fd;
  7     char ch;
  8     //打開文件
  9     fd = open("file",O_RDONLY);//abcdefg
 10     if(fd < 0)
 11         //打開失敗
 12         return -1;
 13     //讀取文件
 14     read(fd,&ch,1);
 15     printf("%c\n",ch);
 16     read(fd,&ch,1);
 17     printf("%c\n",ch);
 18     return 0;
 19 }

  問題:那么一次到底讀取多少字節合適?

  4096 8192
  BUFSIZ  8192
  char buf[BUFSIZ];
  read(fd,buf,sizeof(buf)-1);
 
write函數  將內存中的數據寫入到文件中
ssize_t count = write(參數1,參數2,參數3)
ssize_t write(int filed,const void *buf,size_t nbytes);
1.count 寫入的字節數
返回值:返回實際寫入的字節數,若出錯則返回-1。

2.使用write前需要先包含頭文件

#include <unistd.h>

3.參數1(filed)
open函數的成功返回值
4.參數2(buf)
內存地址
5.參數3(nbytes)
數據大小
 
lseek函數  修改偏移量  影響下一次讀寫的操作
off_t currpos = lseek(參數1,參數2,參數3)
off_t lseek(int fileds,off_t offset,int whence);
1.currpos 新的文件偏移量
返回值:若成功返回新的文件偏移量,若出錯返回-1。

2.使用write前需要先包含頭文件

#include <unistd.h>

3.參數1(fileds)
open函數的成功返回值
4.參數2(offset)
偏移量     -?  0   +?
5.參數(whence)
相對位置
            文件開始            當前位置            文件末尾
            SEEK_SET           SEEK_CUR          SEEK_END
 
close函數關閉文件
close(參數1)
參數1:open函數的成功返回值
 
最后來一個程序來訓練一下這幾個函數(read和write函數復制一個文件)
#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#include<sys/types.h>

#include<sys/stat.h>

#include<unistd.h>

#include<fcntl.h>

 

#define BUFFER_SIZE 1024

 

int main( int argc,char **argv)

{

    int from_fd,to_fd;

    long file_len=0;

    int ret=1;

    char buffer[BUFFER_SIZE];

    char *ptr;

 

    //判斷入參

    if(argc!=3)

    {

        printf("Usage:%s fromfile tofile !\n",argv[0]);

        exit(1);

    }

    

    //打開源文件

    if( (from_fd = open(argv[1],O_RDONLY | O_CREAT ))==-1)

    {

        printf("Open %s Error!\n",argv[1]);

        exit(1);

    }

 

    //創建目的文件

    if( (to_fd = open(argv[2], O_WRONLY | O_CREAT))==-1) 

    {

        printf("Open %s error! \n",argv[2]);

        exit(1);

    }

 

    //測得文件大小

    file_len=lseek(from_fd,0,SEEK_END);

    lseek(from_fd,0,SEEK_SET);

    printf("from file size is %d!\n",file_len);

 

    //進行文件拷貝

    while(ret)

    {

        ret = read(from_fd, buffer, BUFFER_SIZE);

        if(ret == -1)

        {

            printf("read error!\n");

            exit(1);

        }

        write(to_fd, buffer, ret );

        file_len = ret;

        bzero( buffer, BUFFER_SIZE );

    }

 

    printf("there are %d buyes data left without copy!\n",file_len);

    close(from_fd);

    close(to_fd);

 

    exit(0);

 

 

 

 

}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM