c++文件操作

  • Post author:
  • Post category:其他


以文件列表为参数,返回文件内容指针列表

#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 版权协议,转载请附上原文出处链接和本声明。