0

私はCが初めてで、疎行列をファイルに書き込む関数を実装しています。ファイルに書き込む前に、Cで文字列を作成する正しい方法は何だろうと思っています。

現在、多くの電話をかけwrite()ているため、パフォーマンスが低下しています。文字列をフォーマットし、ループ内で順番に構築する必要があります。Java では a を使用します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の方法は何ですか?

4

2 に答える 2

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 に答える
1

私は現在 write() を頻繁に呼び出しているため、パフォーマンスが低下しています。

システムコールは「通常の」操作に比べてコストがかかるため、バッファリングを行う必要があります。

  • 単純に標準ライブラリを使用することができます - get aFILE *と call fwrite- これは自動的にバッファリングを行います

  • mempcyおよび友人を使用して、バッファに追加することにより、独自のバッファリングを行うことができます。バッファがいっぱいになると、単純に大きなことができますwrite

stdioアプローチが簡単なので、最初に試してみます。ファイル記述子からを取得する方法が知りたい場合はFILE *、POSIX 標準を探してくださいfdopen

于 2013-10-04T17:20:43.823 に答える