关于未签名的char、char、BYTE和文件写入的问题

Questions about unsigned char, char, BYTE, and file writing

本文关键字:char 问题 文件 于未签 BYTE      更新时间:2023-10-16

我有一个向量定义如下:

std::vector<char> contents;

我的目标是将文件读取到BYTE数组中,BYTE是未签名字符的typedef。我的尝试如下:

BYTE rgbPlaintext[] = {0x00};
std::ifstream in;
std::vector<char> contents;
in.open("test.dat", std::ios::in | std::ios::binary);
if (in.is_open())
{
    // get the starting position
    std::streampos start = in.tellg();
    // go to the end
    in.seekg(0, std::ios::end);
    // get the ending position
    std::streampos end = in.tellg();
    // go back to the start
    in.seekg(0, std::ios::beg);
    // create a vector to hold the data that
    // is resized to the total size of the file    
    contents.resize(static_cast<size_t>(end - start));
    // read it in
    in.read(&contents[0], contents.size());
    BYTE *rgbPlaintext =  (BYTE*)&contents[0] ;
}

但是,当我使用以下内容将rgbPlainText写入文件时:

std::ofstream f("testOut.dat",std::ios::out | std::ios::binary);
for(std::vector<char>::const_iterator i = contents.begin(); i != contents.end(); ++i) 
{
    f << *rgbPlaintext;
}

这只是一排空位。test.dat文件包含易读的文本。如何使其正确工作?当我将向量更改为无符号char,而不是现在定义的仅为char时,我在"读入"步骤中出现错误,称预期的参数类型为char*,而输入的参数为无符号char*。因此问题如下:

  1. 我对文件的写入是否正确?如果没有,正确的方法是什么
  2. 如何将char的向量转换为无符号char的向量

谢谢。

这里有一个作用域问题。在说BYTE *rgbPlaintext = (BYTE*)&contents[0] ;的地方,在if语句后面的大括号内声明了一个名为rgbPlaintext的变量。从编译器的角度来看,这与您在程序开始时声明的rgbPlaintext不同。一旦将值分配给第二个rgbPlaintext,就会遇到右大括号,这只会导致该值被丢弃。

顶部的语句应该是

BYTE *rgbPlaintext;

并且结束大括号之前的最后一个语句应该是

rgbPlaintext =  (BYTE*)&contents[0] ;

没有BYTE *部分。

这样,您仍然可以访问if语句后面的代码中的rgbPlaintext