如何通过;“双”字;当它只接受const void*类型参数时,是否通过write()调用?
给定<代码>双温度=6.5代码>如何将其传递到UNIX系统调用:如何通过;“双”字;当它只接受const void*类型参数时,是否通过write()调用?,c,linux,unix,pointers,C,Linux,Unix,Pointers,给定双温度=6.5如何将其传递到UNIX系统调用: write(fd[1],(WTF?),100) fd[1]是一个文件描述符 100是一个固定的缓冲区大小,用于处理大数值,以防万一 我把它放在中间是什么?我尝试了itoa、temp、temp、char、temp等多种方法,通过谷歌搜索找到了不同的解决方案,但目前为止运气不佳。老实说,我甚至不知道什么类型是const void*。我只知道,如果我直接向第二个参数传递一个字符串,如“Hello World”,它将停止抱怨。如果您不介意将二进制数据写
write(fd[1],(WTF?),100)
fd[1]
是一个文件描述符100
是一个固定的缓冲区大小,用于处理大数值,以防万一我把它放在中间是什么?我尝试了itoa、temp、temp、char、temp等多种方法,通过谷歌搜索找到了不同的解决方案,但目前为止运气不佳。老实说,我甚至不知道什么类型是const void*。我只知道,如果我直接向第二个参数传递一个字符串,如“Hello World”,它将停止抱怨。如果您不介意将二进制数据写入文件,请尝试
write(fd[1],&temp,sizeof(temp))代码>
如果确实要将值写入文本文件,则需要首先将其转换为字符串。如果是这种情况,您可以尝试以下方法:
#define BUFF_SIZE 100
double temp = 17.5;
char* str[BUFF_SIZE];
sprintf(str, "%lf", temp);
write(fd[1], str, strlen(str));
如果您不介意将二进制数据写入文件,请尝试
write(fd[1],&temp,sizeof(temp))代码>
如果确实要将值写入文本文件,则需要首先将其转换为字符串。如果是这种情况,您可以尝试以下方法:
#define BUFF_SIZE 100
double temp = 17.5;
char* str[BUFF_SIZE];
sprintf(str, "%lf", temp);
write(fd[1], str, strlen(str));
写入
的第二个参数是指向内存中某个位置的指针,第三个参数是要写入文件的内存中该位置的字节数。所以你的代码应该是:
double temp = 6.5;
write(fd[1], &temp, sizeof(temp));
不过,我不确定这是否正是你想要的。为了清楚起见,这将把您的double
的二进制表示形式写入文件。在大多数平台上,这将是以下字节序列(此处以十六进制表示):
这会将“6.5”写入文件。写入
的第二个参数是指向内存中某个位置的指针,第三个参数是要写入文件的内存中该位置的字节数。所以你的代码应该是:
double temp = 6.5;
write(fd[1], &temp, sizeof(temp));
不过,我不确定这是否正是你想要的。为了清楚起见,这将把您的double
的二进制表示形式写入文件。在大多数平台上,这将是以下字节序列(此处以十六进制表示):
这会将“6.5”写入您的文件。是否要
写入双精度
或其字节的十进制表示形式?在后一种情况下,write(fd[1],&temp,sizeof temp)
,在前者中,sprintf
将其转换为charstr[100]
和写入(fd[1],str,strlen(str))
@danielfisher我想要一个子进程将temp的值发送给我,这样我就可以在父进程中进行一些计算。我知道如何从char数组转换为double,但不是相反。如果我可以通过write直接发送double,很好,否则char数组也可以工作,因为我可以在主进程中将其转换回十进制
发送更少字节且不会丢失精度。@Danielfisher谢谢,非常感谢。sprintf方法至少可以工作。现在我将尝试&temp方法。是否要写入双精度的十进制表示形式或其字节?在后一种情况下,write(fd[1],&temp,sizeof temp)
,在前者中,sprintf
将其转换为charstr[100]
和写入(fd[1],str,strlen(str))
@danielfisher我想要一个子进程将temp的值发送给我,这样我就可以在父进程中进行一些计算。我知道如何从char数组转换为double,但不是相反。如果我可以通过write直接发送double,很好,否则char数组也可以工作,因为我可以在主进程中将其转换回十进制
发送更少字节且不会丢失精度。@Danielfisher谢谢,非常感谢。sprintf方法至少可以工作。现在我将尝试使用&temp方法。请注意,如何从read()函数中取消对该方法的引用?我已经创建了一个char buffer[100]数组,我将其传递到read(fd[0],buffer,100)中;读入另一个double
与写入相同:double temp;读取(fd[0],&temp,温度大小)
对于写入二进制双精度的第一个方法,您可以使用:read(fd[1],&temp,sizeof(temp))
对于存储字符串的第二个方法,它将更加复杂,因为我们没有使用预定义的大小<代码>字符*缓冲区[BUFF_SIZE],c;int i=0;do{read(fd[1],&c,sizeof(c));buffer[i]=c;++i;}而(c!='\0')
在相关注释中,我如何从read()函数中取消引用它?我已经创建了一个char buffer[100]数组,我将其传递到read(fd[0],buffer,100)中;读入另一个double
与写入相同:double temp;读取(fd[0],&temp,温度大小)
对于写入二进制双精度的第一个方法,您可以使用:read(fd[1],&temp,sizeof(temp))
对于存储字符串的第二个方法,它将更加复杂,因为我们没有使用预定义的大小<代码>字符*缓冲区[BUFF_SIZE],c;int i=0;do{read(fd[1],&c,sizeof(c));buffer[i]=c;++i;}而(c!='\0')代码>P爸爸,我正在使用pipe()在父进程和子进程之间进行通信。一旦我通过管道写入&temp,您是说我将收到6.5的二进制表示,对吗(例如,在我的例子中是0xFFFF83)?我怎样才能把它转换回十进制呢?我声明了一个大小为100的缓冲区数组,并使用read()函数接受write()传入的传输。@twillightponyinc。你不需要任何转换,如果你