在 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:");
}
最佳答案
char
和 unsigned char
需要将每一位都视为值位。此外,它们需要往返,这会禁止转换和陷阱值。
和 std::string
,就其所有的字符串操作便利功能而言,其核心只是一个字符集合。插入和迭代字符永远不会失败,只有字符串操作便利函数实际上假设字符数据表示有效字符串。
如果有任何问题,std::vector
将无济于事,因为它无论如何都使用动态数组来保存其内容。
关于c++ - 读取(int fd,void *buf,size_t count): prevent implicit conversion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30709424/