خواندن تک تک فایل ها از فایل ادغام شده - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

خواندن تک تک فایل ها از فایل ادغام شده

0 امتیاز
سلام خدمت دوستان

برای اینکه چندین فایل را ادغام کنم در یک فایل و بعدش بتونم بعدش فایل ادغام شده را بدم به برنامه بتونه همه فایل های ادغام شده را به صورت مجزا با fopen باز کنه چه راهی پیشنهاد میدید؟
سوال شده خرداد 2, 1399  بوسیله ی COLD (امتیاز 200)   4 28 37
دوباره تگ گذاری شد خرداد 2, 1399

1 پاسخ

0 امتیاز

سلام؛ می‌تونید یک Meta data‌ برای فایلتون در نظر بگیرید و اوّل فایل آدرس تمامی اون فایل‌هایی که ادغام شدند با طولشون رو بنویسید و بعد وقتی که خواستید دوباره اون فایل‌ها رو باز کنید بیاید اوّل اون Meta data رو بخونید و بعد فایل‌ها رو باز کنید.

 

یک مثال خیلی ساده:

#include <filesystem>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>

using std_file_path = std::filesystem::path;
using vec_path = std::vector<std_file_path>;

void append_data_to_file(const std_file_path& source, std::ofstream& f_dest)
{
    std::ifstream f_source{source};

    for (std::string line; std::getline(f_source, line);)
    {
        f_dest << line << '\n';
    }
}

void write_meta_data_to_file(const std_file_path& file, std::ofstream& f_dest)
{
    const auto file_name{std::filesystem::absolute(file)};

    f_dest << file_name.string() << std::endl;
}

void write_all_in_one(const vec_path& file_path, const std_file_path& path)
{
    std::ofstream out_file{path};

    std::for_each(file_path.begin(), file_path.end(), [&](const auto i) {
        write_meta_data_to_file(i, out_file);
    });
    out_file << "-----------E-META-DATA-------------\n";

    std::for_each(file_path.begin(), file_path.end(), [&](const auto i) {
        append_data_to_file(i, out_file);
    });
}

void read_all_again(const std_file_path& p)
{
    using namespace std::filesystem;

    const auto out_path{current_path().string() + "/build"};
    if (!exists(out_path))
    {
        create_directory(out_path);
    }

    vec_path data;
    std::ifstream file{p};

    std::string path_name;
    while (file >> path_name)
    {
        data.push_back(path_name);
    }

    std::for_each(data.begin(), data.end(), [&](const auto i) {
        if (exists(i.string()))
        {
            std::clog << "---------------------------------------" << std::endl;
            std::clog << "file: " << i.string() << " exists." << std::endl;

            std::clog << "copy: " << i << " to " << out_path << " ." << std::endl;
            copy(i, out_path);
        }
    });
}

vec_path create_random_files()
{
    vec_path data;

    if (!std::filesystem::exists("./files"))
    {
        std::filesystem::create_directory("./files");
    }

    for (auto i{0}; i < 5; ++i)
    {
        std::string path{"./files/f" + std::to_string(i)};
        std::ofstream file(path);

        file << "ghasem" << std::to_string(std::hash<std::string>{}(path)) << " " << std::to_string(i);
        file << std::endl;

        data.push_back(path);
    }

    return data;
}

int main()
{
    vec_path data{create_random_files()};
    write_all_in_one(data, "out.text");
    read_all_again("out.text");
}

 

پاسخ داده شده خرداد 2, 1399 بوسیله ی mg_ramezani (امتیاز 727)   1 1 12
ویرایش شده خرداد 3, 1399 بوسیله ی mg_ramezani
ممنون از پاسخ تون .فرض کنید من فایل ها را مرج کردم به همان روش متا دیتا بعدش بخوام بخونم با fopen چطوری انجامش بدم میشه یه مثال بزنید؟
خواهش می‌کنم؛ پاسخ رو ویرایش کردم و یک مثال اضافه کردم امیدوارم منظور خودم رو رسونده باشم.
...