1. 程式人生 > >C語言read和write函式解析

C語言read和write函式解析

在研究一份AES加密程式碼的時候,發現程式碼從command line獲取資料僅僅使用了read函式,很是疑問。從command line獲取資料不是要使用scanf函式嗎?所以,詳細瞭解了C庫的read函式特性。順帶了write函式,他們是couple一對兒!!!
主要參考文章:https://blog.csdn.net/dangzhangjing97/article/details/79619894
感謝原博主

使用read、write函式們需要包含標頭檔案

#include<unistd.h>

read()

用於檔案描述符對應的檔案中讀取資料,原型:

ssize_t read(int fd,void*buf,size_t count)
引數說明:
fd: 是檔案描述符, 從command line獲取資料時,為0
buf: 為讀出資料的緩衝區;
count: 為每次讀取的位元組數(是請求讀取的位元組數,讀上來的資料保
存在緩衝區buf中,同時檔案的當前讀寫位置向後移)

返回值:

成功:返回讀出的位元組數
失敗:返回-1,並設定errno,如果在呼叫read
之前到達檔案末尾,則這次read返回0

write()

用於將資料寫入到檔案描述符對應的檔案,原型:

ssize_t write(int fd,const void*buf,size_t count);
引數說明:
fd:是檔案描述符(輸出到command line,就是1)
buf:通常是一個字串,需要寫入的字串
count:是每次寫入的位元組數

返回值:

成功:返回寫入的位元組數
失敗:返回-1並設定errno
ps: 寫常規檔案時,write的返回值通常等於請求寫的位元組
數count, 而向終端裝置或者網路寫時則不一定

因此,read函式就可以取代scanf從command line讀取資料;write函式就可以代替printf,往command line列印輸出。

示例程式碼

#define MAXLEN  1024
int main(void)
{ 
    int ret;
   // char key[17];
    char *p;

    p = (char*)malloc(MAXLEN
*(sizeof(char*))); //申請一塊記憶體,存放讀取資料 memset(p,0,MAXLEN); printf("請輸入一串字元:\n"); ret = read(0,p,MAXLEN); printf("read 函式就可以直接從command line 讀取資料嗎?試一試read到沒!\n"); printf("下面為定義記憶體資料輸出。。。\n"); for(int i =0; p[i]!='\n';i++) { printf("key[%d] = %c\n",i,p[i]); } printf("試一試write函式~~~\n"); for(int i =0; p[i] != '\n';i++) { ret = write(1,&p[i],1); printf("\n"); printf("寫入資料個數:ret = %d\n",ret); } free(p); }