【问题标题】:How to pass "double" via write() call when it accepts only const void * type argument?当只接受 const void * 类型参数时,如何通过 write() 调用传递“double”?
【发布时间】:2012-09-19 02:28:01
【问题描述】:

鉴于double temp = 6.5;,我如何将其传递给UNIX write() 系统调用:

write(fd[1], (WTF?), 100)

  1. fd[1] 是一个文件描述符。
  2. 100 是一个固定的缓冲区大小,用于处理大量数值,以防万一。

我在中间放什么?我尝试了 itoa&temp*temp(char) temp 和其他一些方法用谷歌搜索不同的解决方案,但到目前为止还没有运气。老实说,我什至不知道 const void * 是什么类型。我只知道如果我将诸如“Hello World”之类的字符串直接传递给第二个参数,它将停止抱怨。

【问题讨论】:

  • 你想writedouble 或其字节的十进制表示吗?在后一种情况下,write(fd[1], &temp, sizeof temp);,在前一种情况下,sprintf 它是一个char str[100]write(fd[1], str, strlen(str));
  • @DanielFischer 我想要一个子进程向我发送 temp 的值,这样我就可以在父进程中进行一些计算。我知道如何从 char 数组到 double,但不是相反。如果我可以通过 write 直接发送 double,那就太好了,否则 char 数组也可以工作,因为我可以在主进程中将其转换回十进制。
  • 然后使用write(fd[1], &temp, sizeof temp); 发送更少的字节并且没有丢失精度的风险。
  • @DanielFischer 谢谢,非常感谢。 sprintf 方法至少有效。我现在试试 &temp 方法。

标签: c linux unix pointers


【解决方案1】:

write 的第二个参数是指向内存中某个位置的指针,第三个参数是您要从内存中的该位置写入文件的字节数。所以你的代码是:

double temp = 6.5;
write(fd[1], &temp, sizeof(temp));

不过,我不确定这是否正是您想要的。需要明确的是,这会将您的double 的二进制表示写入文件。在大多数平台上,这将是以下一系列字节(此处以十六进制表示):

00 00 00 00 00 00 26 64

如果这应该是一个文本文件,那么您需要先将您的数字转换为字符串。

double temp = 6.5;
char buffer[20];
sprintf(buffer, "%g", temp);
write(fd[1], buffer, strlen(buffer));

这会将“6.5”写入您的文件。

【讨论】:

  • 爸爸,我正在使用 pipe() 在父进程和子进程之间进行通信。一旦我通过管道写入 &temp,您是说我将收到 6.5 的二进制表示,对吧(例如,在我的情况下为 0xffffff83)?我怎样才能将它转换回十进制?我已经声明了一个大小为 100 的缓冲区数组,并且我正在使用 read() 函数来接受来自 write() 的传入传输。
  • @TwilightPonyInc.如果您发送字节,则不需要任何转换,只需在管道的另一端double receive; read(fd[0], &receive, sizeof receive);(假设那里是fd[0]),嘿,你的值是double
  • @DanielFischer 谢谢。哇,我现在真的很愚蠢,因为它是多么简单。我想我已经尝试了大约 6 种不同的方法,但不是你上面建议的。就是这样,从下周开始,我将致力于阅读Head First C
  • 我建议使用snprintf(buffer, sizeof(buffer), "%g", temp);
【解决方案2】:

如果您不介意将二进制数据写入文件,请尝试

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

【讨论】:

  • 在相关说明中,我如何从 read() 函数中取消引用它?我创建了一个 char buffer[100] 数组,我将它传递给 read(fd[0], buffer, 100)。
  • 不要将read() 放入char 缓冲区;读入另一个double 与写相同:double temp; read(fd[0], &temp, sizeof temp);
  • 对于写入二进制双精度的第一种方法,您可以使用:read(fd[1], &temp, sizeof(temp)); 对于存储字符串的第二种方法,它会更复杂,因为我们没有使用预定义的大小。 char* buffer[BUFF_SIZE], c; int i = 0; do { read(fd[1], &c, sizeof(c)); buffer[i] = c; ++i; } while (c != '\0');
猜你喜欢
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 2018-01-23
  • 2016-05-20
  • 2010-12-19
相关资源
最近更新 更多