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

猜你喜欢

转载自blog.csdn.net/IOT2017/article/details/84137728