以文件列表为参数,返回文件内容指针列表
#include <fstream>
#include <vector>
#include <string>
#include <stdexcept>
std::vector<char*> read_binary_files(const std::vector<std::string>& filenames)
{
std::vector<char*> pointers; // 用于存储数据指针的列表
for (const auto& filename : filenames) // 遍历文件名的列表
{
std::ifstream file(filename, std::ios::binary); // 以二进制模式打开文件
if (!file) // 检查文件是否打开成功
{
throw std::runtime_error("Failed to open file: " + filename); // 抛出异常
}
file.seekg(0, std::ios::end); // 将文件指针移动到文件末尾
size_t size = file.tellg(); // 获取文件大小
file.seekg(0, std::ios::beg); // 将文件指针移动到文件开头
char* buffer = new char[size]; // 为文件分配一块动态内存
file.read(buffer, size); // 从文件中读取二进制数据,并存储到动态内存中
pointers.push_back(buffer); // 将指向动态内存的指针追加到列表中
file.close(); // 关闭文件
}
return pointers; // 返回数据指针列表
}
// 在函数外部使用完数据指针列表后,需要释放动态内存,例如:
std::vector<char*> pointers = read_binary_files({"a.txt", "b.txt", "c.txt"});
// do something with pointers
for (auto p : pointers) // 遍历数据指针列表
{
delete[] p; // 释放动态内存
}
以文件名为参数,返回文件大小
long Widget::get_file_size(const char *filename)
{
FILE *fp = fopen(filename, "rb"); // 以二进制模式打开文件
if (fp == NULL) // 如果打开失败,返回 -1
{
return -1;
}
fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾
long size = ftell(fp); // 获取文件指针的当前位置,即文件大小
fclose(fp); // 关闭文件
return size; // 返回文件大小
}
以单个文件名为参数,获取文件大小,且返回文件内容指针
unsigned char* Widget::read_binary_file(const char *path, long *size)
{
FILE *fp = fopen(path, "rb"); // 以二进制模式打开文件
if (fp == NULL) // 如果打开失败,返回NULL
{
return NULL;
}
fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾
*size = ftell(fp); // 获取文件大小,并通过指针参数传出
fseek(fp, 0, SEEK_SET); // 将文件指针移动回文件开头
unsigned char *buffer = (unsigned char *)malloc(*size); // 分配内存空间
if (buffer == NULL) // 如果分配失败,返回NULL
{
fclose(fp);
return NULL;
}
size_t n = fread(buffer, 1, *size, fp); // 从文件中读取所有数据到缓冲区中,返回实际读取的字节数
fclose(fp); // 关闭文件
if (n != *size) // 如果读取失败,返回NULL
{
free(buffer);
return NULL;
}
return buffer; // 返回缓冲区指针
}
版权声明:本文为qq_42815643原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。