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

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

12.02.2022, 14:42. Показов 1805. Ответов 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
 Аватар для YUEN HOIFEF
252 / 185 / 47
Регистрация: 31.01.2021
Сообщений: 934
12.02.2022, 14:51
Файл открывали? Там что-то должно быть. Сиволы лаинские таим русские.
0
14 / 11 / 4
Регистрация: 14.11.2020
Сообщений: 411
12.02.2022, 14:57  [ТС]
YUEN HOIFEF, да, есть там. Тоже кракозябры!
0
 Аватар для PencilTorch
90 / 60 / 32
Регистрация: 06.08.2020
Сообщений: 220
12.02.2022, 15:05
А зачем в ReadPerson вся эта прелюдия с 3 по 12 строку?
0
14 / 11 / 4
Регистрация: 14.11.2020
Сообщений: 411
12.02.2022, 15:08  [ТС]
PencilTorch, а как по-другому?
0
 Аватар для YUEN HOIFEF
252 / 185 / 47
Регистрация: 31.01.2021
Сообщений: 934
12.02.2022, 15:42
Nuyta
Предлагаю начать с малого. Зписать что либо простое в файл например один символ. Потом прочитать его.
0
 Аватар для PencilTorch
90 / 60 / 32
Регистрация: 06.08.2020
Сообщений: 220
12.02.2022, 15:43
Ну я тут плохой советчик, но мне кажется, что из-за этой манипуляции открывается не тот файл в который писались персоны, а создается новый с таким же названием. И дальше ReadFile по нему шарит и выдает только мусор.
0
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,557
12.02.2022, 15:57
Другой вопрос, зачем использовать без особой необходимости эти API? Ну есть же нормальный потоковый ввод.
0
 Аватар для Nishen
1357 / 856 / 365
Регистрация: 26.02.2015
Сообщений: 3,814
12.02.2022, 16:06
Почему используешь API, а не C++?
0
14 / 11 / 4
Регистрация: 14.11.2020
Сообщений: 411
12.02.2022, 16:12  [ТС]
Nishen, такое задание)

Добавлено через 28 секунд
John Prick, так попросили. Мы изучаем совместный доступ к файлу.

Добавлено через 41 секунду
Nishen, проблема решилась, не хватало CloseHandle(hFile); Но! Не подскажете, почему он два раза объект считывает? (он в файле один)
0
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,557
12.02.2022, 16:19
Цитата Сообщение от Nuyta Посмотреть сообщение
почему он два раза объект считывает?
Это следует из вашего кода:
Цитата Сообщение от Nuyta Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
DWORD readedBytes;
        do{
            ReadFile(
                hFile, // дескриптор файла
                (char*)&p, // буфер данных
                sizeof(p), // количество байт для прочтения
                &readedBytes, // количество фактически прочитанных байт
                NULL // указатель на структуру, используемую при
                // асинхронном чтении
            );
            p.Print();
        } while (readedBytes != 0);
В первый раз прочитали, занесли количество байт в readedBytes, распечатали p.Print(), проверили условие - readedBytes не равно нулю - продолжаем. Прочитали второй раз (на самом деле ничего не прочитали), объект p остался прежним, распечатали его p.Print(), проверили условие - вышли из цикла.
0
14 / 11 / 4
Регистрация: 14.11.2020
Сообщений: 411
12.02.2022, 16:23  [ТС]
John Prick, хм, а как тогда быть? Другой же цикл не сможешь использовать
0
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,557
12.02.2022, 16:29
Цитата Сообщение от Nuyta Посмотреть сообщение
Другой же цикл не сможешь использовать
Ну если другой никак нельзя, то хотя бы:
C++
1
2
if (readedBytes != 0)
    p.Print();
Добавлено через 1 минуту
А вообще ReadFile возвращает не ноль, если чтение прошло успешно.
0
14 / 11 / 4
Регистрация: 14.11.2020
Сообщений: 411
12.02.2022, 16:30  [ТС]
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
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;
 
        ReadFile(
            hFile, // дескриптор файла
            (char*)&p, // буфер данных
            sizeof(p), // количество байт для прочтения
            &readedBytes, // количество фактически прочитанных байт
            NULL // указатель на структуру, используемую при
            // асинхронном чтении
        );
        
        if (readedBytes != 0)
        {
            p.Print();
        }
        
        
        CloseHandle(hFile);
    }
0
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,557
12.02.2022, 16:30
https://docs.microsoft.com/en-... i-readfile

Return value
If the function succeeds, the return value is nonzero (TRUE).

If the function fails, or is completing asynchronously, the return value is zero (FALSE). To get extended error information, call the GetLastError function.
0
14 / 11 / 4
Регистрация: 14.11.2020
Сообщений: 411
12.02.2022, 16:33  [ТС]
John Prick, да, насчёт "не ноль" я знаю

Добавлено через 2 минуты
John Prick, так тоже попробовала, тоже один объект:

C++
1
2
3
4
5
6
7
8
9
10
if (ReadFile(
            hFile, // дескриптор файла
            (char*)&p, // буфер данных
            sizeof(p), // количество байт для прочтения
            &readedBytes, // количество фактически прочитанных байт
            NULL // указатель на структуру, используемую при
            // асинхронном чтении
        )) {
            p.Print();
        }
0
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,557
12.02.2022, 16:36
Цитата Сообщение от Nuyta Посмотреть сообщение
один объект
Так а сколько надо в объектах?
0
14 / 11 / 4
Регистрация: 14.11.2020
Сообщений: 411
12.02.2022, 17:15  [ТС]
John Prick, ну допустим объектов 3. Он выводит только первый. А надо все
0
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,557
12.02.2022, 17:47
Цитата Сообщение от Nuyta Посмотреть сообщение
А надо все
А это к чему было?
Цитата Сообщение от Nuyta Посмотреть сообщение
почему он два раза объект считывает? (он в файле один)
0
14 / 11 / 4
Регистрация: 14.11.2020
Сообщений: 411
12.02.2022, 17:55  [ТС]
John Prick, так на тот момент у меня в файле был один объект. При выводе он дублировался. Мне нужно вывести ВСЕ объекты из файла, без дублирования

Добавлено через 40 секунд
John Prick, фактически, программа дублирует последний объект, записанный в файл. Первые (если их несколько) выводятся по одному разу
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.02.2022, 17:55
Помогаю со студенческими работами здесь

Некорректная запись в файл
Здравствуйте, написал следующий код 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;Из текста, расположенного в файле, исключить однобуквенные слова. Результат...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru