C - Построение моей строки перед написанием
Я довольно новичок в C и реализую функцию, которая записывает разреженную матрицу в файл. Мне интересно, как правильно в C построить строку перед тем, как записать ее в файл.
Я сейчас звоню write()
много, что приводит к плохим результатам. Я должен отформатировать строку и построить ее последовательно внутри цикла. В Java я бы использовал StringBuilder
но я не знаю эквивалент C.
Вот упрощенная версия того, что я хочу сделать
int i;
unsigned int u;
for(i=0 ; someCondition ; i++) {
if(someOtherCondition)
dprintf(fileDescr, "I need to write this unsigned int %u\n", u);
else
write(fileDescr, "0", sizeof(char));
}
Какой правильный C способ сделать это?
2 ответа
В настоящее время я часто вызываю write(), что приводит к снижению производительности.
Вам необходимо выполнить буферизацию, так как системные вызовы дороги по сравнению с "обычными" операциями.
Вы можете просто использовать стандартную библиотеку - получить
FILE *
и позвонитьfwrite
- это автоматически сделает буферизациюВы могли бы к вашей собственной буферизации, добавив в буфер, используя
mempcy
и друзья. Когда буфер заполнится, вы можете просто сделать большойwrite
Я бы сначала попробовал stdio
подойти как проще. Если вам интересно, как получить FILE *
из файлового дескриптора ищите POSIX-стандарт fdopen
,
В основном sprintf()
а также realloc()
,
// all error checks omitted for clarity, you are NOT allowed to do this
size_t allocsz = 0x40;
size_t len = 0;
char *buf = malloc(allocsz); // initial buffer size
for (; someCondition; i++) {
int n = snprintf(
NULL, 0,
"Format %s so that it %s with %u", "this", "works", 1337u
);
if (len + n >= allocsz) {
while (len + n >= allocsz) { // exponential storage expansion
allocsz *= 2;
}
buf = realloc(buf, allocsz);
}
snprintf(
buf + len, n + 1,
"Format %s so that it %s with %u", "this", "works", 1337
);
len += n;
}
write(fd, buf, len);