Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 26.03.2018
Сообщений: 216

Запись в файл цветов окна

10.11.2018, 06:01. Показов 1193. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
case FSTREAM: {//потоки
        ofstream f(L"lab3_text.ini");
        if (f)
            f << info.high << endl << info.wide << endl << info.x << endl << info.y << endl << info.color << endl << info.rcolor << endl << info.gcolor << endl << info.bcolor;
        f.close();
    } break;
помогите, пожалуйста. мне нужно в файл вывести высоту, ширину, координаты х и у, цвет в 16тиричном коде, и в формате RGB
когда делаю через потоки все работаетВызвано исключение: нарушение доступа для записи.
**_Left** было 0xCDABCCCC., произошло
когда делаю через маппинг/переменные/функции винапи перебрасывает в файл iosfwd с ошибкой:Вызвано исключение: нарушение доступа для записи.
_Left было 0xCDABCCCC.
вот код через маппинг и переменные:
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
case MAPPING: {
        HANDLE f = CreateFile("lab3_text.ini", GENERIC_WRITE | GENERIC_READ,
            0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);//функция создает или окрывает каталог
        // имя файла                
        // режим доступа
        // совместный доступ
        // SD (дескр. защиты)
        // как действовать
        // атрибуты файла
        // дескр.шаблона файла
        const char* buff;//это изменяемый указатель на символ неизменяемый
        string buf = to_string((long long)info.high) + "\r\n" + to_string((long long)info.wide) + "\r\n"
            + to_string((long long)info.x) + "\r\n" + to_string((long long)info.y) + "\r\n" + to_string((long long)info.color)
            + "\r\n" + to_string((long long)info.rcolor)+ "\r\n" + to_string((long long)info.gcolor)+ "\r\n" + to_string((long long)info.bcolor);//r-в начало строки
        buff = buf.c_str(); //преобразуем к строке
        int size = buf.size();//размер строки
        HANDLE fmapping = CreateFileMapping(f, NULL, PAGE_READWRITE, 0, size, "otobrazhenie"); //создание маппинг файла
                                                                                               //создает или открывает именованный или безымянный объект отображенного в памяти (проецируемого) файла для заданного файла.
                                                                                               // дескриптор файла
                                                                                               // защита //доступ к операциям чтения-записи страниц переданной области.
                                                                                               // атрибуты защиты
                                                                                               // старший разряд 64-битного значения размера выделяемого объема памяти для совместного доступа
                                                                                               // младший разряд 64-битного значения размера выделяемого объема памяти для совместного доступа
                                                                                               // имя объекта(из ф создается проецируемый файл отображение)
        if (fmapping != NULL)
        {
            char * adress = (char*)MapViewOfFile(fmapping, FILE_MAP_WRITE, 0, 0, 0);
            //отображает представление проецируемого файла в адресное пространство вызывающего процесса
            // дескр. объекта проецируемый файл
            // режим доступа
            // старшее DWORD смещения
            // младшее DWORD смещения
            // число отображаемых байтов
            if (adress != NULL)
            {
                for (int i = 0; i < size; i++)
                    adress[i] = buff[i];//запись
            }
            UnmapViewOfFile(adress);
            //отменяет отображение  представления файла из адресного пространства вызывающего процесса.
        }
        CloseHandle(f); // закрывает дескриптор открытого объекта.
        CloseHandle(fmapping);
    } break;
 
    case FILE_: {//файловые переменные
        FILE *f;
        if (fopen_s(&f, "lab3_text.ini", "w") == NULL)//открывает пустой файл для записи,Если файл существует, его содержимое удаляется.
        {
            const char* buff;//это изменяемый указатель на символ неизменяемый
            string buf = to_string((long long)info.high) + "\r\n" + to_string((long long)info.wide) + "\r\n" + to_string((long long)info.x) + "\r\n" 
                + to_string((long long)info.y) + "\r\n" + to_string((long long)info.color)+ "\r\n" + to_string((long long)info.rcolor) + "\r\n" + to_string((long long)info.gcolor)
                + "\r\n" + to_string((long long)info.bcolor);
            buff = buf.c_str(); //преобразуем к строке
            fwrite(buff, sizeof(char), buf.size(), f);//Указатель на массив элементов, которые необходимо записать в файл. 
//Размер в байтах каждого элемента массива.
//Количество элементов, каждый из которых занимает sizeof(char) байт.
//Указатель на объект типа FILE, который связан с потоком вывода.
            //буфер - это указатель на область памяти, которая получает данные из файла.
            //В случае fwrite() буфер - это указатель на информацию, записываемую в файл.
            //Длина каждого элемента в байтах определяется в число_байт.
            //Аргумент объем определяет, сколько элементов(каждый длиной число_байт) будет прочитано или записано.
            //f - это файловый указатель на ранее открытый поток.
            fclose(f);
        }
    } break;
