Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/40: Рейтинг темы: голосов - 40, средняя оценка - 4.95
79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384

Как получить имя файла для дальнейшей работы с этим файлом?

26.11.2016, 10:02. Показов 8712. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть программа в которой используются функции GetOpenFile() и GetSaveFile() для открытия и сохранения файлов.

Нужно получить из этих функций имена файлов, чтобы потом их (имена файлов/файлы) можно было в дальнейшем использовать в программе в строке 125 и 126 для реализации сжатия файлов. Чтобы имена файлов (или же сам файл) были не прописаны (как это сейчас сделано: "INPUT_TEXT. txt"), а получались в результате выполнения функций openFile() и saveFile().

Как можно это реализовать?

Пробовал многими способами, но никак не получается: то несоответствие типов, то файл не открывает.

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
#define _CRT_SECURE_NO_WARNINGS
 
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <cstdlib>
#include <cstdio>
#include <fstream>
#include <string>
#include <locale>
#include <vector>
 
using namespace std;
 
// Идентификатор копии приложения
HINSTANCE hInst;
 
// Сохранения файла
HFILE saveFilse()
{
    OPENFILENAME ofn;
 
    char szFile[256];
    char szFileTitle[256];
    char szFilter[256] =
        "Text Files\0*.txt;*.doc\0Any Files\0*.*\0";
 
    HFILE hf;
 
    szFile[0] = '\0';
 
    memset(&ofn, 0, sizeof(OPENFILENAME));
 
    // Добавляем флаг OFN_ENABLETEMPLATE, который
    // разрешает использование шаблона
    ofn.Flags = OFN_HIDEREADONLY | OFN_ENABLETEMPLATE;
 
    // Идентификатор модуля, содержащего шаблон
    ofn.hInstance = hInst;
 
    // Имя ресурса, содержащего шаблон
    ofn.lpTemplateName = (LPSTR)"Open";
 
    // Изменяем заголовок диалоговой панели
    ofn.lpstrTitle = (LPSTR)"Выберите выходной файл";
 
    // Заполняем остальные поля
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = NULL;
    ofn.lpstrFilter = szFilter;
    ofn.nFilterIndex = 1;
    ofn.lpstrFile = szFile;
    ofn.nMaxFile = sizeof(szFile);
    ofn.lpstrFileTitle = szFileTitle;
    ofn.nMaxFileTitle = sizeof(szFileTitle);
    ofn.lpstrInitialDir = NULL;
 
    // Выбираем выходной файл
    if (GetSaveFileName(&ofn)) {
 
        // Открываем на запись.
        // При необходимости создаем файл
        hf = _lcreat(ofn.lpstrFile, 0);
        return hf;
    }
    else return 0;
}
 
