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::cout
、printf
等输出时有特殊处理。
std::cout << "\n\n" << buffer << "\n\n";
请记住,按照惯例,char*
中的 C 字符串应该以 null 结尾,而你的不是,而且你的函数的调用者没有有效的方法来检查它有多长,该信息是丢失,因为像 strlen
这样的函数期望 Cstring 也以空值终止。您应该查看 std::vector<char>
或 std::string
来保存此类数据,因为它们将保存有关大小的信息,并自行清理。
前言:我是一个没有经验的编码员所以它可能是一个明显的错误。同样,所有这些代码都被盗并拼凑在一起,所以我不声明拥有此代码。
系统: 我正在使用 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::cout
、printf
等输出时有特殊处理。
std::cout << "\n\n" << buffer << "\n\n";
请记住,按照惯例,char*
中的 C 字符串应该以 null 结尾,而你的不是,而且你的函数的调用者没有有效的方法来检查它有多长,该信息是丢失,因为像 strlen
这样的函数期望 Cstring 也以空值终止。您应该查看 std::vector<char>
或 std::string
来保存此类数据,因为它们将保存有关大小的信息,并自行清理。