我试图读取二进制文件的数据,遗憾的是,在C++中打开这些数据与python有很大不同,因为它们具有字节模式.似乎C++没有那个.
for (auto p = directory_iterator(path); p != directory_iterator(); p++) {
if (!is_directory(p->path()))
byte tmpdata;
std::ifstream tmpreader;
tmpreader.open(desfile, std::ios_base::binary);
int currentByte = tmpreader.get();
while (currentByte >= 0)
{
//std::cout << "Does this get Called?" << std::endl;
int currentByte = tmpreader.get();
tmpdata = currentByte;
}
tmpreader.close()
}
else
{
continue;
}
Run Code Online (Sandbox Code Playgroud)
我基本上希望克隆Python在'rb'模式下打开文件的方法.要拥有所有内容的实际字节数据(因为它具有非打印字符,即使对于C++也是不可读的.大多数可能不能转换为有符号字符,因为它包含我需要在我的DLL中提供的zlib压缩数据解压缩所有.
我知道在Python中我可以这样做:
file_object = open('[file here]', 'rb')
Run Code Online (Sandbox Code Playgroud)
事实证明,用这个替换上面的C++代码会有所帮助.然而fopen,折旧但我不在乎.
上面的代码没有做的是工作,因为我没有读取缓冲区数据.我后来说明白fopen,fseek,fread,和fclose是我需要读取的字节模式("RB")的功能.
for (auto p = directory_iterator(path); p != directory_iterator(); p++) {
if (!is_directory(p->path()))
{
std::string desfile = p->path().filename().string();
byte tmpdata;
unsigned char* data2;
FILE *fp = fopen("data.d", "rb");
fseek(fp, 0, SEEK_END); // GO TO END OF FILE
size_t size = ftell(fp);
fseek(fp, 0, SEEK_SET); // GO BACK TO START
data2 = new unsigned char[size];
tmpdata = fread(data2, 1, size, fp);
fclose(fp);
}
else
{
continue;
}
Run Code Online (Sandbox Code Playgroud)
int currentByte = tmpreader.get();
while (currentByte >= 0)
{
//std::cout << "Does this get Called?" << std::endl;
int currentByte = tmpreader.get();
//^ here!
Run Code Online (Sandbox Code Playgroud)
您正在声明隐藏外部变量的第二个变量.但是,这个内部的只在while循环体内有效,所以while条件检查不再修改的外部变量.而是这样做:
int currentByte;
while ((currentByte = tmpreader.get()) >= 0)
{
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
363 次 |
| 最近记录: |