// Открытие файла
HFILE openFile()
{
    OPENFILENAME ofn;       // common dialog box structure
    char szFile[260];       // buffer for file name
    HWND hwnd;              // owner window
    HFILE hf;              // file handle
 
    // Initialize OPENFILENAME
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);
    //ofn.hwndOwner = hwnd;
    ofn.lpstrFile = szFile;
    // Set lpstrFile[0] to '\0' so that GetOpenFileName does not 
    // use the contents of szFile to initialize itself.
    ofn.lpstrFile[0] = '\0';
    ofn.nMaxFile = sizeof(szFile);
    ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
    ofn.nFilterIndex = 1;
    ofn.lpstrFileTitle = NULL;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = NULL;
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
 
    // Display the Open dialog box. 
 
    /*if (GetOpenFileName(&ofn) == TRUE)
        hf = CreateFile(ofn.lpstrFile,
        GENERIC_READ,
        0,
        (LPSECURITY_ATTRIBUTES)NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        (HANDLE)NULL);*/
 
    if (GetOpenFileName(&ofn)) {
        // Открываем на чтение
        hf = _lopen(ofn.lpstrFile, OF_READ);
        return hf;
    }
    else return 0;
 
    cout << szFile << endl;
}
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0, "");
 
 
 
    openFile();
    saveFilse();
 
    ifstream rle_base_file("INPUT_TEXT.txt");
    ofstream rle_cmp_file("RLE_COMPRESSED_TEXT.txt");
 
    int count = 1;
    char text_symbol;
 
    LARGE_INTEGER timerFrequency, timerStart, timerStop;
    QueryPerformanceFrequency(&timerFrequency); QueryPerformanceCounter(&timerStart);
 
    while (rle_base_file.good())
    {
        rle_base_file.get(text_symbol); //считываем символ
        if (text_symbol != rle_base_file.peek()) // если символ не совпадает со следующим символом в файле
        {
            rle_cmp_file << count << "," << text_symbol << ",";
            count = 0;
        }
        count++;
    }
 
    rle_base_file.close();
    rle_cmp_file.close();
 
    QueryPerformanceCounter(&timerStop);
    double const t_encode(static_cast <double> (timerStop.QuadPart - timerStart.QuadPart) / timerFrequency.QuadPart); // время архивации
 
    ifstream F("RLE_COMPRESSED_TEXT.txt");
    ofstream rle_dcmp_file("RLE_DECOMPRESSED_TEXT.txt");
 
    QueryPerformanceFrequency(&timerFrequency); QueryPerformanceCounter(&timerStart);
 
    char code_text_sym, spac; // кодируемый символ и запятая
    int amount; // количество появлений символа
 
    while (F.peek() != EOF)
    {
        F >> amount >> spac >> code_text_sym >> spac;
        for (int i = 0; i < (amount); i++)
            rle_dcmp_file << code_text_sym;
    }
    F.close(); rle_dcmp_file.close();
 
    QueryPerformanceCounter(&timerStop);
    double const t_decode(static_cast <double> (timerStop.QuadPart - timerStart.QuadPart) / timerFrequency.QuadPart); // время разархивации
 
    FILE* f1 = fopen("INPUT_TEXT.txt", "r");
    fseek(f1, 0, SEEK_END); long int size1 = ftell(f1); fseek(f1, 0, SEEK_SET);
    cout << "Размер начального файла: " << size1 << " байт.\n" << endl; fclose(f1);
 
    cout << "Время архивации: " << t_encode << " миллисекунд." << endl;
 
    FILE* f2 = fopen("RLE_COMPRESSED_TEXT.txt", "r");
    fseek(f2, 0, SEEK_END); long int size2 = ftell(f2); fseek(f2, 0, SEEK_SET);
    cout << "Размер сжатого файла: " << size2 << " байт.\n" << endl; fclose(f2);
 
    cout << "Время разархивации: " << t_decode << " миллисекунд." << endl;
 
    FILE* f3 = fopen("RLE_DECOMPRESSED_TEXT.txt", "r");
    fseek(f3, 0, SEEK_END); long int size3 = ftell(f3); fseek(f3, 0, SEEK_SET);
    cout << "Размер разжатого файла: " << size3 << " байт.\n" << endl; fclose(f3);
 
    long double a2 = size2, a3 = size3, a = (a3 / a2);
    cout << "Коэффициент сжатия: " << a << endl;
    cout << "-------------------------------------------------------------------" << endl;
 
    system("PAUSE");
 
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.11.2016, 10:02
Ответы с готовыми решениями:

Как можно получить данные из файла .dot для дальнейшей работы
Здравствуйте, уважаемые! Помогите пожалуйста! Как можно выцепить данные из файла .dot для дальнейшей работы с ними в программе? Те данные,...

Массив: Приложение по составлению списков товаров для дальнейшей работы с этим списком
Всем добрый день. Недавно начал изучать Vue.js. Фреймворк очень понравился. На данный момент создаю приложение по составлению...

В бинарном файле хранится информация о столах, написать функции для работы с этим файлом
В бинарном файле хранится информация о столах. Каждая запись файла состоит из следующих полей : Название модели : 10 байт; Ширина...

10
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
26.11.2016, 10:17
У тебя древнее консольное приложение. Значит, вводи имена по-древнему.
0
79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384
26.11.2016, 10:29  [ТС]
nmcf, я бы не против. Но, по заданию, нужно использовать GetOpenFile() и GetSaveFile().
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
26.11.2016, 10:41
Лучший ответ Сообщение было отмечено igdev как решение

