如何解决在C中对write函数有问题
| 给定我的代码部分:char bmpheader[54] = {0x42,0x4D,0x5A,0x00,0x36,0x28,0x03,0x01,0x18,0x24,0x13,0x0B,0x00};
char bmpimagedata[36] = {0x07,0x07,0xFF,0x66,0x46,0x00};
while (i < 54) {
printf(\"%c\",bmpheader[i]);
write (socket,bmpheader[i],1);
i++;
}
while (j < 36) {
printf(\"%c\",bmpimagedata[j]);
write (socket,bmpimagedata[j],1);
j++;
}
我的编译器出现错误,两个写函数都显示“ 1”。我不太确定该函数的参数本身(第三个参数正确吗?)。
我该如何纠正?
解决方法
标准的“ 2”功能接受一个指向您要写出的内容的指针。您将其传递给
char
(正在提升为int
)。
最小的解决方法是更改此设置:
write (socket,bmpheader[i],1);
至
write (socket,&bmpheader[i],1);
...但是有更好的方法。
您可以让write
自己写出全部54个字节:
write (socket,bmpheader,54);
或者,如果您真的想一次做一次char
,可以使用一个指针:
int i;
char *p;
for (i = 0,p = bmpheader; i < 54; ++i,++p) {
printf(\"%c\",*p);
write (socket,p,1);
}
无论哪种情况,您都希望避免使用魔幻数字number11ѭ并从数据中获取它。由于在标准C中sizeof(char)
始终是一个字节,因此您可以使用sizeof
而不必做难看的sizeof(array) / sizeof(array[0])
事情:
int i;
char *p;
for (i = 0,p = bmpheader; i < sizeof(bmpheader); ++i,1);
}
...但是我敢肯定还有比这更优雅的解决方案。
您也可以使用putchar
(相当轻巧)而不是printf
(相当轻巧):
int i;
char* p;
for (i = 0,++p) {
putchar(*p);
write (socket,1);
}
我曾经用指针算法来做这样的事情,不知道它们在现代世界中是否是不好的做法:
char* p;
char* endp;
for (p = bmpheader,p = bmpheader + sizeof(bmpheader); p < endp; ++p) {
putchar(*p);
write (socket,1);
}
,写入签名为
ssize_t write(int fd,const void *buf,size_t count);
因此,第二个参数应该是指针,并且您传递的是实际值而不是指针。以下应该有帮助
write (socket,bmpheader + i,1);
write (socket,bmpimagedata + j,1);
但是为什么不呢
write (socket,sizeof(bmpheader)/sizeof(*bmpheader));
write (socket,bmpimagedata,sizeof(bmpimagedata)/sizeof(*bmpimagedata));
并检查课程的返回值
,如果您检查写函数的原型,您会看到第二个参数是char *。就您而言,您要给它一个单元格或一个数组,然后是一个字符。
您应该写:
write (socket,&(bmpheader[i]),1);
当然,这远非最有效,您可以直接编写
write (socket,54);
,写(套接字,&bmpimagedata [j],sizeof(bmpimagedata [j]));
第二个参数应该是指针
第三个是要写入的数据大小
,bmpimagedata [j]
是您要使用的整数
&bmpimagedata [j]
,如果您将代码更改为...
write (socket,1);
...它将起作用。但是您不必一次发送一个字节的数据,这就是为什么第三个参数是length的原因。
您是否还考虑过查找write()函数的参考文档以确切了解其工作原理和接受的内容?学习阅读和解释文档可能并不容易,但是从长远来看,它比提问要有益得多,“我不确定第三个参数是什么”
,令人惊讶的是,许多奇怪/令人困惑的建议。
写下这两个数组的规范方法是:
write(socket,sizeof bmpheader);
write(socket,sizeof bmpimagedata);
进行计算以找出涉及单个字符大小或任何内容的元素数量绝对没有意义。只需写入整个数组,每个数组一次,然后完成即可。
另外,当然,要跟踪您是否成功(也许只写了一部分),并加以处理。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。