0

我对 C 很陌生,并且实现了一个将稀疏矩阵写入文件的函数。我想知道在将字符串写入文件之前,C 中构建字符串的正确方法是什么。

我目前打电话write()很多,结果表现不佳。我必须格式化字符串并在循环内按顺序构建它。在 Java 中我会使用 aStringBuilder但我不知道 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 方法来做到这一点?

4

2 回答 2

1

我目前经常调用 write() 导致性能不佳。

您需要进行缓冲,因为与“正常”操作相比,系统调用成本很高。

  • 您可以简单地使用标准库 - 获取FILE *并调用 fwrite- 这将自动进行缓冲

  • mempcy您可以通过附加到缓冲区、使用和朋友来进行自己的缓冲。当缓冲区填满时,您可以简单地做一个大的write

我会先尝试这种stdio方法,因为它更容易。如果您想知道如何FILE *从文件描述符中获取 a,请查找 POSIX-standard fdopen

于 2013-10-04T17:20:43.823 回答
1

主要是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);
于 2013-10-04T17:24:18.220 回答