有关unsigned char,char,BYTE和文件写入的问题

时间:2016-04-11 19:58:08

标签: c++ string file vector

我有一个定义如下的向量:

std::vector<char> contents;

我的目标是将文件读入BYTE数组,这是一个unsigned char的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文件包含清晰的文本。我怎样才能让它正常工作?当我将向量更改为unsigned char而不是现在定义的char时,我在“read it in”步骤中遇到错误,说预期的参数类型是char *而输入的参数是unsigned char *。所以问题如下:

  1. 我正确地写文件了吗?如果没有,那么正确的方法是什么。
  2. 如何将char矢量转换为unsigned char的矢量?
  3. 谢谢。

1 个答案:

答案 0 :(得分:2)

这里有一个范围问题。如果你说BYTE *rgbPlaintext = (BYTE*)&contents[0] ;,你在rgbPlaintext语句后面的花括号内声明了一个名为if的变量。从编译器的角度来看,这与您在程序开头声明的rgbPlaintext不同。只要您为第二个rgbPlaintext分配一个值,就会遇到结束大括号,这只会导致该值被丢弃。

顶部的陈述应为

BYTE *rgbPlaintext;

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

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

没有 BYTE *部分。

这样,您仍然可以在rgbPlaintext声明后的代码中访问if