Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
14 / 11 / 4
Регистрация: 14.11.2020
Сообщений: 411

Некорректная запись в файл объекта

12.02.2022, 14:42. Показов 1935. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Записываю объект так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
class Person
{
public:
 
    char Name[50];
 
    void SetName(string name)
    {
        strcpy(this->Name, name.c_str());
    };
 
}
Метод записи в файл:
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
void CreateNewPerson()
    {
        HANDLE hFile = CreateFile(
            L"base.dat",     // Filename
            GENERIC_WRITE,          // Desired access
            FILE_SHARE_READ,        // Share mode
            NULL,                   // Security attributes
            OPEN_ALWAYS,             // Creates a new file, only if it doesn't already exist
            FILE_ATTRIBUTE_NORMAL,  // Flags and attributes
            NULL);
 
 
        Person newPerson;
 
        cout << "Введите имя: ";
        string name;
        cin >> name;
 
        newPerson.SetName(name);
 
        SetFilePointer(hFile, 0, NULL, FILE_END);
        DWORD bytesWritten;
        WriteFile(
            hFile,            // Handle to the file
            (char*)&newPerson,  // Buffer to write
            sizeof(Person),   // Buffer size
            &bytesWritten,    // Bytes written
            nullptr);
        
    };
В итоге вся эта история, выводимая так (представлено ниже), имеет очень странный вид, выводит либо "кракозябры", либо какое-то странное сочетание цифр и букв:

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
void ReadPerson()
    {
        Person p;
        HANDLE hFile = CreateFile(
            L"base.dat",     // Filename
            GENERIC_READ,          // Desired access
            FILE_SHARE_READ,        // Share mode
            NULL,                   // Security attributes
            OPEN_EXISTING,            // Creates a new file, only if it doesn't already exist
            FILE_ATTRIBUTE_NORMAL,  // Flags and attributes
            NULL);
        DWORD readedBytes;
        do{
            ReadFile(
                hFile, // дескриптор файла
                (char*)&p, // буфер данных
                sizeof(p), // количество байт для прочтения
                &readedBytes, // количество фактически прочитанных байт
                NULL // указатель на структуру, используемую при
                // асинхронном чтении
            );
            p.Print();
        } while (readedBytes != 0);
        
    }
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.02.2022, 14:42
Ответы с готовыми решениями:

Некорректная запись в файл
Столкнулся с непонятной проблемой. Есть строка которая содержит шифрованные символы ...

Некорректная запись структуры в файл
Добрый вечер всем! Следующая проблема: некорректно заполняется файл из структуры. class questions : public test, public testsystem ...

Некорректная запись кириллицы в файл
Здравствуйте! Подскажите, пожалуйста, как можно исправить (и можно ли вообще) вот такую ошибку: 1) Вводим, например, вот такие...

28
2410 / 1942 / 764
Регистрация: 27.07.2012
Сообщений: 5,580
12.02.2022, 18:01
Студворк — интернет-сервис помощи студентам
Nuyta, покажите текущий код.
0
14 / 11 / 4
Регистрация: 14.11.2020
Сообщений: 411
12.02.2022, 18:15  [ТС]
John Prick,
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
void ReadPerson()
    {
        Person p;
        HANDLE hFile = CreateFile(
            L"base.dat",     // Filename
            GENERIC_READ,          // Desired access
            FILE_SHARE_READ,        // Share mode
            NULL,                   // Security attributes
            OPEN_EXISTING,            // Creates a new file, only if it doesn't already exist
            FILE_ATTRIBUTE_NORMAL,  // Flags and attributes
            NULL);
        DWORD readedBytes;
 
        if (ReadFile(
            hFile, // дескриптор файла
            (char*)&p, // буфер данных
            sizeof(p), // количество байт для прочтения
            &readedBytes, // количество фактически прочитанных байт
            NULL // указатель на структуру, используемую при
            // асинхронном чтении
        )) {
            p.Print();
        }
        
        /*if (readedBytes != 0)
        {
            
        }*/
        
        
        CloseHandle(hFile);
    }
Добавлено через 1 минуту
John Prick, если брать Ваше предложение с
Цитата Сообщение от Nuyta Посмотреть сообщение
/*if (readedBytes != 0)
        {
}*/
то он всё так же выводит только первый объект
0
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
12.02.2022, 18:31
Цитата Сообщение от Nuyta Посмотреть сообщение
то он всё так же выводит только первый объект
Вы же сами код написали таким образом, чтобы выводился только первый объект.
В первоначальном варианте у вас был цикл, позволяющий выводить несколько объектов, а здесь он куда-то пропал, в чем дело?
0
14 / 11 / 4
Регистрация: 14.11.2020
Сообщений: 411
12.02.2022, 18:41  [ТС]
DrOffset, так он последний элемент дублировал. Я пытаюсь понять, как это исправить!
0
2410 / 1942 / 764
Регистрация: 27.07.2012
Сообщений: 5,580
12.02.2022, 19:07
Лучший ответ Сообщение было отмечено Nuyta как решение

Решение

Так верните цикл
C++
1
2
3
while (ReadFile(/*...*/)) {
   p.Print();
}
0
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
12.02.2022, 19:48
Цитата Сообщение от Nuyta Посмотреть сообщение
так он последний элемент дублировал. Я пытаюсь понять, как это исправить!
Цикл while вместо do-while.
Как вам показали в #25.
0
14 / 11 / 4
Регистрация: 14.11.2020
Сообщений: 411
12.02.2022, 19:59  [ТС]
DrOffset,
C++
1
2
3
4
 while (ReadFile(hFile, (char*)&p, sizeof(p), &readedBytes, NULL)) 
            {
                p.Print();
            }
При таком раскладе он бесконечный цикл запускает, непонятно почему.

Добавлено через 3 минуты
Всё, проблему решила. Закипела, извините за тугодумие))

Кому интересно, вот решение проблемы:

C++
1
2
3
4
5
6
7
8
while (ReadFile(hFile, (char*)&p, sizeof(p), &readedBytes, NULL))
        {
            if (readedBytes != 0)
            {
                p.Print();
            }
            else break;
        }
0
2410 / 1942 / 764
Регистрация: 27.07.2012
Сообщений: 5,580
12.02.2022, 20:02
Попробуйте
C++
1
while (ReadFile(hFile, (char*)&p, sizeof(p), &readedBytes, NULL) && readedBytes != 0)
1
14 / 11 / 4
Регистрация: 14.11.2020
Сообщений: 411
12.02.2022, 20:06  [ТС]
John Prick, ну.. или так

Добавлено через 25 секунд
John Prick, я в else дропаюсь из цикла, тоже нормально работает. Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.02.2022, 20:06

Некорректная запись в файл
Здравствуйте, написал следующий код case WM_COMMAND: { int SIZE = 10; char Login; char Password; char...

Некорректная запись в файл
Помогите, пожалуйста, разобраться с кодом. Задание по нахождению большего значения объема шарового сегмента. Первое действие делает...

Некорректная запись в файл из массива
Есть код: int kol; AnsiString user; DeleteFile(&quot;base.dat&quot;); Form1-&gt;file_id=FileCreate(&quot;base.dat&quot;); if...

Некорректная запись в файл
Всем привет, столкнулся с проблемой Есть код, найденный на просторах данного форума и немного видоизмененный: CHCP 1251 @echo off ...

Некорректная запись в файл
Добрый день. Я выполнял задание по лабораторной работе &quot;Из текста, расположенного в файле, исключить однобуквенные слова. Результат...


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru