Read (int fd, void *buf, size_t count):防止隐式转换

read(int fd, void *buf, size_t count): prevent implicit conversion

本文关键字:count 转换 fd int void size buf Read      更新时间:2023-10-16

在Linux (amd64)上,我从管道中读取相关进程的一些数据。我想确保,读取的字节不会被改变,并防止隐式的类型和值转换。

当我将数据放入char或unsigned char数组(请参阅#ifdef)时,是否会发生任何类型转换与"陷阱值",或者我是否应该更好地使用vector<>从孩子读取的数据?当我使用不同的平台如arm (raspi/beaglebone)时会发生什么?可以在std::back_inserter上进行转换吗?

        #ifdef USE_UCHAR
        using buffer_type = unsigned char;
        #else
        using buffer_type = char;
        #endif
        std::string from_child;
        std::array<buffer_type, PIPE_BUF> buffer;
        ....
        // read from it
        long bytes_read = read(fd, buffer.data(), buffer.size());
        if (bytes_read > 0) {
            std::copy_n(buffer.data(), bytes_read, std::back_inserter(from_child) );
        }
        else if (bytes_read == 0)  {
            // eof
            run = false;
        }
        else {
            perror("read from pipe:");
        }

charunsigned char被要求将每一位都视为值位。此外,它们需要往返,这禁止转换和陷阱值。

std::string,所有的字符串操作方便的功能,其核心只是一个字符的集合。插入和迭代字符永远不会失败,只有字符串操作方便函数实际上假设字符数据表示一个有效的字符串。

如果有任何问题,std::vector不会帮助你,因为它使用一个动态数组来保存它的内容。