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

时间:2015-06-08 12:39:16

标签: c++ linux c++11 pipe

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

当我将数据放入char或unsigned char Arrays(参见#ifdef)时,是否会发生任何带有“陷阱值”的类型转换,或者我应该更好地使用向量<>从孩子那里读取的数据?当我使用像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:");
        }

1 个答案:

答案 0 :(得分:1)

需要

charunsigned char将每个位视为值位。此外,他们需要往返,这禁止转换和陷阱值。

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

如果有任何问题,std::vector无法帮助您,因为它无论如何都会使用动态数组来保存其内容。