使用C++如何优雅地处理这种解压缩错误?
时间: 2024-10-16 11:09:49 浏览: 8
在C++中,优雅地处理解压缩错误可以采用异常处理和条件语句结合的方式。以下是一个示例,展示如何使用`std::ifstream`和`zlib`库来处理解压缩文件时可能出现的错误:
```cpp
#include <iostream>
#include <fstream>
#include <zlib.h>
// 解压函数
bool decompress(const char* input_path, const char* output_path) {
std::ifstream in(input_path, std::ios::binary);
if (!in) {
throw std::runtime_error("Failed to open input file");
}
in.seekg(0, std::ios::end);
size_t input_size = in.tellg();
in.seekg(0, std::ios::beg);
std::vector<unsigned char> buffer(input_size);
in.read(&buffer[0], input_size);
uLongf bytes_written;
unzFile pkg = unzOpen2(output_path, &bytes_written);
if (pkg == nullptr) {
in.close();
throw std::runtime_error("Failed to create output file or read data from the input file");
}
if (unzGoToFirstEntry(pkg) != UNZ_OK) {
unzClose(pkg);
in.close();
throw std::runtime_error("Invalid zip format or no files inside");
}
while (unzGoToNextEntry(pkg) == UNZ_OK) {
if (unzIsArchiveMemberEnd(pkg)) {
break;
}
if (unzOpenCurrentFile(pkg) != UNZ_OK) {
unzClose(pkg);
in.close();
throw std::runtime_error("Failed to open a file inside the archive");
}
// 解压文件...
// (这里省略具体的解压缩代码)
unzCloseCurrentFile(pkg); // 关闭当前文件
}
unzClose(pkg);
return true; // 成功解压
}
int main() try {
decompress("nonexistent.zip", "output.zip");
} catch (const std::exception& e) {
std::cerr << "Error: " << e.what() << '\n';
return 1;
}
```
在这个例子中,如果在任何阶段发生错误,程序会捕获异常并提供有用的错误信息。
阅读全文