在C中遇到write()函数问题

时间:2011-04-14 12:15:48

标签: c pointers

给出我的部分代码:

char bmpheader[54] = {0x42, 0x4D, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x13, 0x0B, 0x00, 0x00, 0x13, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

char bmpimagedata[36] = {0x07, 0x07, 0xFF, 0x07, 0x07, 0x07, 0x07, 0x07, 0xFF, 0xFF, 0x07, 0x07, 0x07, 0x07, 0x07, 0x66, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xFF, 0xFF, 0xFF, 0x46, 0x00, 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++;
}

我的编译器在编写passing argument 2 of 'write' makes pointer from integer without a cast两个写函数时遇到错误。我对函数的参数本身不太确定(第三个参数是否正确?)。

我该如何纠正?

7 个答案:

答案 0 :(得分:3)

标准write函数接受指针到您要写出的内容;你传递的是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);
}

在任何一种情况下,您都希望避免该幻数54并从数据中获取它。由于sizeof(char)always one byte in standard C,您可以使用sizeof而无需执行丑陋的sizeof(array) / sizeof(array[0])事项:

int i;
char *p;
for (i = 0, p = bmpheader; i < sizeof(bmpheader); ++i, ++p) {
    printf("%c", *p);
    write (socket, p, 1);
}

......但我确信有一个更优雅的解决方案。

你也可以使用putchar(相当轻量级)而不是printf(相当重量级):

int i;
char* p;
for (i = 0, p = bmpheader; i < sizeof(bmpheader); ++i, ++p) {
    putchar(*p);
    write (socket, p, 1);
}

我曾经用指针算法做这样的事情,不知道它们在现代世界中是不是很糟糕:

char* p;
char* endp;
for (p = bmpheader, p = bmpheader + sizeof(bmpheader); p < endp; ++p) {
    putchar(*p);
    write (socket, p, 1);
}

答案 1 :(得分:1)

<{3}}的

签名是

ssize_t write(int fd, const void *buf, size_t count);

所以第二个参数应该是一个指针,你传递的是实际值而不是指针。以下内容应该有所帮助

write (socket, bmpheader + i, 1);
write (socket, bmpimagedata + j, 1);

但为什么不这样做

write (socket, bmpheader, sizeof(bmpheader)/sizeof(*bmpheader));
write (socket, bmpimagedata, sizeof(bmpimagedata)/sizeof(*bmpimagedata));

并检查课程的返回值

答案 2 :(得分:0)

如果你检查write function的原型,你会看到第二个参数是char *。在你的情况下,你给它一个单元格或你的数组,然后一个字符。 你应该写:

write (socket, &(bmpheader[i]), 1);

当然,这远不是最有效的,你可以直接写

write (socket, bmpheader, 54);

答案 3 :(得分:0)

写(socket,&amp; bmpimagedata [j],sizeof(bmpimagedata [j])); 第二个参数应该是指针 第三个是要写的数据大小

答案 4 :(得分:0)

bmpimagedata [j]

是您要使用的整数 &安培; bmpimagedata [j]的

答案 5 :(得分:0)

如果您将代码更改为...

write (socket, bmpimagedata + j, 1);

......它会起作用。但是你不必一次发送一个字节的数据,这就是为什么第三个参数是长度的。

您是否考虑过查找write()函数的参考文档,以确切了解它是如何工作的以及它接受的内容?学习阅读和解释文档可能并不容易,但从长远来看比提问更有益,“我不确定第三个参数是什么”

答案 6 :(得分:0)

令人惊讶的是许多奇怪/错综复杂的建议。

写出这两个数组的规范方法是:

write(socket, bmpheader, sizeof bmpheader);
write(socket, bmpimagedata, sizeof bmpimagedata);

进行计算以确定元素的数量,包括单个字符的大小或任何内容,绝对没有意义。只需编写整个数组,每次执行一次,然后完成。

另外,当然,跟踪你是否成功(可能只写了一部分),并处理它。