[英]How to read (small) integers from ASCII text files into adequate data arrays in C++
我想从ASCII文本文件(由空格分隔)中加载一堆整数,知道数据范围是先验的(例如0-255)。 我的问题是我无法在右侧为“ unsigned char”类型的输入流中使用“ >>”运算符读取此类数字。 数据文件可能如下所示:
12 42 0 127 255
(只是在这很重要的情况下:最后有一个换行符,但是即使我添加了两个空格,该编辑器似乎也忽略了它。)这是我的示例代码:
#include <cstdint>
#include <fstream>
#include <iostream>
using Datum = uint_least8_t; // Does not work.
// using Datum = unsigned char; // Does not work either (is "usually" the same as above).
// using Datum = char; // Does not work -- as expected. But why does this not store the blanks?
// using Datum = uint_least16_t; // Works.
int main()
{
std::ifstream is( "data.txt", std::ifstream::in ); // not std::ifstream::binary
constexpr std::size_t n = 5;
Datum data[n];
for( std::size_t i = 0; i < n; ++i )
is >> data[i];
for( std::size_t i = 0; i < n; ++i )
std::cout << "\"" << data[i] << "\" ";
std::cout << "\n";
return 0;
}
对于前三个typedef,结果是
"1" "2" "4" "2" "0"
那么谁能告诉我为什么会这样,以及如何解决呢? 我不喜欢将数字临时存储在不必要的大数据类型(甚至只是)中的想法。
unsigned char
是特殊的-标准库正在应用其特殊情况的“解释和转换ASCII字符”算法,因此从文件中读取“ 2”将导致unsigned char
值为50而不是2 。
对于任何实际上只是char
或unsigned char
别名的“类型”,也将是这种情况,例如uint_least8_t
(可能)。
改为读为int
,然后根据需要转换为unsigned char
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.