$ file testfile.txt
testfile.txt: ASCII text
$ cat testfile.txt
aaaabbbbccddef
#include <iostream>
#include <fstream>
#include <string>
#include <cstdint>
typedef uint8_t byte; // <-------- interesting
typedef std::basic_ifstream<byte> FileStreamT;
static const std::string FILENAME = "testfile.txt";
int main(){
FileStreamT file(FILENAME, std::ifstream::in | std::ios::binary);
if(!file.is_open())
std::cout << "COULD NOT OPEN FILE" << std::endl;
else{
FileStreamT::char_type buff;
file.read(&buff,1);
std::cout << (SOMECAST)buff; // <------- interesting
}
std::cout << "done" << std::endl;
}
根据 typedef 中的内容以及将其转换为(或未转换)的内容,它会做各种愚蠢的事情。
它恰好适用于'typedef char'并且没有演员表。(如预期的那样,当转换为 int 时为 97)
uint8_t 和 int8_t 都将打印
没有演员表什么都没有
转换为 char 或 unsigned char 时什么都没有
当转换为 int 或 unsigned 时为 8(尽管 ASCII 'a' 应为 97)
我以某种方式设法打印了一个“�”字符,但忘记了它是哪种情况。
为什么我会得到这些奇怪的结果?
给未来读者的注意事项:
从给出的答案中得出结论:仅使用 char (或标准也提到的宽字符之一)实例化流,否则您不会收到编译器警告和静默失败
标准保证这些东西是非常可悲的