Решение

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
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0, "");
 
    ifstream rle_base_file;
 
    OPENFILENAME ofn;
    TCHAR szFile[1000];
 
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);
    //ofn.hwndOwner = hwnd;
    ofn.lpstrFile = szFile;
    // Set lpstrFile[0] to '\0' so that GetOpenFileName does not 
    // use the contents of szFile to initialize itself.
    ofn.lpstrFile[0] = L'\0';
    ofn.nMaxFile = sizeof(szFile) / sizeof(TCHAR);
    ofn.lpstrFilter = L"All\0*.*\0Text\0*.TXT\0";
    ofn.nFilterIndex = 1;
    ofn.lpstrFileTitle = NULL;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = NULL;
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
 
    // Display the Open dialog box. 
 
    if (GetOpenFileName(&ofn))
    {
        // Открываем на чтение
        rle_base_file.open(szFile);
    }
        else return 0;
    //...
 
}
1
79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384
26.11.2016, 13:32  [ТС]
nmcf, а можно имя файла, который мы открываем, присвоить какой-то переменной, чтобы потом можно было его использовать вот здесь:
C++
1
2
3
4
5
...................................................................................................
FILE* f1 = fopen("INPUT_TEXT.txt", "r");
    fseek(f1, 0, SEEK_END); long int size1 = ftell(f1); fseek(f1, 0, SEEK_SET);
    cout << "Размер начального файла: " << size1 << " байт.\n" << endl; fclose(f1);
....................................................................................................
Только, чтобы вместо "INPUT_TEXT.txt" была переменная, которая в себе хранила имя этого файла?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
26.11.2016, 13:37
Имя в szFile после вызова, если пользователь не нажал отмену. Используй где хочешь.
У тебя же ifstream в main(), откуда древняя fopen() появилась?
1
79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384
26.11.2016, 19:31  [ТС]
nmcf, вот, уже написал программу, где выбирается файл функциями GetOpenFileName() и GetSaveFileName() и далее над ним выполняется сжатие. Но, теперь не могу реализовать шифрование этого файла методом гаммирования. Нужно сделать следующее: открыть файл, сделать шифрование и затем его сжать.
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
#define _CRT_SECURE_NO_WARNINGS
 
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <cstdlib>
#include <cstdio>
#include <fstream>
#include <string>
#include <locale>
#include <vector>
#include <iomanip>
 
 
using namespace std;
 
const int FIRST_SYMBOL = ' '; // первый символ
const int SYMBOL_NUMBER = 95; // для простоты кодируем только английский алфавит 
 
void GammaCoding(string &input, string &gamma, string &result)
{
    result.clear();
    for (string::iterator i = input.begin(), j = gamma.begin(); i<input.end(); i++, j++)
    {
        if (j == gamma.end()) j = gamma.begin();
        int Ti = *i - FIRST_SYMBOL;
        int Gi = *j - FIRST_SYMBOL;
        result.push_back(FIRST_SYMBOL + (Ti + Gi) % SYMBOL_NUMBER);
    }
}
 
void GammaDecoding(string &input, string &gamma, string &result)
{
    result.clear();
    for (string::iterator i = input.begin(), j = gamma.begin(); i<input.end(); i++, j++)
    {
        if (j == gamma.end()) j = gamma.begin();
        int Ci = *i - FIRST_SYMBOL;
        int Gi = *j - FIRST_SYMBOL;
        result.push_back(FIRST_SYMBOL + (Ci - Gi + SYMBOL_NUMBER) % SYMBOL_NUMBER);
    }
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0, "");
 
 
    ifstream file;
    ofstream file_compr;
    ifstream f1;
    ofstream file_decompr;
 
    OPENFILENAME ofn;
    TCHAR szFile[1000]; // Адрес файла
    double initialFile = 0; // Размер начального файла
    double compressedFile = 0; // Размер сжатого файла
    double decompressedFile = 0; // Размер расжатого файла
    string text;
    string gamma;
    string result;
 
 
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);
    ofn.lpstrFile = szFile;
    ofn.lpstrFile[0] = '\0';
    ofn.nMaxFile = sizeof(szFile) / sizeof(TCHAR);
    ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
    ofn.nFilterIndex = 1;
    ofn.lpstrFileTitle = NULL;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = NULL;
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
 
    // Display the Open dialog box. 
 
    if (GetOpenFileName(&ofn))
    {
        // Открываем на чтение
        file.open(szFile);
    }
    
    // Определяем размер начального файла
    fstream file3(szFile);
        file3.seekg(0, std::ios::end);
        initialFile = file3.tellg();
    file3.close();
 
    
 
    if (GetSaveFileName(&ofn))
    {
        file_compr.open(szFile);
    }
 
    
 
    LARGE_INTEGER timerFrequency, timerStart, timerStop;
    QueryPerformanceFrequency(&timerFrequency); QueryPerformanceCounter(&timerStart);
 
    char sym; //символ, который мы будем считывать
    int kol = 1;// количество повторяющихся символов
 
    while (file.good())
    {
        file.get(sym);//считываем символ
        if (sym != file.peek() || kol == 9) // если символ не совпадает со следующим символом в файле
        {
            file_compr << kol << sym; // записываем результаты в выходной файл
            kol = 0;
        }
        kol++;
    }
 
    QueryPerformanceCounter(&timerStop);
    double const t_encode(static_cast <double> (timerStop.QuadPart - timerStart.QuadPart) / timerFrequency.QuadPart); // время архивации
 
    cout << "Время архивации: " << t_encode << " миллисекунд." << endl;
 
    if (GetOpenFileName(&ofn))
    {
        // Открываем на чтение
        f1.open(szFile);
    }
 
    // Определяем размер сжатого файла
    fstream file1(szFile);
        file1.seekg(0, std::ios::end);
        compressedFile = file1.tellg();
    file1.close();
 
 
    if (GetSaveFileName(&ofn))
    {
        file_decompr.open(szFile);
    }
    
 
    QueryPerformanceFrequency(&timerFrequency); QueryPerformanceCounter(&timerStart);
 
    
    char sym1, sym2; // предыдущий и последующий символы
    const char zero = '0';
    while (f1.peek() != EOF)
    {
        f1.get(sym1);
        f1.get(sym2);
        for (int i = 0; i < sym1 - zero; i++)
            file_decompr << sym2;
    }
 
    f1.close();
    file_decompr.close();
 
    QueryPerformanceCounter(&timerStop);
    double const t_decode(static_cast <double> (timerStop.QuadPart - timerStart.QuadPart) / timerFrequency.QuadPart); // время разархивации
    
    // Определяем размер расжатого файла
    ifstream file2(szFile);
    file2.seekg(0, std::ios::end);
    decompressedFile = file2.tellg();
    file2.close();
 
    cout << "Время разархивации: " << t_decode << " миллисекунд." << endl;
    cout << "Размер начального файла: " << initialFile << " байт." << endl;
    cout << "Размер сжатого файла: " << compressedFile << " байт." << endl;
    cout << "Размер расжатого файла: " << decompressedFile << " байт." << endl;
    cout << "Коэффициент сжатия: " << fixed << setprecision(2) << (decompressedFile / compressedFile) * 100 << "%" << endl;
    
 
 
    
 
    system("PAUSE");
 
    return 0;
}
Пробую передавать содержимое файла в функцию шифрования вот так, но ничего не получается. Как можно сделать шифрование содержимого файла?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cout << "Введите гамму: ";
    cin >> gamma;
 
    while (true)
    {
        file >> text;
        if (!file.eof())
        {
            GammaCoding(text, gamma, result);
            ofstream file(szFile);
                file << result;
        }
        else
            break;
    }
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
26.11.2016, 20:46
И у тебя eof()? Кто вас учит его везде вставлять-то?
Два файл должно быть - из одного считываешь построчно, в другой записываешь.
C++
1
2
3
4
5
6
7
8
    cout << "Введите гамму: ";
    cin >> gamma;
 
    while (getline(file_in, text))
    {
        GammaCoding(text, gamma, result);
        file_out << result << endl;
    }
