C填充缓冲区并在达到大小时写出

时间:2015-10-16 14:18:57

标签: c buffer

我有一个4Kb缓存缓冲区。我想用512字节的增量填充一些数据,直到它完整,然后对它做一些事情,比如将它传递给另一个函数,并清除它以获得下一批数据。这一切都很好,但我无法写出每一个4Kb。这就是我所拥有的:

uint32_t chunk = 512;
uint32_t cache_size = 4096;
uint32_t chunks_per_cache = 8;
uint8_t cache[4096];

void buff_write(uint8_t *buff, uint8_t count) {

    uint8_t index = 0;
    uint8_t wrote = 0;

    for (index = 0; index < count; ++index) {

        if (index % chunks_per_cache == 0 && index != 0) {
            // operate on cached buffer and clear it
            wrote = 0;
            memset(cache, 0, sizeof(cache));
        }
        printf("buff %d Kb\n", index * chunk);

        // advance buffer
        memcpy(cache + wrote * chunk, buff, chunk);
        buff += chunk;
        wrote++;
    }
}

int main(int argc, char const *argv[])
{
    // init some data
    uint8_t data[cache_size];
    memset(data, '?', 1024);
    memset(data+1024, '-', 1024);
    memset(data+2048, '!', 1024);
    memset(data+3072, '#', 1024);

    // write from data to cache
    buff_write(data, sizeof(data)/chunk);

    printf("leftover cache:\n");
    printf("%s\n", cache);

    return 0;
}

在这里,我希望剩余的数据完全为空。当buff_write完成时,在语句中清除:

if (index % chunks_per_cache == 0 && index != 0)

问题是如何保持迭代和偏移值并使if语句在for循环中执行,如果有8个块,则会像往常一样缓存。如果我增加数据的大小,它将迭代超过8个块没问题。我想我在这里遗漏了一些明显的东西。

1 个答案:

答案 0 :(得分:0)

此代码每8个字节重置cache

uint32_t chunks_per_cache = 8;
    .
    .
    .
        if (index % chunks_per_cache == 0 && index != 0) {
            // operate on cached buffer
            printf("wrote: %s\n", cache);
            wrote = 0;
            memset(cache, 0, sizeof(cache));
        }

该代码无法满足您的需求 - 填写cache