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

Как записывать в файл, без перехода на новую строку (\n) или шифровать без появления \n

27.05.2020, 07:14. Показов 3058. Ответов 8

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Есть большая и жирная программа, которая делает тонну всего, а также, шифрует и расшифровывает файлы (данные в них, (массивы символов))... Всё бы ничего, но иногда шифрует с появлением \n и при записи в файл получается новая строка:
Нормальный вид:
101 9 ьи ШтарЮлия Дмитриевна ж 1 1 2001 2019 Инфы Анатомии ПП09-01Б 9умл2ь8яб 4.375 9 12 1ьцснысыю
С переходом на новую строку:
103 9 та
#УщарАнна Сергеевна ж 23 4 2002 2020 Инфы Анатомии ПП09-01Б 7щждхясса 0.9375 0 12 1енвюе6ш2

Как записывать в файл сам \n, т.е. не делая переход на строку, либо считывать из файла переход на новую строку, как \n
Буду очень признателен и благодарен :-)
Запись в файл и шифрование происходит например так:
C++
1
2
3
4
5
6
7
8
9
DWORD count = strlen(current->fam);
            stud << count << " ";
            if (!CryptEncrypt(hKey, 0, true, 0, (BYTE*)current->fam,
                &count, strlen(current->fam)))
            {
                std::cout << "CryptEncrypt"<< std::endl;
                return;
            }
            stud.write(current->fam, strlen(current->fam));
А чтение на данный момент так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
stud >> tmp_size;
                char s[2];
                stud.get(s, 2);
                tmp_size++;
                stud.get(nd->fam, tmp_size);
                cout << "\n\n" << nd->fam << "\n\n";
            
                tmp_size--;
                if (!CryptDecrypt(hKey, 0, true, 0, (BYTE*)nd->fam, &tmp_size))
                {
                    std::cout << "CryptDecrypt"<< std::endl;
                    return;
                }
WinApi (wincrypt.h) вынужден использовать, т.к. требуют именно его.
!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.05.2020, 07:14
Ответы с готовыми решениями:

Как сделать запись в файл без перехода на новую строку?
Имеется код: set /P asd= &lt; i.dat echo text,%asd%&gt;i.dat Ну по коду ясно что он открывает файл и в его начало добавляет текст. Так...

Как ввести данные без перехода на новую строку?
Собственно вопрос в заголовке. for (int i = 0; i &lt; 4; i++) { for (int j = 0; j &lt; 3; j++) { cin &gt;&gt; arr; } } Если вводить...

Как вводить переменную без перехода в новую строку?
Как после ввода строки не переходить в новую? Не очень понимаю, есть несколько тем, но там нет ссылочек на разные ресурсы. Ибо хочется...

8
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
27.05.2020, 10:06
Цитата Сообщение от Kotik-Besheniy Посмотреть сообщение
Как записывать в файл сам \n, т.е. не делая переход на строку, либо считывать из файла переход на новую строку, как \n
Перед записью замени в строке символ '\n' на два символа - '\\' и 'n'
Но, подозреваю, проблема у тебя не в этом
1
0 / 0 / 0
Регистрация: 13.01.2016
Сообщений: 17
27.05.2020, 15:44  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Перед записью замени в строке символ '\n' на два символа - '\\' и 'n'
Но, подозреваю, проблема у тебя не в этом
Насчёт проблемы не знаю, но он бывает шифрует без \n и всё ок расшифровывает, а появляется переход на строку и после этого всё идёт по одному месту. Ну и чисто логически, если в зашифрованной строке появляется \m (ну так, просто анализ), то с таким же успехом может родиться и \n. А так, в чём ещё может вообще быть дело?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
27.05.2020, 15:51
Цитата Сообщение от Kotik-Besheniy Посмотреть сообщение
А так, в чём ещё может вообще быть дело?
Скорее всего проблема в том как ты работаешь с файлом.
Ты пишешь/читаешь через std::fstream?
Возможно, надо читать через read, а не get. И открывать надо с флагом binary
Просто сравни массив, который ты записываешь с тем, который читаешь

Добавлено через 1 минуту
Цитата Сообщение от Kotik-Besheniy Посмотреть сообщение
WinApi (wincrypt.h) вынужден использовать, т.к. требуют именно его.
А с файлами не требуют работать через CreateFile/ReadFile/WriteFile?
1
0 / 0 / 0
Регистрация: 13.01.2016
Сообщений: 17
27.05.2020, 15:59  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
А с файлами не требуют работать через CreateFile/ReadFile/WriteFile?
Нет, с файлом работаешь, как хочешь, CreateFile/ReadFile и т.д. я использовал только для передачи открытого ключа, как показано в примерах шифрования/расшифрования файлов в документациях microsoft.

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Ты пишешь/читаешь через std::fstream?
Да.

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Возможно, надо читать через read, а не get. И открывать надо с флагом binary
Просто сравни массив, который ты записываешь с тем, который читаешь
Попробую в ближайшее время, есть ещё идея записывать чисто в бинарном виде и сразу всю структуру (узел списка).
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
27.05.2020, 16:53
Лучший ответ Сообщение было отмечено Kotik-Besheniy как решение

Решение

Цитата Сообщение от Kotik-Besheniy Посмотреть сообщение
Нет, с файлом работаешь, как хочешь, CreateFile/ReadFile и т.д. я использовал только для передачи открытого ключа, как показано в примерах шифрования/расшифрования файлов в документациях microsoft.
Ну так и работай с ними. Зачем тебе этот std::fstream?
Сначала записывай в бинарном виде размер - DWORD/uint32_t, потом массив. Соответственно начитывай
1
0 / 0 / 0
Регистрация: 13.01.2016
Сообщений: 17
27.05.2020, 17:37  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Ну так и работай с ними. Зачем тебе этот std::fstream?
Сначала записывай в бинарном виде размер - DWORD/uint32_t, потом массив. Соответственно начитывай
Да, сейчас уже появилось стойкое понимание, что да как тут, записывать всю структуру (узел списка) разом в бинарный файл получилось, да и читать соответственно тоже
Соответственно, если кому то когда-то сможет помочь:
Запись:

