cread
在研究一份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);
}
相关阅读
让google.com不自动跳转到google.com.hk的方法
本文转载自:https://www.jianshu.com/p/c00e35ec4c3e如何不让 google.com 跳转到 google.com.hk ? 前言 自从google的服务器搬离
火坑了,火坑了。今天自己把自己坑惨了。由于需要软件支持断电后重启恢复当时运行状态。故想到将恢复运行状态的一些数据存放到本地
Calendar类 Calendar:它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等日历字段之间的转换提供了一些方法,并为操作日
DECIMAL(16,4) 总共能存16位数字,末尾4位是小数(小数点不算在长度内)
荣耀新发布的智能语音4K盒子-荣耀盒子voice,与上一代荣耀盒子、华为盒子和秘盒有什么区别呢?该如何根据自己的需求购买盒子呢?一、接