1
79 / 67 / 28
Регистрация: 22.04.2016
Сообщений: 384
27.11.2016, 12:33  [ТС]
nmcf, а как сделать так, чтобы после открытия файла он гаммировался (шифровался), далее архивировался и потом наоборот разархиваровался, расшифровывался и записывался в файл? Чтобы не создавать еще кучу для шифрования и разшифрования.

Сейчас у меня программа выполняет следующие действия: открывает исходный файл, далее выбирается файл, который будет архивированным исходным файлом. Затем, выбирается(открывается) архивированный исходный файл и выбирается файл, куда будет записано разархивированный исходный файл.

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
#define _CRT_SECURE_NO_WARNINGS
 
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <cstdlib>
#include <cstdio>
#include <fstream>
#include <string>
#include <locale>
#include <vector>
#include <iomanip>
 
 
using namespace std;
 
const int FIRST_SYMBOL = ' '; // первый символ
const int SYMBOL_NUMBER = 95; // для простоты кодируем только английский алфавит 
 
void GammaCoding(string &input, string &gamma, string &result)
{
    result.clear();
    for (string::iterator i = input.begin(), j = gamma.begin(); i<input.end(); i++, j++)
    {
        if (j == gamma.end()) j = gamma.begin();
        int Ti = *i - FIRST_SYMBOL;
        int Gi = *j - FIRST_SYMBOL;
        result.push_back(FIRST_SYMBOL + (Ti + Gi) % SYMBOL_NUMBER);
    }
}
 
