Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
18 / 18 / 15
Регистрация: 19.03.2018
Сообщений: 49
1

Двоичная запись в файл с wofstream

09.03.2019, 17:53. Показов 1358. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго времени.

Столкнулся с проблемой, при которой не удается записать массив байт типа wchar_t в двоичный файл, но при этом, нормально записываются целые числа. Над проблемой безуспешно бьюсь уже третий день, гугл предлагает imbue для установки другой локали, но беда в том, что массив байт совсем не записывается в файл, поэтому установка локали также не дает видимого результата. У меня уже давно закончились любые предположения по этому поводу, поэтому я надеюсь на вашу помощь.

Весь исходный код касательно темы: (также я вывел его в отдельную демку, чтобы было нагляднее - см. прикрепления)
Кликните здесь для просмотра всего текста
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
#pragma once
#include <Windows.h>
#include <iostream>
#include <fstream>
 
template <typename Type>
void Stream_Write(std::wofstream* pOut, Type& Data, std::streamsize nSize = 0) {
    if (nSize == 0) {
        nSize = sizeof(Data);
    }
 
    pOut->write(reinterpret_cast<wchar_t*>(&Data), nSize);
}
 
int wmain(int argc, wchar_t* argv[]) {
    wchar_t* pwszFilename = new wchar_t[MAX_PATH + 1];
    wsprintf(pwszFilename, L"%s.out", argv[0]);
 
    std::wofstream* pOut = new std::wofstream;
    pOut->open(pwszFilename, std::wios::out | std::wios::binary);
 
    if (!pOut->good()) {
        std::wcout << L"Fail" << std::endl << std::endl;
    } else {
        std::wcout << L"Success" << std::endl << std::endl;
 
        wchar_t* pwszBuffer = new wchar_t[16];
        wsprintf(pwszBuffer, L"Test 1");
 
        int nBuffer = wcslen(pwszBuffer) * sizeof(wchar_t);
 
        Stream_Write(pOut, nBuffer);
        Stream_Write(pOut, pwszBuffer, nBuffer);
 
        delete[] pwszBuffer;
    }
 
    system("pause");
 
    delete pOut;
    delete[] pwszFilename;
 
    return 0;
}
Вложения
Тип файла: zip project.zip (3.3 Кб, 5 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.03.2019, 17:53
Ответы с готовыми решениями:

Запись и чтение файла wofstream
Здравствуйте , имеется проблемная часть кода . wofstream &amp; dish::save_to_file(wofstream &amp;...

Двоичная запись
Во входном потоке задано натуральное число n(в десятичной системе счисления).Найти количество...

Двоичная запись
Дано натуральное число N. Выведите его представление в двоичном виде в обратном порядке. Входные...

Функция ( натуральное число, двоичная запись)
Задача: А. Составить функцию, определяющую представляет ли запись натурального числа в двоичной...

7
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
10.03.2019, 01:37 2
Цитата Сообщение от Xo66um Посмотреть сообщение
записать массив байт типа wchar_t в двоичный файл
Массив байт - это массив char. Отсюда: хочешь записывать сырые байты в файл - используй потоки для char.

Добавлено через 35 минут
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
template <typename Type>
void Stream_Write(std::ofstream* pOut, Type* Data, std::streamsize nSize = 0) 
{
    if (nSize == 0) 
    {
        nSize = sizeof(Data);
    }
    
    pOut->write(reinterpret_cast<char*>(Data), nSize);
}
 
int wmain(int argc, wchar_t* argv[]) 
{
    wchar_t* pwszFilename = new wchar_t[MAX_PATH + 1];
    wsprintf(pwszFilename, L"%s.out", argv[0]);
    
    std::ofstream* pOut = new std::ofstream;
    pOut->open(pwszFilename, std::ios::out | std::ios::binary);
 
    if (!pOut->good()) {
        std::wcout << L"Fail" << std::endl << std::endl;
    } else {
        std::wcout << L"Success" << std::endl << std::endl;
 
        wchar_t* pwszBuffer = new wchar_t[16];
        wsprintf(pwszBuffer, L"Test 1");
 
        int nBuffer = wcslen(pwszBuffer) * sizeof(wchar_t);
 
        Stream_Write(pOut, &nBuffer);
        Stream_Write(pOut, pwszBuffer, nBuffer);
 
        delete[] pwszBuffer;
    }
 
    system("pause");
 
    delete pOut;
    delete[] pwszFilename;
 
    return 0;
}
0
18 / 18 / 15
Регистрация: 19.03.2018
Сообщений: 49
10.03.2019, 09:02  [ТС] 3
Цитата Сообщение от nd2 Посмотреть сообщение
используй потоки для char
Пробовал. Но тогда непонятно, как их считывать обратно в wchar_t, потому что ради этого использовался поток для широких символов.
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
10.03.2019, 14:11 4
Xo66um, бинарный файл зачем? Чем текстовый не устраивает?
0
18 / 18 / 15
Регистрация: 19.03.2018
Сообщений: 49
10.03.2019, 15:50  [ТС] 5
Цитата Сообщение от nd2 Посмотреть сообщение
текстовый не устраивает?
Да.
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
10.03.2019, 18:05 6
Цитата Сообщение от nd2 Посмотреть сообщение
Чем
???

Добавлено через 1 час 20 минут
Цитата Сообщение от Xo66um Посмотреть сообщение
Но тогда непонятно, как их считывать обратно в wchar_t,
Так же, как и записывал: с помощью потоков для бинарного чтения char.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    //...
    system("pause");
 
    delete pOut;
    
    ifstream in(pwszFilename, ios::in | ios::binary);
    if (!in)
    {
        wcout << L"Error opening file!" << endl;
        system("pause");
        return 0;
    }
    int n;
    in.read((char*)&n, sizeof(int));
    wchar_t* pwszBuffer = new wchar_t[n / sizeof(wchar_t)];
    in.read((char*)pwszBuffer, n);
    wcout << pwszBuffer << endl;
    delete[] pwszBuffer;
    
    delete[] pwszFilename;
    system("pause");
    return 0;
    //...
0
18 / 18 / 15
Регистрация: 19.03.2018
Сообщений: 49
10.03.2019, 18:55  [ТС] 7
"Чем" - некорректный вопрос, потому что в файл записывается структура данных, которую удобно и проще записывать и хранить именно в двоичном файле.

Программа использует широкие символы, char не используется вообще, поэтому использование ofstream и ifstream неоправданно, и если верить документации, использование их для типа wchar_t, грозит потерей данных в некоторых случаях, что совершенно недопустимо.
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
10.03.2019, 22:25 8
Лучший ответ Сообщение было отмечено Xo66um как решение

Решение

Цитата Сообщение от Xo66um Посмотреть сообщение
и если верить документации, использование их для типа wchar_t, грозит потерей данных в некоторых случаях,
Чушь. Потокам для бинарной записи/чтения char без разницы какие типы данных записывать/читать, потому что всегда записываются/читаются байты, а вот использовать, для бинарной записи/чтения, потоки для широких символов - плохая идея, приводящая к проблемам, которые ты и имеешь.
0
10.03.2019, 22:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.03.2019, 22:25
Помогаю со студенческими работами здесь

Двоичная запись целого числа (Н<9),используя кейс оф !
Помогите пожалуйста! Мне нужно вывести двоичную записать десятичного целого числа (N&lt;9) При этом...

Количество нечетных чисел, двоичная запись которых имеет 21 цифру.
Добрый день, преподаватель дал нам решать около 60 задач, помогите пожалуйста 1.Определить...

Определить, является ли периодической последовательностью двоичная запись заданного натурального числа
Уважаемые форумчане! Прошу вас помочь с алгоритмом, так как сам к сожалению ничего придумать не...

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

Напечатать все числа, не превосходящие n, двоичная запись которых является симметричной последовательностью
Определить функции, переводящую число в двоичную систему счисления и прове-ряющую, является ли...

Найти минимальный элемент, двоичная запись которого заканчивается не более чем двумя нулями
25 задача ЕГЭ Здравствуйте. Дан массив, содержащий 2020 положительных целых чисел, не...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru