Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Прозрачный
0 / 0 / 0
Регистрация: 18.04.2013
Сообщений: 66
#1

разделения файла на части - C++

15.08.2013, 20:36. Просмотров 583. Ответов 3
Метки нет (Все метки)

Нужно написать программу для разделения файла на части.
Вы указываете вашей программе файл, который нужно разделить, количество частей, на который нужно разделить файл, и ваша программа из одного файла делает несколько (по сути, разбавит файл на части).
Подобная функция есть в архиваторе WinRAR (составной архив).
Также должна быть предусмотрена обратная операция, чтобы из нескольких частей ранее разделённого вашей программой файла, собрать один файл.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.08.2013, 20:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос разделения файла на части (C++):

Редактирование части файла - C++
Всем привет! Вопрос в следующем. Я сейчас пытаюсь изменить часть текстового файла. Начало изменяемой области помечено маркером...

Разбивка текстового файла на части - C++
Добрый день. Подскажите пожалуйста как можно реализовать следующий алгоритм: Имеется текстовый файл, в этом файле есть блоки информации...

Разделение текстового файла на части - C++
имеется текстовый файл(ANSI) *.txt очень огромный для латиницы, нужно разделить на файлы типа *.map хотя можно и *.txt поочередно с 1 и...

Чтение части строки из файла - C++
Приветствую. Прошу помощи в реализации кода: имеется текстовый файл, в котором весь текст написан в одну строку и другой файл, где текст...

Считывание части строк из файла в кодировке CP866 - C++
Доброго времени суток! Пытаюсь считать из текстового файла в кодировке CP866 текст длинной например в 64 символа с начала каждой строки,...

Поменять части матрицы(из файла) местами с использованием функции - C++
Дана задача: Даны: n - переменная величина а(2n*2n) - матрица, разбитая на 4 равных части размером n*n ...

3
Wolkodav
605 / 458 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
15.08.2013, 20:39 #2
Прозрачный, а файл какого типа?
0
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,080
Записей в блоге: 10
Завершенные тесты: 1
15.08.2013, 21:13 #3
Прозрачный, а файл должен состоять из байт?
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.08.2013, 10:56 #4
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>
#include <cstdlib>
 
using namespace std;
 
streamoff f_size(ifstream &fin); // размер файла в байтах
int input_namber_parts(const streamoff &size_file); // ввод количества частей
bool create_parts(); // деление файла на части
bool file_create(); // создание файла из частей
 
int main ()
{
    char ch;
    do 
    {
        cout << "\nCreate a parts of file (1)\n";
        cout << "Create a file of parts (2)\n";
        cout << "Exit (3)\n";
 
        (cin >> ch).get();
        switch (ch)
        {
            case '1' : 
                if (!create_parts())
                {
                    system ("pause");
                    return 0;
                }
                cout << "\nSuccessful!\n" << endl;
                break;
 
            case '2' :
                if (!file_create())
                {
                    system ("pause");
                    return 0;
                }
                cout << "\nSuccessful!\n" << endl;
                break;
        }
    
    } while ((ch != '3'));
    
    system ("pause");
    return 0;
}
 
streamoff f_size(ifstream &fin) // размер файла в байтах
{
    fin.seekg(0, ios::end);
    streamoff size_file = fin.tellg();
    fin.seekg(0);
    return size_file;
}
 
int input_namber_parts(const streamoff &size_file) // ввод количества частей
{
    cout << "Enter the number of parts: ";
    int namber_parts = 0;
    while (!(cin >> namber_parts) || cin.peek() != '\n' || namber_parts <= 1 || namber_parts > size_file)
    {
        cin.clear();
        while (cin.get() != '\n');
        cout << "\nError! Retry input\n";
        cout << "\nEnter the number of parts: " << endl;
    }
    cin.get();
    return namber_parts;
}
 