void GammaDecoding(string &input, string &gamma, string &result)
{
    result.clear();
    for (string::iterator i = input.begin(), j = gamma.begin(); i<input.end(); i++, j++)
    {
        if (j == gamma.end()) j = gamma.begin();
        int Ci = *i - FIRST_SYMBOL;
        int Gi = *j - FIRST_SYMBOL;
        result.push_back(FIRST_SYMBOL + (Ci - Gi + SYMBOL_NUMBER) % SYMBOL_NUMBER);
    }
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0, "");
 
 
    ifstream file;
    ofstream file_compr;
    ifstream f1;
    ofstream file_decompr;
 
    OPENFILENAME ofn;
    TCHAR szFile[1000]; // Адрес файла
    double initialFile = 0; // Размер начального файла
    double compressedFile = 0; // Размер сжатого файла
    double decompressedFile = 0; // Размер расжатого файла
    string text;
    string gamma;
    string result;
 
 
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);
    ofn.lpstrFile = szFile;
    ofn.lpstrFile[0] = '\0';
    ofn.nMaxFile = sizeof(szFile) / sizeof(TCHAR);
    ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
    ofn.nFilterIndex = 1;
    ofn.lpstrFileTitle = NULL;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = NULL;
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
 
    // Display the Open dialog box. 
 
    if (GetOpenFileName(&ofn))
    {
        // Открываем на чтение
        file.open(szFile);
    }
    
    // Определяем размер начального файла
    fstream file3(szFile);
        file3.seekg(0, std::ios::end);
        initialFile = file3.tellg();
    file3.close();
    
    // Моя попытка сделать шифрование
    cout << "Введите гамму: ";
    cin >> gamma;
 
    while (getline(file, text))
    {
        GammaCoding(text, gamma, result);
        file << result << endl;
    }
 
    if (GetSaveFileName(&ofn))
    {
        file_compr.open(szFile);
    }
 
 
    LARGE_INTEGER timerFrequency, timerStart, timerStop;
    QueryPerformanceFrequency(&timerFrequency); QueryPerformanceCounter(&timerStart);
 
    char sym; //символ, который мы будем считывать
    int kol = 1;// количество повторяющихся символов
 
    while (file.good())
    {
        file.get(sym);//считываем символ
        if (sym != file.peek() || kol == 9) // если символ не совпадает со следующим символом в файле
        {
            file_compr << kol << sym; // записываем результаты в выходной файл
            kol = 0;
        }
        kol++;
    }
 
    QueryPerformanceCounter(&timerStop);
    double const t_encode(static_cast <double> (timerStop.QuadPart - timerStart.QuadPart) / timerFrequency.QuadPart); // время архивации
 
    cout << "Время архивации: " << t_encode << " миллисекунд." << endl;
 
 
    if (GetOpenFileName(&ofn))
    {
        // Открываем на чтение
        f1.open(szFile);
    }
 
    // Определяем размер сжатого файла
    fstream file1(szFile);
        file1.seekg(0, std::ios::end);
        compressedFile = file1.tellg();
    file1.close();
 
 
    if (GetSaveFileName(&ofn))
    {
        file_decompr.open(szFile);
    }
    
 
    QueryPerformanceFrequency(&timerFrequency); QueryPerformanceCounter(&timerStart);
 
    
    char sym1, sym2; // предыдущий и последующий символы
    const char zero = '0';
    while (f1.peek() != EOF)
    {
        f1.get(sym1);
        f1.get(sym2);
        for (int i = 0; i < sym1 - zero; i++)
            file_decompr << sym2;
    }
 
    f1.close();
    file_decompr.close();
 
    QueryPerformanceCounter(&timerStop);
    double const t_decode(static_cast <double> (timerStop.QuadPart - timerStart.QuadPart) / timerFrequency.QuadPart); // время разархивации
    
    // Определяем размер расжатого файла
    ifstream file2(szFile);
    file2.seekg(0, std::ios::end);
    decompressedFile = file2.tellg();
    file2.close();
 
    cout << "Время разархивации: " << t_decode << " миллисекунд." << endl;
    cout << "Размер начального файла: " << initialFile << " байт." << endl;
    cout << "Размер сжатого файла: " << compressedFile << " байт." << endl;
    cout << "Размер расжатого файла: " << decompressedFile << " байт." << endl;
    cout << "Коэффициент сжатия: " << fixed << setprecision(2) << (decompressedFile / compressedFile) * 100 << "%" << endl;
    
 
 
    
 
    system("PAUSE");
 
    return 0;
}
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.11.2016, 13:00
Ещё раз мой пример посмотри. У тебя должно быть 2 файла: из одного считываешь, в другой записываешь зашифрованное. С одним и тем же файлом так не получится, а значит, ввести нужно заранее и имя исходного файла и имя для сохранения.
А если надо ещё и архивировать, то либо третье имя вводи, либо не сохраняй зашифрованное в файл, а держи в памяти: например, в поток stringstream сохраняй, а не в файл, и уже оттуда будешь архивировать и записывать на диск.
1
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
30.11.2016, 23:19
Использовать просто stringstream. При записи туда добавлять символы конца строки. Затем указатель перемещать на начало и оттуда же считывать символы в цикле while.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.11.2016, 23:19
Помогаю со студенческими работами здесь

Распарсить уравнение из файла (строки), для дальнейшей работы с ним
Доброго времени суток, уже битый час пытаюсь найти готовый или реализовать свой метод позволяющий из файла достать формулу, для дальнейшей...

Считать числа из файла в массив для дальнейшей работы с ними
дан файл, в котором записаны данные: X 1 2 35 41 5 63 7 80 нужно считать ЧИСЛА из файла в массив для работы с ними. Никак не...

Том для открытого файла был изменён извне, поэтому работа с этим файлом невозможна
Здравствуйте, в один прекрасный день не смог продолжить работать со своей программой по сколько выскакивает ошибка при запуске .exe-шника в...

Как спланировать обучение для дальнейшей работы в SEO ?
Решил полностью поменять область деятельности и углубиться в изучении и практике поискового маркетинга. В будущем хочу устроиться на работу...

Как вернуть массив обьектов для дальнейшей работы с ним?
#include &lt;iostream&gt; class Ex { public: Ex(char *);//конструктор ~Ex();//деструктор (пока не используется) Ex...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru