将随机数放在缓冲区中以写入文件的有效方法是什么?

时间:2019-06-06 17:49:05

标签: c++ linux

我正在尝试使用基本的Linux系统调用,并通过编写将随机字节写入文件的程序来编写良好的代码。我已经设想了几种不同的方法,但是我很好奇哪种方法更有效。请随时为我的代码提供改进或建议完全不同的方法;我只是想改善。

目前,我正在使用C ++ 11的随机变量uint32_t生成随机的mt19937,并在写入文件之前使用memcpy将它们放置在缓冲区中。这是一种非常有效的方法吗?

我最好用内存集将缓冲区初始化为0并使用or'ing / bit-shifting吗?这样,我就忘记了如何/是否有办法做类似*(buffer + offset) |= (random32 << BUF_SIZE - sizeof(random32) * currIndex)的事情并使C ++放置所有32位而不是单个字符。

//Here's the actual buffer manipulation/write code I currently have
std::mt19937 rand(std::chrono::system_clock::now().time_since_epoch().count());

    for(ssize_t i = 0; i < size; i += BUF_SIZE)
    {
        //Fill the buffer with random uint32_t's (the buffer is a multiple of 32 right now)
        char buffer[BUF_SIZE];
        for(int j = 0; j < BUF_SIZE; j += sizeof(uint32_t))
        {
            uint32_t num = rand();
            std::fprintf(stderr, "DEBUG: generated random number %x\n", num);
            std::memcpy(buffer + j, &num, sizeof(num));
        }

        // Write buffer to file
        ssize_t bytes_left = size - i;
        ssize_t bytes_to_write = BUF_SIZE > bytes_left ? bytes_left : BUF_SIZE;
        std::fprintf(stderr, "DEBUG: writing %zu bytes to buffer\n", bytes_to_write);
        if(write(fd, buffer, bytes_to_write) != bytes_to_write)
        {
            std::fprintf(stderr, "Failed to write at %zu", i);
            exit(EXIT_FAILURE);
        }
    }

1 个答案:

答案 0 :(得分:2)

执行以下操作:

::std::array<char, BUF_SIZE> buffer;
::std::generate(buffer.begin(), buffer.end(), rand);

代替您当前正在使用的循环来填充缓冲区。然后调整程序的其余部分,以使用buffer数组,该数组具有自己的size方法等,而不是像现在这样的裸char数组。

这比您正在做的更多的是C ++方式。尽量减少使用裸指针和数组。尽可能使用标准算法。如果您发现自己编写了for循环,请查看算法库是否已经为您编写了循环。

这也适用于标准库中还没有 的代码。如果发现自己正在编写for循环,请停止。相反,要弄清楚如何将for循环的内容抽象到可重用的函数中,以便您可以编写一次for循环,并在很多情况下使用它。

如果您想了解标准库的工作原理,那么请自己编写这些函数。

不要重复自己是绝对最重要的编程原则之一。拉里·沃尔(Larry Wall)以“懒惰”而著名。了解如何永不重复自己。如果标准库因为您不知道它在做什么而使您感到不舒服,请尝试使用编译器资源管理器查看汇编语言。并尝试自己编写标准库函数。上下左右了解工具也非常重要。所以这项工作值得做。

但是,这就是您应该做的事情,不要重复自己,也不应该反复训练自己。训练自己以正确的方式做。而且,如果您对不知道细节感到不舒服,请写出细节,而不要用错误的方式写出来,这样您就可以看到细节。