Как мне написать символы, используя Write () в C? - PullRequest
3 голосов
/ 11 апреля 2011

Я пытаюсь записать файл растрового изображения в браузер на C. Я могу написать такие части ascii для печати, как это,

write (socket, "BM", 2);

, но как мне написать непечатные части с их десятичной дробьюзначение?Я знаю, что если бы я писал в файл, я мог бы использовать что-то вроде этого,

fprintf(fp, "%c%c%c%c" , 40,0,0,0);

Но я не знаю, как сделать то же самое, но вместо этого просто записать это в сокет ... Пожалуйста,помогите мне, спасибо.

Ответы [ 4 ]

4 голосов
/ 11 апреля 2011

Если байты, которые вы хотите записать, являются статическими, вы можете просто определить буфер и использовать его ...

char buffer[]={40,0,0,0};
write(socket, buffer, sizeof(buffer));

или встроенный ...

write(socket, (char[]){40,0,0,0}, 4);

Лучшийподход зависит от того, откуда поступают символы (являются ли они динамическими / они уже находятся в буфере), сколько их, хотите ли вы делать кодирование, откуда берется элемент размера ... и т. д. и т. д.

4 голосов
/ 11 апреля 2011

Вы можете заключить дескриптор файла в структуру FILE (что позволяет использовать все семейство printf), используя fdopen():

int fd = socket(...);
FILE *fp = fdopen(fd, "w+");

Теперь fp такой же, как и любой другой файл *. Ура!

2 голосов
/ 11 апреля 2011

Вы можете использовать sprintf для этого.

char data[4];
sprintf(data, "%c%c%c%c", 40, 0, 0, 0);
write(socket, data, 4);

РЕДАКТИРОВАТЬ:

Если вы используете это много, вы можете написать свою собственную функциюдля форматированной записи в сокет, как это:

void writef(int socket, const char * format, ...) {
    char buffer[1024];
    va_list args;
    va_start(args, format);
    int length = vsprintf(buffer, format, args);
    va_end(args);
    write(socket, buffer, length);
}

, а затем вы можете просто позвонить writef(socket, "%c%c%c%c", 40, 0, 0, 0);

1 голос
/ 11 апреля 2011

Вы можете snprintf значения в буфер символов, а затем write из буфера.

...