C++
1
2
3
4
5
6
student* current = head;
while (current != NULL)
{
    stud.write((char*)current, sizeof *current);
    current = current->next;
}
Перед записью выполняется шифрование всех эл-тов структуры по типу:
C++
1
2
3
4
5
6
7
count = strlen(current->name);
            if (!CryptEncrypt(hKey, 0, true, 0, (BYTE*)current->name,
                &count, strlen(current->name) + 1))
            {
                std::cout << "CryptEncrypt" << std::endl;
                return;
            }
И чтение данных происходит соответственно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Количество эл-тов списка считается по мере добавления и сохраняется в отдельный файл с глобальной (общей инф-цией) 
for (int i = 0; i < kol; i++) 
    {
        student* nd = new student;
                stud.read((char*)nd, sizeof *nd);
                nd->next = NULL;
                tail = nd; //Указатель на конец списка
        if (head == NULL)
            head = nd;
        else
        {
            student* current = head;
            while (current->next != NULL)
                current = current->next;
            current->next = nd;
        }
         }
После чтения идёт расшифровка всей структуры по типу:
C++
1
2
3
4
5
6
tmp_size = strlen(nd->fam);
if (!CryptDecrypt(hKey, 0, true, 0, (BYTE*)nd->fam, &tmp_size))
    {
        std::cout << "CryptDecrypt"<< std::endl;
        return;
    }
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
27.05.2020, 17:43
Цитата Сообщение от Kotik-Besheniy Посмотреть сообщение
Соответственно, если кому то когда-то сможет помочь:
Покажи класс student

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
student *head = nullptr;
student *tail = nullptr;
for (int i = 0; i < kol; i++) 
{
    student* nd = new student;
    stud.read((char*)nd, sizeof *nd);
    nd->next = NULL;
    if (head)
        head = tail = nd;
    else 
        tail = tail->next = nd; //Указатель на конец списка
}
0
0 / 0 / 0
Регистрация: 13.01.2016
Сообщений: 17
27.05.2020, 17:45  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Покажи класс student
C++
1
2
3
4
5
6
7
8
struct student
{
    char fam[qwe], name[qwe], otch[qwe], fac[rty], kaf[rty], group[uio], Nzach[uio], Nstud[uio], pol[1]; // Данные студента
    int id; // ID Студента
    float sr_ball, kol_Otl_Hor, kol_obch; // Данные студента
    short int day, year, mount, yPOST; // Данные студента
    student* next; // Указатель на след. эл-т списка
};
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
class Students : private Global_Info, Predmets
{
    friend void main_menu();   
    friend void print_och_all(student*); 
protected:
    student* head, * tail; 
    int kol_fin; 
    student* find; 
public:
    Students() 
    {
        cout << "\n\nСрабатывает конструктор Students \n\n";
        head = NULL;
        tail = NULL;
        find = NULL;
        kol_fin = 0;
    }
    void addSTUD(); // ф-я добавления в список 
    void vvod_predmets(student*, int); // Ф-я ввода предметов
    void saveOneStudToFile(student*); // Добавление 1 студента в конец файла
    void pechStud(); // ф-я печати всего списка
 
    void saveFILE(); // ф-я сохранения структуры в файл
    void loadFILE(); // ф-я загрузки данных из файла
    void find_stud(int, int); // Поиск студента
    void delete_student(student*); // Удаление студента
    void red_stud(); // Редактирование студента
    void izmInfStud(student*); // Редактирование студента
    void schet_sr_ball(student*, int[], int); // ф-я подсчёта ср балла студента
    void zad_ful(int); // Выполнение задания (Лучшего и худшего за определённое кол-во сессий, вводимых с клавы, с выбором пола студента)
    void zad_ful(); // Выполнение задания (Лучшего и худшего за определённое кол-во сессий, вводимых с клавы)
    void find_pech_stud_true(bool);
    void find_pech_stud_true(bool, char);
    ~Students()
    {
        while (head) // До тех пор, пока головной элемент не равен NULL
        {
            tail = head->next; // Переопределяем хвост
            delete head;// Удаляем голову
            head = tail;// Определяем новую голову
 
        }
    }
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.05.2020, 17:45
Помогаю со студенческими работами здесь

cin без перехода на новую строку
Как сделать, чтобы после считывания cin курсор не переводился на новую строку, а оставался на старой?

Написать приложение, выводящее n строк с переходом и без перехода на новую строку
Написать приложение, выводящее n строк с переходом и без перехода на новую строку. Строки можно вводить через консоль или вывести сразу...

Элементы li по центру внутри div, независимо от количества li и без перехода на новую строку
привет, друзья! Занимаюсь версткой пару лет, но тут такая задача, не знаю как реализовать. Как с помощью CSS и HTML сделать как на...

Ввод данных через scanf без перехода на новую строку, используя пробел
Нужно ввести двумерный массив так, чтобы каждый символ вводился на этой же строке нажатием клавиши &quot;пробел&quot;. Это возможно как-то...

Добавление данных в массив сессии без перезагрузки страницы или перехода на новую страницу
Приветствую Вас форумчане! Возникла идея, прошу помочь и направить в нужном направлении. Есть страницы с данными о спортивном...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru