【发布时间】:2021-03-28 18:31:22
【问题描述】:
我的 C++ 知识非常有限,所以在此先道歉,因为这可能是一个非常简单的问题,但我一直无法找到解决方案。
我有一个正在尝试读取的二进制文件。尝试读取二进制文件的代码如下所示:
string readFile2(const string &fileName)
{
cout << "B1 \n";
ifstream ifs(fileName.c_str(), ios::in | ios::binary | ios::ate);
ifstream::pos_type fileSize = ifs.tellg();
ifs.seekg(0, ios::beg);
vector<char> bytes(fileSize);
ifs.read(bytes.data(), fileSize);
cout << bytes.data();;
cout << "\n";
cout << fileSize;
cout << "\n";
return bytes.data();
// return string(bytes.data(), fileSize);
}
根据cout << fileSize; 的输出,它显示744402 字节,但是当我打印出bytes.data() 时,我只得到前8 个字节LIZM 2.9。我使用 hexdump 工具查看二进制文件,发现第 9 个字节是空字符。前 16 个字节的十六进制转储与相应的 ASCII 如下所示:
4C 49 5A 4D 20 32 2E 39 00 00 21 C4 00 00 00 00 LIZM 2.9 __!____
如您所见,_ 对应于空字符 00。我的问题是如何读取每个字节而不是在空字符处停止?
【问题讨论】:
-
在使用
tellg()获取文件大小之前,您必须先搜索到文件末尾。 -
您确定您没有阅读整个文件吗?我认为你的问题可能不是你想的那样。
-
@Eljay "ate: seek to the end of stream immediately after open" - 没有什么冲突/模棱两可的。
-
@Eljay 另见filebuf::open(): "如果打开操作成功并且
openmode & std::ios_base::ate != 0(设置了ate位),则将文件位置重新定位到文件末尾,如if调用std::fseek(file, 0, SEEK_END),其中file是调用fopen返回的指针。如果重新定位失败,调用close()并返回一个空指针表示失败。"
标签: c++