Можно ли использовать для этого буфер stdio?Если сейчас, какие альтернативы (без реализации себя)? - PullRequest
0 голосов
/ 15 ноября 2011

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

Я хотел бы использовать буфер уровня пользователя для файла, используя только дескриптор файла и не используя FILE *.Я знаю, что stdio.h имеет, по крайней мере, 1 пользовательский буфер для всех функций *printf() и *scanf().

Мой вопрос:

Меня попросили сделать систему, которая используетwrite() функция Linux.Эта функция является системным вызовом.Задача здесь состоит в том, чтобы выполнить небольшую дополнительную задачу, которую мне дал профессор:

Использовать или создать буфер уровня пользователя для записи этих файлов.

Поскольку я использую функцию write и использую файловые дескрипторы, я не могу использовать ни одну из функций fprintf(), поскольку задокументировано, что смешивание системных вызовов (write и * fprintf) имеет неопределенный результат.

Есть лиальтернативный способ использовать тот же буфер, что и stdio, или есть ли эквивалентный буфер, предлагаемый библиотеками linux для записи в этот файл?(Примечание: мне также нужно знать, как очистить этот буфер)

У меня нет особых проблем с созданием буфера fifo, но если я смогу сохранить некоторую работу, это будет полезно.

Примечание: мой код для Linux.Если для этого есть переносимый код, расскажите, пожалуйста, о переносимом коде.Если нет переносимого кода, пожалуйста, дайте мне способ Linux.

1 Ответ

0 голосов
/ 15 ноября 2011

Конечно.Вы можете собрать все, что вы хотите в буфере и write() этом буфере.

Попробуйте это:

...
size_t cursize = 100;
char * buf = malloc(cursize);
char * cursor = buf;
char * end = buf + cursize;
int n = snprintf(cursor, end-cursor, "Hello! Here is the number %d.", 12);
// maybe do some checking of n here; ensure that it is below 100
cursor += n; // advance the write cursor
n = sprintf(cursor, end-cursor, " And this is data I would like to add.");
// dito
cursor += n;

// Now we have buffered enough data and can write out our stuff.
write(fd, buf, cursor-buf);
free(buf);

Это даст вам возможность расширить буфер как можно скорее,делать другие вещи.

...