本文目錄一覽:
C語言read函數
read內部是調_read, _read的返回值在msdn中有這樣的描述
_read returns the number of bytes read, which might be less than count if there are fewer than count bytes left in the file or if the file was opened in text mode, in which case each carriage return–line feed (CR-LF) pair is replaced with a single linefeed character. Only the single linefeed character is counted in the return value. The replacement does not affect the file pointer.
注意這一段: in which case each carriage return–line feed (CR-LF) pair is replaced with a single linefeed character
就是說如果用text模式打開的話, 文件換行時可能在文本中有2個字元—-換行和縮進(CR-LF), 而在return的時候系統是把它作為1個回車符號(‘\n’)所返回的. 所以會導致這個情況
c 語言中打開文件的函數名為
C語言open()函數:打開文件函數
相關函數:read, write, fcntl, close, link,stat, umask, unlink, fopen
頭文件:#include sys/types.h #includesys/stat.h #include fcntl.h
定義函數:
intopen(const char * pathname, int flags);
intopen(const char * pathname, int flags, mode_t mode);
函數說明:
參數 pathname 指向欲打開的文件路徑字元串. 下列是參數flags 所能使用的旗標:
O_RDONLY 以只讀方式打開文件
O_WRONLY 以只寫方式打開文件
O_RDWR 以可讀寫方式打開文件. 上述三種旗標是互斥的, 也就是不可同時使用, 但可與下列的旗標利用OR(|)運算符組合.
O_CREAT 若欲打開的文件不存在則自動建立該文件.
O_EXCL 如果O_CREAT 也被設置, 此指令會去檢查文件是否存在. 文件若不存在則建立該文件, 否則將導致打開文件錯誤. 此外, 若O_CREAT 與O_EXCL 同時設置, 並且欲打開的文件為符號連接, 則會打開文件失敗.
O_NOCTTY 如果欲打開的文件為終端機設備時, 則不會將該終端機當成進程式控制制終端機.
O_TRUNC 若文件存在並且以可寫的方式打開時, 此旗標會令文件長度清為0, 而原來存於該文件的資料也會消失.
O_APPEND 當讀寫文件時會從文件尾開始移動, 也就是所寫入的數據會以附加的方式加入到文件後面.
O_NONBLOCK 以不可阻斷的方式打開文件, 也就是無論有無數據讀取或等待, 都會立即返回進程之中.
O_NDELAY 同O_NONBLOCK.
O_SYNC 以同步的方式打開文件.
O_NOFOLLOW 如果參數pathname 所指的文件為一符號連接, 則會令打開文件失敗.
O_DIRECTORY 如果參數pathname 所指的文件並非為一目錄, 則會令打開文件失敗。註:此為Linux2. 2 以後特有的旗標, 以避免一些系統安全問題.
參數mode 則有下列數種組合, 只有在建立新文件時才會生效, 此外真正建文件時的許可權會受到umask 值所影響, 因此該文件許可權應該為 (mode-umaks).
S_IRWXU00700許可權, 代表該文件所有者具有可讀、可寫及可執行的許可權.
S_IRUSR或S_IREAD, 00400 許可權,代表該文件所有者具有可讀取的許可權.
S_IWUSR或S_IWRITE, 00200 許可權, 代表該文件所有者具有可寫入的許可權.
S_IXUSR或S_IEXEC, 00100 許可權,代表該文件所有者具有可執行的許可權.
S_IRWXG00070 許可權, 代表該文件用戶組具有可讀、可寫及可執行的許可權.
S_IRGRP00040 許可權, 代表該文件用戶組具有可讀的許可權.
S_IWGRP00020 許可權, 代表該文件用戶組具有可寫入的許可權.
S_IXGRP00010 許可權, 代表該文件用戶組具有可執行的許可權.
S_IRWXO00007 許可權, 代表其他用戶具有可讀、可寫及可執行的許可權.
S_IROTH00004 許可權, 代表其他用戶具有可讀的許可權
S_IWOTH00002 許可權, 代表其他用戶具有可寫入的許可權.
S_IXOTH00001 許可權, 代表其他用戶具有可執行的許可權.
返回值:若所有欲核查的許可權都通過了檢查則返回0 值, 表示成功, 只要有一個許可權被禁止則返回-1.
錯誤代碼:
EEXIST參數pathname 所指的文件已存在, 卻使用了O_CREAT 和O_EXCL旗標.
EACCESS參數pathname 所指的文件不符合所要求測試的許可權.
EROFS 欲測試寫入許可權的文件存在於只讀文件系統內.
EFAULT參數pathname 指針超出可存取內存空間.
EINVAL參數mode 不正確.
ENAMETOOLONG參數 pathname 太長.
ENOTDIR參數pathname 不是目錄.
ENOMEM核心內存不足.
ELOOP 參數pathname 有過多符號連接問題.
EIOI/O 存取錯誤.
附加說明:使用access()作用戶認證方面的判斷要特別小心, 例如在access()後再作open()空文件可能會造成系統安全上的問題.
範例
#includeunistd.h
#includesys/types.h
#includesys/stat.h
#includefcntl.h
main()
{
intfd, size;
chars[] = “Linux Programmer!\n”, buffer[80];
fd =open(“/tmp/temp”, O_WRONLY|O_CREAT);
write(fd, s, sizeof(s));
close(fd);
fd =open(“/tmp/temp”, O_RDONLY);
size= read(fd, buffer, sizeof(buffer));
close(fd);
printf(“%s”, buffer);
}
執行
LinuxProgrammer!
C中read()的用法?
read()函數的原型是int read(int fd,void *buf,int count);。它的功能是「從文件說明符fd相關聯的文件中讀取count個字元,並把這些字元存儲到buf所指的緩衝區中。返回值是操作成功時所讀到的位元組數,在文件結束時可能少於count個位元組;若返回值為-1則說明出錯了,返回0則表示到達文件尾端。例:從文件ABC.txt中讀取前100個位元組存入數組buffer中——
#include “stdin.h”
#include “io.h”
#include “fcnt1.h”
int main(void){
int fd;
char buffer[100];
if((fd=open(“ABC.txt”,O_RDONLY))==-1){
printf(“Can’t open file.\n”);
exit(-1);
}
if(read(fd,buffer,100)!=100)
printf(“Possible read error!\n”);
}
原創文章,作者:JTKIM,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/325332.html