bool create_parts() // деление файла на части
{
    string file_name;
    cout << "Enter a file name: ";
    getline(cin, file_name);
    
    ifstream fin(file_name, ios::binary);
    if (!fin) 
    {
        cout << "\nError opening the file for reading!\n" << endl;
        return false;
    }
    
    streamoff size_file = f_size(fin);
    
    cout << "\nFile size " << size_file << " bytes\n" << endl;
    
    if (!size_file || (size_file == 1))
    {
        cout << "The file is not divided into parts!\n" << endl;
        return false;
    }
    
    int namber_parts = input_namber_parts(size_file);
    
    streamoff size_part = size_file / namber_parts; // размер части
    streamoff tail = size_file % namber_parts;      // остаток
    streamoff size_first_part = size_part + tail;   // размер первой части
    
    char *buffer = new char[size_first_part];
    
    stringstream s;
    ofstream fout;
    for (int i = 0; i < namber_parts; ++i)
    {
        if (i == 0) fin.read(buffer, size_first_part);
        else fin.read(buffer, size_part);
            
        streamoff size_read = fin.gcount();
        
        s << i + 1;
        string name_part = "part" + s.str() + "_" + file_name;
        s.str("");
            
        fout.open(name_part, ios::binary);
        fout.write(buffer, size_read);
        fout.close();
                
        cout << "file " << name_part << " = " << size_read << " bytes" <<  endl;
        
    }
    delete [] buffer;
    fin.close();
    
    return true;
}
 
bool file_create() // создание файла из частей
{
    string name_part;
    vector <string> v_name_part;
    ifstream fin;
    char ch = 'y';
    
    while (ch == 'y')
    {
        cout << "Enter the name of the part: ";
        getline(cin, name_part);
        
        fin.open(name_part, ios::binary);
        
        if (!fin.is_open()) 
            cout << "\nError opening the file for reading!\n" << endl;
        else if (!f_size(fin)) 
             cout << "\nFile is empty!\n" << endl;
             else
             {
                 v_name_part.push_back(name_part);
                 fin.close();
             }
        
        cout << "Continue? (y/n): ";
        (cin >> ch).get();
    }
    
    int namber_parts = v_name_part.size();
    if (namber_parts == 0)
    {
        cout << "\nThe names of the parts have not entered!\n";
        return false;
    }
    
    cout << "\nEnter a new file name: ";
    string file_name;
    getline(cin, file_name);
 
    ofstream fout(file_name, ios::binary);
    
    streamoff size_part = 0;
    streamoff size_file = 0;
    for (int i = 0; i < namber_parts; ++i)
    {
        fin.open(v_name_part[i], ios::binary);
        
        size_part = f_size(fin);
        char *buffer = new char[size_part];
        
        fin.read(buffer, size_part);
        fout.write(buffer, size_part);
        
        delete [] buffer;
        fin.close();
        size_file += size_part;
        
        cout << "File "  << v_name_part[i] << " = "  
             << size_part  << " bytes\n";
    }
    fout.close();
    
    cout << "\nCreate the file " << file_name << " = " 
         << size_file << " bytes\n";
    
    return true;
}
2
16.08.2013, 10:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.08.2013, 10:56
Привет! Вот еще темы с ответами:

Ввести адрес файла и разобрать его на части(строчки с++) - C++
Помогите,пожалуйста,решить следующую задачу. Ввести адресс файла и разобрать его на части розделённые знаком &quot;/&quot;. Каждую часть вывести в...

Принцип разделения ввода/вывода - C++
Используя принцип разделения ввода/вывода от основной части программы, реализовать следующее: Даны натуральные числа n и и целые числа...

Как поделить консоль на 2 части: в верхней части вывод, в нижней - замена - C++
Ребята, есть 2 функции, одна выводит, вторая меняет, нужно поделить консоль параллельно. В верхней части вывод, в нижней замена. Как это...

Матрица делится на две части главной диагональю. Найти суммы элементов каждой части - C++
Всем здрасьте. В общем смог найти сумму выше главной диагонали, а вот с суммой ниже главной диагонали не получается. Помогите пожалуйста,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru