c++ fstream::read 只返回第一个字符

c++ fstream::read only returning 1st char

前言:我是一个没有经验的编码员所以它可能是一个明显的错误。同样,所有这些代码都被盗并拼凑在一起,所以我不声明拥有此代码。

系统: 我正在使用 windows 10 64 位。我在 Notepad++ 中编写代码并使用 MinGW G++ 进行编译。

我正在尝试做的事情:我正在尝试将整个文件(BMP 格式)读入一个变量,return 一个指向该变量的指针作为函数的 return。

发生了什么:变量只存储文件的第一个字符。

char* raw_data(std::string filename){
//100% non-stolen
    std::ifstream is (filename, std::ifstream::binary);
    if (is) {
        // get length of file:
        is.seekg (0, is.end);
        int length = is.tellg();
        is.seekg (0, is.beg);
        std::cout << is.tellg() << "\n"; 
        
        char * buffer = new char [length];
        std::cout << "Reading " << length << " characters... \n";
        // read data as a block:
        is.read (buffer,length);
        std::cout << "\n\n" << *buffer << "\n\n";
    
        if (is)
            {std::cout << "all characters read successfully.";}
        else
            {std::cout << "error: only " << is.gcount() << " could be read";}
        is.close();
        // ...buffer contains the entire file...
//101% non-stolen
        return {buffer};
    }
    return {};
}

调用函数的代码为

char * image_data = new char [image_size];
        image_data = raw_data("Bitmap.bmp");

这可以很好地编译并且 EXE 输出

0
Reading 2665949 characters...


B

all characters read successfully.

文件Bitmap.bmp开始:

BM¶ƒ     6   (   €  ‰        €ƒ Δ  Δ          ¨δό¨δό¨δό¨

如您所见,变量 buffer 仅存储 Bitmap.bmp 的第一个字符(如果我更改第一个char它也会改变)

如有任何帮助,我们将不胜感激。 谢谢你的时间。

std::cout << "\n\n" << *buffer << "\n\n";

Buffer 是一个 char*,所以通过取消引用它你会得到一个 char,在你的例子中是 B。如果你想输出你读取的整个数据就不要取消引用指针,在 C/C++ char* 中,在使用 std::coutprintf 等输出时有特殊处理。

std::cout << "\n\n" << buffer << "\n\n";

请记住,按照惯例,char* 中的 C 字符串应该以 null 结尾,而你的不是,而且你的函数的调用者没有有效的方法来检查它有多长,该信息是丢失,因为像 strlen 这样的函数期望 Cstring 也以空值终止。您应该查看 std::vector<char>std::string 来保存此类数据,因为它们将保存有关大小的信息,并自行清理。