c++ - 读取(int fd,void *buf,size_t count): prevent implicit conversion

标签 c++ linux c++11 pipe

在 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 将无济于事,因为它无论如何都使用动态数组来保存其内容。

关于c++ - 读取(int fd,void *buf,size_t count): prevent implicit conversion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30709424/

相关文章:

c++ - 如何检查可能使用 SFINAE 的类型中是否存在字段?

c++ - C++ 中的非限定查找

c++ - 如何将所有抛出变成中止条件以进行调试?

c++ - 智能指针的意外行为

c++ - 神秘的链接器错误 "undefined reference to ` __gxx_personality_v 0'"在 cygwin 中使用 clang

linux - 如何修复尝试调试简单的 nasm 汇编程序时出现 "sigsegv"的问题

c++ - std::regex_match 在传递右值参数时给出错误的匹配结果

linux - 在linux中搜索文件并跳转到第一个找到的位置

c - 为什么删除FIFO后两个进程仍然可以使用FIFO进行通信?

c++ - 在 vector<vector<T>> 的初始化中合并 vector 和 initializer_list?