структура:
C++
1
2
3
4
5
6
7
8
9
10
11
struct data1
{
    int high;//высота
    int wide;//ширина
    int x;
    int y;//координаты
    COLORREF color;//цвет, хранит в шестнадцатеричной
    int rcolor;
    int gcolor;
    int bcolor;
};
что я не так делаю?

Добавлено через 4 часа 28 минут
ПОЖАЛУЙСТА

Добавлено через 1 час 11 минут
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
//функция записи в файл всеми методами
void file_write(method m, data1 info)
{
    int rcolor = GetRValue(info.color);//цвета
    int gcolor = GetGValue(info.color);
    int bcolor = GetBValue(info.color);
    switch (m)
    {
    case MAPPING: {
        HANDLE f = CreateFile("lab3_text.ini", GENERIC_WRITE | GENERIC_READ,
            0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);//функция создает или окрывает каталог
        // имя файла                
        // режим доступа
        // совместный доступ
        // SD (дескр. защиты)
        // как действовать
        // атрибуты файла
        // дескр.шаблона файла
        const char* buff;//это изменяемый указатель на символ неизменяемый
        string buf = to_string((long long)info.high) + "\r\n" + to_string((long long)info.wide) + "\r\n"
            + to_string((long long)info.x) + "\r\n" + to_string((long long)info.y) + "\r\n" + to_string((long long)info.color) + "\r\n" + to_string((long long)rcolor)
            + "\r\n" + to_string((long long)gcolor) + "\r\n" + to_string((long long)bcolor);//r-в начало строки
        buff = buf.c_str(); //преобразуем к строке
        int size = buf.size();//размер строки
        HANDLE fmapping = CreateFileMapping(f, NULL, PAGE_READWRITE, 0, size, "otobrazhenie"); //создание маппинг файла
                                                                                               //создает или открывает именованный или безымянный объект отображенного в памяти (проецируемого) файла для заданного файла.
                                                                                               // дескриптор файла
                                                                                               // защита //доступ к операциям чтения-записи страниц переданной области.
                                                                                               // атрибуты защиты
                                                                                               // старший разряд 64-битного значения размера выделяемого объема памяти для совместного доступа
                                                                                               // младший разряд 64-битного значения размера выделяемого объема памяти для совместного доступа
                                                                                               // имя объекта(из ф создается проецируемый файл отображение)
        if (fmapping != NULL)
        {
            char * adress = (char*)MapViewOfFile(fmapping, FILE_MAP_WRITE, 0, 0, 0);
            //отображает представление проецируемого файла в адресное пространство вызывающего процесса
            // дескр. объекта проецируемый файл
            // режим доступа
            // старшее DWORD смещения
            // младшее DWORD смещения
            // число отображаемых байтов
            if (adress != NULL)
            {
                for (int i = 0; i < size; i++)
                    adress[i] = buff[i];//запись
            }
            UnmapViewOfFile(adress);
            //отменяет отображение  представления файла из адресного пространства вызывающего процесса.
        }
        CloseHandle(f); // закрывает дескриптор открытого объекта.
        CloseHandle(fmapping);
    } break;
///еще два метода
case FSTREAM: {//потоки
        ofstream f(L"lab3_text.ini");
        if (f)
            f << info.high << endl << info.wide << endl << info.x << endl << info.y << endl << info.color << endl << rcolor << endl << gcolor << endl << bcolor;
        f.close();
    } break;}
data1 file_read(method m)
{
    data1 info = { 240, 320, 100, 100, RGB(0,0,255) };//инициализируем поля по умолчанию 
    int rcolor = GetRValue(info.color);//цвета
    int gcolor = GetGValue(info.color);
    int bcolor = GetBValue(info.color);
    switch (m)
    {
    case MAPPING: {
        HANDLE f = CreateFile("lab3_text.ini", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);//создает или открывает
        int fsize = GetFileSize(f, nullptr);//размер файла//дескриптор и нулевой указатель
        char *buff = new char[fsize];//буффер-массив размера файла
        HANDLE fmapping = CreateFileMapping(f, NULL, PAGE_READONLY, 0, fsize, "otobrazhenie"); //создание маппинг файла
        if (fmapping != NULL)
        {
            char * adress = (char*)MapViewOfFile(fmapping, FILE_MAP_READ, 0, 0, 0);
            if (adress != NULL)
            {
                for (int i = 0; i < fsize; i++)
                    buff[i] = adress[i];
            }
            UnmapViewOfFile(adress);
        }
        string arr[5];//нужно 5 данных
        for (int i = 0, j = 0; i < fsize; i++)//цикл для записи данных
        {
            if (buff[i] == '\n')//как только перенос приюавляем j, иначе побайтово записываем в массив данные
                j++;
            else
                arr[j] += buff[i];
        }
        info.high = stoi(arr[0]);
        info.wide = stoi(arr[1]);
        info.x = stoi(arr[2]);//Преобразует последовательность символов в целое число.
        info.y = stoi(arr[3]);
        info.color = stoi(arr[4]);
         rcolor = GetRValue(info.color);//цвета
         gcolor = GetGValue(info.color);
         bcolor = GetBValue(info.color);
        delete[] buff;
        CloseHandle(f);
        CloseHandle(fmapping);
    } break;
//еще два метода
case FSTREAM: {//чтение с помощью потока
        ifstream f(L"lab3_text.ini");
        rcolor = GetRValue(info.color);//цвета
        gcolor = GetGValue(info.color);
        bcolor = GetBValue(info.color);
        if (f)
            f >> info.high >> info.wide >> info.x >> info.y >> info.color>>rcolor>>gcolor>>bcolor;
        f.close();
    } break;}
помогите, пожалуйста, как сделать, чтобы работало для всех?
переписал так, теперь выводит в формате rgb , но только для потока

Добавлено через 14 минут
Помогите кто-нибудь, пожалуйста

Добавлено через 1 час 21 минуту
Пожалуйста

Добавлено через 8 часов 18 минут
Неужели никто не знает?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.11.2018, 06:01
Ответы с готовыми решениями:

Запись строки в массив, сортировка, удаление и запись в файл
Нужна помощь. Из edit box к нам приходят строки мы их фильтруем. нужно строки записать в массив, отсортировать по последним двум...

Запись изображения окна в BMP файл
нет определение функцыи DDBToDIB() и WriteDIB(), где найти. Зарание благодарен

Фокус и запись имени окна в текстовый файл
Есть ли событие типа &quot;смена фокуса&quot; и как записать имя окна которое в фокусе в текстовый файл(не могу понять как переделать переменную в...

16
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,113
10.11.2018, 11:28
Научитесь пользоваться отладчиком. Когда программа падает, она не только выдаёт окошко с ошибкой, но и сообщает о строках кода, где произошла ошибка. Сложно что-то диагностировать по обрывкам кода. Было бы гораздо проще, если бы вы скопировали сюда весь код своей программы, который можно скомпилировать и запустить.
0
0 / 0 / 0
Регистрация: 26.03.2018
Сообщений: 216
10.11.2018, 17:11  [ТС]
Ygg, когда запускаю программу с параметром 1(чтение /запись маппингом) программа вылетает на строчке, где создаётся файл(Handle ...), ошибка выше

Добавлено через 8 минут
Не создаётся файл, а запись в файл. Не правильно написал
0
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,113
10.11.2018, 17:13
Сложно что-то диагностировать по обрывкам кода. Было бы гораздо проще, если бы вы скопировали сюда весь код своей программы, который можно скомпилировать и запустить.
0
0 / 0 / 0
Регистрация: 26.03.2018
Сообщений: 216
10.11.2018, 17:22  [ТС]
Ygg,
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
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
#include <windows.h> 
#include <fstream>
#include <ctime>
#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;
 
 
 
//структура с данными
struct data1
{
    int high;
    int wide;
    int x;
    int y;
    COLORREF color;
};
 
enum method { MAPPING, FILE_, FSTREAM, NATIVE };
 
const int CTRL_Q = 0;
const int SHIFT_C = 1;
 
void keydown(HWND, WPARAM);
void hotkey(HWND, WPARAM);
void change_colors(HWND, int, int, int);
void special_color(HWND, UINT, UINT);
void file_write(method, data1);
data1 file_read(method);
 
data1 save_res(HWND hWnd)
{
    data1 save;
    RECT sizeWIN; //переменная в которой будут сохарняться размеры окна
    GetWindowRect(hWnd, &sizeWIN); //считывает свойства окна и записывает в объект, который создан выше
    save.high = sizeWIN.bottom - sizeWIN.top;
    save.wide = sizeWIN.right - sizeWIN.left;
    save.x = sizeWIN.left;
    save.y = sizeWIN.top;
    HDC hdc = GetDC(hWnd); //извлекает дескриптор контекста устройства (DC) для клиентской области указанного окна или для всего экрана. можно использовать возвращенный дескриптор в последующих функциях GDI для рисования в DC. Контекст устройства представляет собой непрозрачную структуру данных, значения которой используются внутри GDI.
    save.color = GetPixel(hdc, 0, 0);//возвращает цвет пиксела, находящегося в точке с координатами х,у
    ReleaseDC(hWnd, hdc); //освобождает контекст устройства  (DC)  для использования другими приложениями.
                          //cout << save.high << endl << save.wide << endl << save.x << endl << save.y << endl << save.color << endl;
    return save;
}
 
LRESULT CALLBACK myWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
 
    switch (uMsg)
    {
    case WM_CLOSE:
        PostQuitMessage(0);
        return 0;
    case WM_LBUTTONDOWN://работа с цветом
    {
        POINT mouse;// координаты мышки 
        GetCursorPos(&mouse);//позиция курсора в экранных координатах 
        RECT Size;//координаты углов для построения прямоугольника
        GetWindowRect(hWnd, &Size);//размеры рамки ограничивающей прямоугольник определяемого окна 
 
        int Width = Size.right - Size.left; //Ширина окошка 
        int Height = Size.bottom - Size.top;//Высота окошка  
 
        if (mouse.x - Size.left < (Width / 2) && mouse.y - Size.top < (Height / 2))
        { //изменить цвет фона класса 
            HBRUSH RedBrush = CreateSolidBrush(RGB(255, 0, 0)); //Создаём кисть и присваиваем ей красный цвет
            DeleteObject((HBRUSH)SetClassLong(hWnd, GCL_HBRBACKGROUND, (LONG)RedBrush));//Установливаем 32 разрядное значение дескриптор кисти фона, которая ассоциируется с классом
 
            InvalidateRect(hWnd, NULL, TRUE); //Указываем прямоугольник для перерисовки окна
            UpdateWindow(hWnd);//обновляем рабочую область заданного окна
 
        }
        if (mouse.x - Size.left >(Width / 2) && mouse.y - Size.top < (Height / 2))
        {
            HBRUSH YellowBrush = CreateSolidBrush(RGB(255, 255, 0));
            DeleteObject((HBRUSH)SetClassLong(hWnd, GCL_HBRBACKGROUND, (LONG)YellowBrush));
 
            InvalidateRect(hWnd, NULL, TRUE);
            UpdateWindow(hWnd);
        }
        if (mouse.x - Size.left <(Width / 2) && mouse.y - Size.top >(Height / 2))
        {
            HBRUSH GreanBrush = CreateSolidBrush(RGB(0, 255, 0));
            DeleteObject((HBRUSH)SetClassLong(hWnd, GCL_HBRBACKGROUND, (LONG)GreanBrush));
 
            InvalidateRect(hWnd, NULL, TRUE);
            UpdateWindow(hWnd);
        }
        if (mouse.x - Size.left > (Width / 2) && mouse.y - Size.top > (Height / 2))
        {
            HBRUSH BlueBrush = CreateSolidBrush(RGB(0, 0, 255));
            DeleteObject((HBRUSH)SetClassLong(hWnd, GCL_HBRBACKGROUND, (LONG)BlueBrush));
 
            InvalidateRect(hWnd, NULL, TRUE);
            UpdateWindow(hWnd);
        }
    }
    break;
 
 
 
    case WM_KEYDOWN: //работа на клавиатуре 
    {
 
        if (GetKeyState(VK_CONTROL) < 0 && LOWORD(wParam) == 0x51) PostQuitMessage(0);//выход по CTRL+Q 
        if (wParam == 27) PostQuitMessage(0);//выход по esc
        if (GetKeyState(VK_SHIFT) < 0 && LOWORD(wParam) == 0x43)//нажата shift и С, вызываем блокнот 
 
        {
            // Создаем пустую информацию о запуске процесса.
            STARTUPINFO sInfo;
            ZeroMemory(&sInfo, sizeof(STARTUPINFO));
            // Резервная память для информации процесса.
            PROCESS_INFORMATION pInfo;
            // Создаем процесс.
            CreateProcess("C:\\Windows\\Notepad.exe",
                NULL, NULL, NULL, FALSE, NULL, NULL, NULL, &sInfo, &pInfo);
            return 0;
        }
        if (wParam == 13)//нажат enter 
        {
            HBRUSH Brush = CreateSolidBrush(RGB(rand() % 256, rand() % 256, rand() % 256));
            DeleteObject((HBRUSH)SetClassLong(hWnd, GCL_HBRBACKGROUND, (LONG)Brush)); //случайный 
            InvalidateRect(hWnd, 0, true);
            UpdateWindow(hWnd);
        }
 
    }
    return 0;
    }
 
    return DefWindowProc(hWnd, uMsg, wParam, lParam);//вызываем оконную процедуру по умолчанию
}
 
//функция записи в файл всеми методами
void file_write(method m, data1 info)
{
    switch (m)
    {
    case MAPPING: {
        HANDLE f = CreateFile("C:\\Users\\1\\source\\repos\\Project9\\Project9\\lab3_text.ini", GENERIC_WRITE | GENERIC_READ,
            0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
        // имя файла                
        // режим доступа
        // совместный доступ
        // SD (дескр. защиты)
        // как действовать
        // атрибуты файла
        // дескр.шаблона файла
        const char* buff;
        string buf = to_string(info.high) + "\r\n" + to_string(info.wide) + "\r\n"
            + to_string(info.x) + "\r\n" + to_string(info.y) + "\r\n" + to_string(info.color);
        buff = buf.c_str(); //преобразуем к строке
        int size = buf.size();
        HANDLE fmapping = CreateFileMapping(f, NULL, PAGE_READWRITE, 0, size, "otobrazhenie"); //создание маппинг файла
                                                                                               //создает или открывает именованный или безымянный объект отображенного в памяти (проецируемого) файла для заданного файла.
                                                                                               // дескриптор файла
                                                                                               // защита 
                                                                                               // атрибуты защиты
                                                                                               // старший разряд 64-битного значения размера выделяемого объема памяти для совместного доступа
                                                                                               // младший разряд 64-битного значения размера выделяемого объема памяти для совместного доступа
                                                                                               // имя объекта
        if (fmapping != NULL)
        {
            char * adress = (char*)MapViewOfFile(fmapping, FILE_MAP_WRITE, 0, 0, 0);
            //отображает представление проецируемого файла в адресное пространство вызывающего процесса
            // дескр. объекта проецируемый файл
            // режим доступа
            // старшее DWORD смещения
            // младшее DWORD смещения
            // число отображаемых байтов
            if (adress != NULL)
            {
                for (int i = 0; i < size; i++)
                    adress[i] = buff[i];
            }
            UnmapViewOfFile(adress);
            //отменяет отображение  представления файла из адресного пространства вызывающего процесса.
        }
        CloseHandle(f); // закрывает дескриптор открытого объекта.
        CloseHandle(fmapping);
    } break;
 
    case FILE_: {
        FILE *f;
        if (fopen_s(&f, "C:\\Users\\1\\source\\repos\\Project9\\Project9\\lab3_text.ini", "w") == NULL)
        {
            const char* buff;
            string buf = to_string(info.high) + "\r\n" + to_string(info.wide) + "\r\n" + to_string(info.x) + "\r\n" + to_string(info.y) + "\r\n" + to_string(info.color);
            buff = buf.c_str(); //преобразуем к строке
            fwrite(buff, sizeof(char), buf.size(), f);
            //буфер - это указатель на область памяти, которая получает данные из файла.
            //В случае fwrite() буфер - это указатель на информацию, записываемую в файл.
            //Длина каждого элемента в байтах определяется в число_байт.
            //Аргумент объем определяет, сколько элементов(каждый длиной число_байт) будет прочитано или записано.
            //f - это файловый указатель на ранее открытый поток.
            fclose(f);
        }
    } break;
 
    case FSTREAM: {
        ofstream f("C:\\Users\\1\\source\\repos\\Project9\\Project9\\lab3_text.ini");
        if (f)
            f << info.high << endl << info.wide << endl << info.x << endl << info.y << endl << info.color;
        f.close();
    } break;
 
    case NATIVE: {
        HANDLE f = CreateFile("C:\\Users\\1\\source\\repos\\Project9\\Project9\\lab3_text.ini", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
        const char* buff;
        string buf = to_string(info.high) + "\r\n" + to_string(info.wide) + "\r\n" + to_string(info.x) + "\r\n" + to_string(info.y) + "\r\n" + to_string(info.color);
        buff = buf.c_str(); //преобразуем к строке
        WriteFile(f, buff, buf.size(), NULL, NULL);
        // дескриптор файла
        // буфер данных
        // число байтов для записи
        // число записанных байтов
        // асинхронный буфер
        CloseHandle(f);
    } break;
    }
}
 
 
 
//функция чтения из файла
data1 file_read(method m)
{
    data1 info{ 240, 320, 100, 100, RGB(0,0,255) };//инициализируем поля по умолчанию 
    switch (m)
    {
    case MAPPING: {
        HANDLE f = CreateFile("C:\\Users\\1\\source\\repos\\Project9\\Project9\\lab3_text.ini", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        int fsize = GetFileSize(f, nullptr);
        char *buff = new char[fsize];
        HANDLE fmapping = CreateFileMapping(f, NULL, PAGE_READONLY, 0, fsize, "otobrazhenie"); //создание маппинг файла
        if (fmapping != NULL)
        {
            char * adress = (char*)MapViewOfFile(fmapping, FILE_MAP_READ, 0, 0, 0);
            if (adress != NULL)
            {
                for (int i = 0; i < fsize; i++)
                    buff[i] = adress[i];
            }
            UnmapViewOfFile(adress);
        }
        string arr[5];
        for (int i = 0, j = 0; i < fsize; i++)
        {
            if (buff[i] == '\n')
                j++;
            else
                arr[j] += buff[i];
        }
        info.high = stoi(arr[0]);
        info.wide = stoi(arr[1]);
        info.x = stoi(arr[2]);
        info.y = stoi(arr[3]);
        info.color = stoi(arr[4]);
 
        delete[] buff;
        CloseHandle(f);
        CloseHandle(fmapping);
    } break;
 
    case FILE_: {
        FILE *f;
        if (fopen_s(&f, "C:\\Users\\1\\source\\repos\\Project9\\Project9\\lab3_text.ini", "r") == NULL)
        {
            fseek(f, 0, SEEK_END);//указатель в конце
            int el_num = ftell(f); //смотрим количество эелементов //мысленно делим на sizeof(char) = 1
            fseek(f, 0, SEEK_SET); //указатель в начало
            char *buff = new char[el_num];
            string arr[5];
            fread(buff, sizeof(char), el_num, f);
            for (int i = 0, j = 0; i < el_num; i++)
            {
                if (buff[i] == '\n')
                    j++;
                else
                    arr[j] += buff[i];
            }
            info.high = stoi(arr[0]);
            info.wide = stoi(arr[1]);
            info.x = stoi(arr[2]);
            info.y = stoi(arr[3]);
            info.color = stoi(arr[4]);
 
            delete[] buff;
            fclose(f);
        } break;
    }
 
    case FSTREAM: {
        ifstream f("C:\\Users\\1\\source\\repos\\Project9\\Project9\\lab3_text.ini");
        if (f)
            f >> info.high >> info.wide >> info.x >> info.y >> info.color;
        f.close();
    } break;
 
    case NATIVE: {
        HANDLE f = CreateFile("C:\\Users\\1\\source\\repos\\Project9\\Project9\\lab3_text.ini", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        if (f != INVALID_HANDLE_VALUE)
        {
            DWORD bytes;
            int fsize = GetFileSize(f, nullptr);
            char *buff = new char[fsize];
            ReadFile(f, buff, fsize, NULL, NULL);
            string arr[5];
            for (int i = 0, j = 0; i < fsize; i++)
            {
                if (buff[i] == '\n')
                    j++;
                else
                    arr[j] += buff[i];
            }
            info.high = stoi(arr[0]);
            info.wide = stoi(arr[1]);
            info.x = stoi(arr[2]);
            info.y = stoi(arr[3]);
            info.color = stoi(arr[4]);
            delete[] buff;
        }
        CloseHandle(f);
    } break;
    }
    return info;
}
 
int main(int argc, char **argv)
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    cout << "Открыть файл при помощи:" << endl;
    cout << " 1-отображения файлов на память" << endl;
    cout << " 2-файловых переменных" << endl;
    cout << " 3-потоков ввода-вывода" << endl;
    cout << " 4-файловых функций WinAPI/NativeAPI" << endl;
    data1 info;
if(argc>2){
    switch (stoi(argv[1]))
    {
    case 1: info = file_read(MAPPING); break;
    case 2: info = file_read(FILE_); break;
    case 3: info = file_read(FSTREAM); break;
    case 4: info = file_read(NATIVE); break;
    }
}
 
    // Получаем обработчик модуля, который будет связан с окном.
    // В этом случае это будет обработчик исполняемого файла текущего процесса.
    HINSTANCE hInstance = GetModuleHandle(NULL);
 
    HBRUSH BBrush = CreateSolidBrush(info.color);//Создаём кисточку и присваиваем ей синий цвет
 
                                                      // Создаём класс окна.
    WNDCLASS winClass;
    winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
    winClass.lpfnWndProc = (WNDPROC)myWndProc;
    winClass.cbClsExtra = 0;
    winClass.cbWndExtra = 0;
    winClass.hInstance = hInstance;
    winClass.hIcon = LoadIcon(NULL, IDI_WINLOGO);
    winClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    winClass.hbrBackground = BBrush;
    winClass.lpszMenuName = NULL;
    winClass.lpszClassName = "MyWindowClass";
 
    // Регистрируем класс в системе.
    RegisterClass(&winClass);
 
    // Создаёт окно.
    HWND hWnd = CreateWindow("MyWindowclass", "Window by raw API",
        WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
        info.x, info.y, info.wide, info.high,
        NULL, NULL, hInstance, NULL);
 
    // Показываем окно.
    ShowWindow(hWnd, SW_SHOW);
 
    // Циклируем, пока окно не закрыто.
    MSG message;
    
    RegisterHotKey(hWnd, CTRL_Q, MOD_CONTROL | MOD_NOREPEAT, 'Q');
    RegisterHotKey(hWnd, SHIFT_C, MOD_SHIFT | MOD_NOREPEAT, 'C');
 
    srand(time(NULL));
 
    while (true)
    {
        if (PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
        {
            if (message.message == WM_QUIT) //если тип сообщения будет QUIT, то это значит, что его хотят закрыть
                break;
            else
            {
                TranslateMessage(&message);
                DispatchMessage(&message);
            }
        }
    }
 
    info = save_res(hWnd);
if(argc>2){
    switch (stoi(argv[1]))
    {
    case 1: file_write(MAPPING, info); break;
    case 2: file_write(FILE_, info); break;
    case 3: file_write(FSTREAM, info); break;
    case 4: file_write(NATIVE, info); break;
    }
}
    // Удаляем окно.
    DestroyWindow(hWnd);
 
    // Удаляем класс окна.
    UnregisterClass("MyWindowclass", hInstance);
 
    // Удаляем кисть.
    DeleteObject(BBrush);
 
    return 0;
}
Написан в 17
Но здесь нет извлечения из шестнадцатеричной записи цвета в формат RGB.
Пробовал писать, как описывал выше и при помощи включения в структуру и без неё, так и так работает только с потоками, на остальных способах падает
0
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,113
10.11.2018, 18:55
К сожалению , все способы записи/чтения реализованные вами у меня работают и не падают. Так что не понимаю, чем могу помочь. Изменил пару строк без чего у меня на 12 студии не запускалось, это первый аргумент в CreateWindow на winClass.lpszClassName и инициализацию "info{...}" заменил на "info = {...}".
0
0 / 0 / 0
Регистрация: 26.03.2018
Сообщений: 216
10.11.2018, 19:51  [ТС]
Ygg, тот код, который я скинул последний у меня тоже работает. Там в файл выводится:
Высота
Ширина
Х
У
Цвет в шестнадцатеричном виде
А мне надо, что бы было так:
Высота
Ширина
Х
У
Цвет в шестнадцатеричный
R
G
B
В общем, надо, чтобы из шестнадцатеричной формы цвета был извлечён цвет в формате RGB и записан в файл
0
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,113
10.11.2018, 20:01
Посмотрите блог Evg Форматная печать в Си и Си++
А именно часть "2.3. Печать целочисленных величин в других системах счисления"
0
0 / 0 / 0
Регистрация: 26.03.2018
Сообщений: 216
10.11.2018, 20:16  [ТС]
Ygg, что у меня не так с величинами? Я цвет получаю при помощи
C++
1
int rcolor=GetRValue(info.color), int gcolor=GetGValue(info.color), int bcolor=GetBValue(info.color)
Добавлено через 2 минуты
У меня же нет отрицательных цветов

Добавлено через 5 минут
Причём при помощи такого извлечения цвета способ через потоки работает, а остальные нет
0
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,113
10.11.2018, 21:21
to_string((long long)info.color)
Во первых, это не хекс. Во вторых, тут происходит преобразование беззнакового типа в зноковый. При значащем старшем бите появляются минусы. Так что вы хотите сделать, я не понимаю.
Есть цвет - COLORREF. Это беззнаковая 32х битная переменная.
Пусть цвет равен RGB(20,30,40)
Значение можно представить разными способами:
1) десятичный общий: 2629140
2) шестнадцатеричный общий: 0x00281E14
3) десятичный по компонентам: 20, 30 и 40
4) шестнадцатеричный по компонентам: 0x14, 0x1E и 0x28
В каком именно виде вы хотите хранить цвет?
0
0 / 0 / 0
Регистрация: 26.03.2018
Сообщений: 216
11.11.2018, 08:46  [ТС]
Ygg, десятичный по компонентам
0
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,113
11.11.2018, 11:39
Я так понял, что проблема не столько в разных функциях работы с файлами (эта часть работает), сколько в переводе структуры в строку и обратно. Со строками можно поступить как-то так:
Кликните здесь для просмотра всего текста
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
#include <windows.h> 
#include <iostream>
#include <sstream>
#include <strstream>
 
struct data1
{
    int x;
    int y;
    COLORREF cr;
};
 
int main(int argc, char **argv)
{
    data1 info = { 10, 20, RGB(200,100,12) };
    data1 info1 = { 0 };
    data1 info2 = { 0 };
    data1 info3 = { 0 };
 
    // строковый поток (std::stringstream) и строка (std::string)
    {
        std::string s;
 
        // разложение цвета на компоненты
        unsigned r = GetRValue(info.cr);
        unsigned g = GetGValue(info.cr);
        unsigned b = GetBValue(info.cr);
 
        // перевод структуры в строковый поток
        std::stringstream is;
        is << info.x << std::endl;
        is << info.y << std::endl;
        is << r << " " << g << " " << b;
        // строковый поток в строку
        s = is.str();
 
        // из строки в строковый поток
        std::stringstream os(s);
        // из строкового потока в структуру
        os >> info1.x;
        os >> info1.y;
        os >> r >> g >> b;
        // соединение компонент в цвет
        info1.cr = RGB(r,g,b);
    }
 
    // строковый поток (std::strstream) и буфер (char[])
    {
        char buff[512];
 
        // разложение цвета на компоненты
        unsigned r = GetRValue(info.cr);
        unsigned g = GetGValue(info.cr);
        unsigned b = GetBValue(info.cr);
 
        // перевод структуры в буфер
        std::strstream is(buff, 512);
        is << info.x << std::endl;
        is << info.y << std::endl;
        is << r << " " << g << " " << b << std::ends;
 
        // перевод из буфера в структуру
        std::strstream os(buff, sizeof(buff));
        os >> info2.x;
        os >> info2.y;
        os >> r >> g >> b;
        // соединение компонент в цвет
        info2.cr = RGB(r,g,b);
    }
 
    // буфер (char[]) и sprintf/sscanf
    {
        char buff[512];
 
        // разложение цвета на компоненты
        unsigned r = GetRValue(info.cr);
        unsigned g = GetGValue(info.cr);
        unsigned b = GetBValue(info.cr);
 
        // перевод структуры в буфер
        sprintf(buff, "%d\n%d\n%u %u %u", info.x, info.y, r, g, b);
 
        // перевод из буфера в структуру
        sscanf(buff, "%d%d%u%u%u", &info3.x, &info3.y, &r, &g, &b);
        // соединение компонент в цвет
        info3.cr = RGB(r,g,b);
    }
 
    system("pause");
    return 0;
}
0
0 / 0 / 0
Регистрация: 26.03.2018
Сообщений: 216
16.11.2018, 10:23  [ТС]
Ygg, спасибо, с этом разобрался, но у меня сейчас ещё одна проблема вылезла.
Вот смотрите, если у меня нет текстового файла и я выбираю 4 способ( через винапи), то программа работает. Но, если в файл уже записана какая-то информация(любым другим способом 1-3) и потом я запускаю программу, но со способом 4(через винапи), то программа падает на строке: ReadFile(f, buff, fsize, NULL, NULL);//чтение
Не могли бы Вы помочь исправить? Вроде же все правильно написано. Почему так происходит?
0
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,113
16.11.2018, 10:37
Ваш код как-то поменялся? Если он стал иным, то, как минимум, нужно на него посмотреть.
Если падает именно ReadFile, то скорее всего файл не открылся и вы пытаетесь читать по ошибочному хендлу.
Нужно сделать проверки ошибок в коде и пройтись в отладчике по функции чтения шаг за шагом просматривая результаты.
0
0 / 0 / 0
Регистрация: 26.03.2018
Сообщений: 216
16.11.2018, 17:15  [ТС]
Ygg, нет, даже без изменений падает в ситуации, которую описал. Просто я изначально забыл ее проверить. Я понимаю, что ошибка в чтении файла, но не понимаю, как ее исправить

Добавлено через 1 минуту
Единственное, что в маппинге поверку ещё поставил( если не ошибка, то)

Добавлено через 3 часа 51 минуту
Ygg, не поможете?
0
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,113
16.11.2018, 17:33
Код из вашего сообщения работает и не падает. Сохраняю методом 1 (2,3,4). Читаю методом 4. Ничего не падает, всё работает. Я не знаю, что вы изменили и почему у вас перестало работать.
0
0 / 0 / 0
Регистрация: 26.03.2018
Сообщений: 216
16.11.2018, 18:13  [ТС]
Ygg, ладно, спасибо Вам!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.11.2018, 18:13
Помогаю со студенческими работами здесь

Есть н цветов разных видов. Составьте все возможные сочетания букетов из всех этих цветов. Количество цветов и их названия вводит пользователь
Есть n цветов разных видов. Составьте все возможные сочетания букетов из всех этих цветов. Количество цветов и их названия вводит...

Написать программу, которая бы рисовала текстовые окна произвольных цветов со случайными размерами в произволь
Написать программу, которая бы рисовала текстовые окна произвольных цветов со случайными размерами в произвольном месте экрана

вывести на экран прямоугольные окна 16 различных цветов, поместить в них текст различного размера и стиля
вывести на экран прямоугольные окна 16 различных цветов, поместить в них текст различного размера и стиля...

Быстрый перевод значений цветов пикселей изображения в двоичную систему счисления и запись их в строку
Здравствуйте. Имеется изображение формата bmp. Для получения цветов пикселей использую Scanline. Вопрос в следующем, можно ли и как...

Задать два перечислимых типа: первый - коды цветов, второй - названия цветов
Задать два перечислимых типа: первый коды цветов, второй - названия цветов. Вводится имя цвета, выводится его тип. Помогите плз,...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значения справочника
Maks 21.03.2026
Процедура ВодителиНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка) / / Отключаем стандартную обработку (стандартное открытие формы выбора без фильтров) . . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru