NO IMAGE
讀函式read  

ssize_t read(int fd,void *buf,size_t nbyte) 
read函式是負責從fd中讀取內容.成功時,read返回實際所讀的位元組數,如果返回的值是0,表示已經讀到檔案的結束了.
小於0表示出現了錯誤.如果錯誤為EINTR說明讀是由中斷引起的, 如果是ECONNREST表示網路連線出了問題.
寫函式write  

ssize_t write(int fd,const void *buf,size_t nbytes) 

write函式將buf中的nbytes位元組內容寫入檔案描述符fd.成功時返回寫的位元組數.失敗時返回-1. 並設定errno變數. 在網路程式中,當我們向套接字檔案描述符寫時有倆種可能.  

1)write的返回值大於0,表示寫了部分或者是全部的資料.  

2)返回的值小於0,此時出現了錯誤.我們要根據錯誤型別來處理.  如果錯誤為EINTR表示在寫的時候出現了中斷錯誤.  

如果為EPIPE表示網路連線出現了問題(對方已經關閉了連線).

 Linux-read函式 收藏
 

read函式(讀取檔案)

read函式可以讀取檔案。讀取檔案指從某一個已開啟地檔案中,讀取一定數量地字元,然後將這些讀取的字元放入某一個預存的緩衝區內,供以後使用。

使用格式如下:

number = read( …

read函式(讀取檔案)

read函式可以讀取檔案。讀取檔案指從某一個已開啟地檔案中,讀取一定數量地字元,然後將這些讀取的字元放入某一個預存的緩衝區內,供以後使用。

使用格式如下:

number = read(handle, buffer ,n) ;

上述read呼叫函式中,各個引數的定義如下:

handle: 這是一個已經開啟的檔案控制代碼,表示從這個檔案控制代碼所代表的檔案讀取資料。

buffer: 指緩衝區,即讀取的資料會被放到這個緩衝區中去。

n: 表示呼叫一次read操作,應該讀多少數量的字元。

number:表示系統實際所讀取的字元數量。

假設某個檔案的長度是600字元,而n的值是512,則在第1次呼叫讀這個檔案時,系統可以正常地讀取512個字元地內容,並將這些字元數量傳給number變數,因此number的值將變為88。要第2次讀取這個檔案時,因為檔案已經沒有內容可供讀取了,此時系統會返回0給number。另外,如果讀取檔案失敗,系統將返回-1給number。

比如一個有100個位元組的檔案,第一次讀取10個位元組,這時讀取指標在第10個位元組處。再次進行10個位元組的讀操作時,會接著第一次讀的位置接著往後讀。如果還想從開始讀,可使用lseek函式定位。

Code:

#include “lyl.h”

#define BUF 512

main()

{

static char filename[]=”t1.txt” ;

char buffer[BUF] ;

int handle ;

int i ;

int total = 0 ;

handle = open(filename,O_RDONLY) ;

if ( handle == -1 )

{

printf(“[%s] create fail !!!!

“,filename) ;

exit(1) ;

}

else

{

while( (i = read(handle,buffer,BUF) ) > 0 )

total =i ;

}

printf(“The total character in 《%s》 is %d

“,filename,total ) ;

exit(0) ;

}

程式執行結果:

The total character in 《t1.txt》 is 11

$cat t1.txt

1234567890

 

 

【 read系統呼叫】  
   
功能描述:
從檔案讀取資料。
 
用法: 
#include <unistd.h>

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


引數:  
fd: 將要讀取資料的檔案描述詞。
buf:  所讀取到的資料的記憶體緩衝。
count: 需要讀取的資料量。
   
返回說明:  
成功執行時,返回所讀取的資料量。失敗返回-1,errno被設為以下的某個值  
EAGAIN:開啟檔案時設定了O_NONBLOCK標誌,並且當前沒有資料可讀取
EBADF:檔案描述詞無效,或者檔案不可讀
EFAULT:引數buf指向的空間不可訪問
EINTR:資料讀取前,操作被訊號中斷
EINVAL:一個或者多個引數無效
EIO:讀寫出錯
EISDIR:引數fd索引的時目錄


 備註:

從串列埠讀資料,只讀一次,資料沒有讀全。加入while後,則資料讀全了。

total_read_bytes=0;

while(read_bytes=read(fd_485,buffer1,256)>0)

{

memcpy(buffer2 total_read_bytes,buffer1,read_bytes);

total_read_bytes =read_bytes;

}

for(i=0;i<total_read_bytes;i )

printf(“0x%02lx\n”,buffer2[i]);