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);
}