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);
Другие вопросы по тегам