Форум программистов, компьютерный форум CyberForum.ru

Std::wostream не выводит wchar_t - C++

Восстановить пароль Регистрация
 
inst_mefi
22 / 25 / 5
Регистрация: 10.10.2013
Сообщений: 165
13.06.2014, 12:00     Std::wostream не выводит wchar_t #1
Здравствуйте.
Есть кусочек кода для записи в файл. Перед ним еще похожий кусочек записывает данные из другого класса(только числа с пробелами). Так вот, когда доходит до stream.write(name, length), запись в файл прекращается. Совсем. Т.е. на следующем проходе цикла code и length уже не пишутся даже. stream<<name тоже пробовал, эффект идентичный.
C++
1
2
3
4
5
6
7
8
9
10
do
            {
                int code = cultures->GetCodeOfCulture();
                int length = wcslen(cultures->GetNameOfCulture());
                wchar_t* name = (wchar_t*)calloc(length, sizeof(wchar_t));
                wcscpy(name, cultures->GetNameOfCulture());
                stream << code << L" " << length << L" ";
                stream.write(name, length);
                stream << L" ";
            } while (cultures->Next());
Поток открывается так
C++
1
2
                std::wofstream stream;
            stream.open(num, std::iostream::trunc);
Где num, как ни странно строка wchar_t* с адресом файла.

Добавлено через 1 минуту
Ах, да, что я делаю не так и как надо? Гугл-мугл не помогает
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4297 / 3718 / 1251
Регистрация: 14.04.2014
Сообщений: 14,540
13.06.2014, 12:03     Std::wostream не выводит wchar_t #2
write() же для бинарного режима.
Ты содержимое name проверял? А флаги у потока?
inst_mefi
22 / 25 / 5
Регистрация: 10.10.2013
Сообщений: 165
13.06.2014, 13:14  [ТС]     Std::wostream не выводит wchar_t #3
nmcf, содержимое name проверял. Пробовал и write read и << >>, просто не пишется ничего, ни единого бита. А с флагами что может быть?

Добавлено через 6 минут
Ан нет, не нормально.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
do
            {
                int code = cultures->GetCodeOfCulture();
                int length = wcslen(cultures->GetNameOfCulture());
                static  wchar_t* name; name = (wchar_t*)calloc(length, sizeof(wchar_t));
                wcscpy(name, cultures->GetNameOfCulture());
                stream << code << L" " << length << L" ";
                stream << name;
                if (stream.fail())
                    MessageBox(hwnd, L"stream.fail()==true", L"Ошибка", MB_TASKMODAL | MB_OK);
                if (stream.bad())
                    MessageBox(hwnd, L"stream.bad()==true", L"Ошибка", MB_TASKMODAL | MB_OK);
                if (stream.eof())
                    MessageBox(hwnd, L"stream.eof()==true", L"Ошибка", MB_TASKMODAL | MB_OK);
 
                stream << L" ";
            } while (cultures->Next());
Пишет stream.fail и stream.bad.
nmcf
4297 / 3718 / 1251
Регистрация: 14.04.2014
Сообщений: 14,540
13.06.2014, 13:16     Std::wostream не выводит wchar_t #4
Памяти выделяешь недостаточно, надо (length+1) выделять.
А calloc() для чего? Есть же new.
inst_mefi
22 / 25 / 5
Регистрация: 10.10.2013
Сообщений: 165
13.06.2014, 17:25  [ТС]     Std::wostream не выводит wchar_t #5
nmcf, length+1 не спасает. Все равно все фэйлится. Вроде поток для wchar_t специализированный и на нем он и зависает. И информации по ошибкам же не найдешь(
А calloc, как и new, для выделения памяти.

Добавлено через 24 минуты
Итак, ошибка с кодом 1 и описанием ios_base::badbit set: iostream stream error. Гугл опять находит только описания класса, а про ошибки только то, что они иногда случаются.

Добавлено через 3 часа 27 минут
Актуально и срочно. Как исправить вывод строки?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 19:28     Std::wostream не выводит wchar_t #6
Вот это настораживает:
Цитата Сообщение от inst_mefi Посмотреть сообщение
Где num, как ни странно строка wchar_t* с адресом файла.
Тут проверьте, файл открывается или нет:
C++
1
2
3
4
std::wofstream stream;
stream.open(num, std::iostream::trunc);
if (!stream.is_open())
    std::cout << "Error!" << std::endl;
inst_mefi
22 / 25 / 5
Регистрация: 10.10.2013
Сообщений: 165
13.06.2014, 20:25  [ТС]     Std::wostream не выводит wchar_t #7
alsav22, файл открывается и пишется до первого столкновения с wchar.
num банально не доходят руки переименовать во что-то более "универсальное".
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 20:33     Std::wostream не выводит wchar_t #8
Цитата Сообщение от inst_mefi Посмотреть сообщение
файл открывается и пишется до первого столкновения с wchar.
Как видите это?
inst_mefi
22 / 25 / 5
Регистрация: 10.10.2013
Сообщений: 165
13.06.2014, 21:02  [ТС]     Std::wostream не выводит wchar_t #9
alsav22, во-первых, обратно из файла считывается часть данных, которая записана до ошибки, во-вторых, блокнот есть. А еще выяснилось, что эта чертова замечательная функция не хочет работать с массивами.

Добавлено через 4 минуты
Хотя да, она вообще с буквами не хочет работать, только с пробелами и переводами строки.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 21:23     Std::wostream не выводит wchar_t #10
GetNameOfCulture() что возвращает?

Добавлено через 7 минут
Выделение памяти исправили? Покажите код, который сейчас пробуете.
inst_mefi
22 / 25 / 5
Регистрация: 10.10.2013
Сообщений: 165
13.06.2014, 21:30  [ТС]     Std::wostream не выводит wchar_t #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
{
            std::wofstream stream;
            stream.open(num, std::iostream::trunc | std::iostream::out );
            stream.exceptions(std::iostream::badbit);
            int counter = 1;
            while (list->Next())
            {
                list->Next();
            }
            while (cultures->Next())
            {
                cultures->Next();
            }
            while (list->Previous())
            {
                counter++;
            }
            try
            {
                stream << counter << L" ";
                do 
                {
                    int codeofsilage = list->GetCodeOfSilage();
                    int codeofculture = list->GetCodeOfCulture();
                    float mass = list->GetMass();
                    int type = list->GetType();
                    float moisture = list->GetMoisture();
                    float vitrescence = list->GetVitrescence();
                    int gluttentype = list->GetGluttenType();
                    float gluttenpercent = list->GetGluttenPercent();
                    float naturemass = list->GetNatureMass();
                    float cropsadmixture = list->GetCropsAdmixture();
                    float weedsadmixture = list->GetWeedsAdmixture();
                    stream << codeofsilage << L" " << codeofculture << L" " << mass << L" " << type << L" " << moisture << L" " << vitrescence << L" " << gluttentype << L" " << gluttenpercent << L" " << naturemass << L" " << cropsadmixture << L" " << weedsadmixture << L" ";
                } while (list->Next());
                counter = 1;
                while (cultures->Previous())
                {
                    counter++;
                }
                stream <<L"\n"<< counter << L" ";
                do
                {
                    int code = cultures->GetCodeOfCulture();
                    int length = wcslen(cultures->GetNameOfCulture());
                    static  wchar_t* name; name = (wchar_t*)calloc(length + 1, sizeof(wchar_t));
                    wcscpy(name, cultures->GetNameOfCulture());
                    stream << code << L" " << length << L" ";
                    MessageBeep(100);
                    stream << name;
                    MessageBeep(100);
                    stream << L" ";
                    MessageBeep(100);
                } while (cultures->Next());
                stream.close();
            }
            catch (std::iostream::failure exeption)
            {
                char* code = new char[10];
                sprintf(code, "%d", exeption.code());
                MessageBoxA(hwnd, exeption.what(), code, MB_OK | MB_TASKMODAL);
            }
        }
GetNameOfCulture возвращает wchar_t*
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 21:38     Std::wostream не выводит wchar_t #12
Отладчиком смотрели, что в name перед записью?
inst_mefi
22 / 25 / 5
Регистрация: 10.10.2013
Сообщений: 165
13.06.2014, 21:40  [ТС]     Std::wostream не выводит wchar_t #13
alsav22, смотрел, там L"Пшеница твердая".
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 21:54     Std::wostream не выводит wchar_t #14
Сообщение было отмечено автором темы, экспертом или модератором как ответ
При заходе сюда, поток рабочий?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
do
                {
                    int code = cultures->GetCodeOfCulture();
                    int length = wcslen(cultures->GetNameOfCulture());
                    static  wchar_t* name; name = (wchar_t*)calloc(length + 1, sizeof(wchar_t));
                    wcscpy(name, cultures->GetNameOfCulture());
                    stream << code << L" " << length << L" ";
                    MessageBeep(100);
                    stream << name;
                    MessageBeep(100);
                    stream << L" ";
                    MessageBeep(100);
                } while (cultures->Next());
Добавлено через 1 минуту
После вот этого, поток рабочий?
C++
1
stream << code << L" " << length << L" ";
Добавлено через 4 минуты
Цитата Сообщение от inst_mefi Посмотреть сообщение
смотрел, там L"Пшеница твердая".
Вот здесь почитайте на эту тему: http://www.rsdn.ru/forum/cpp/1853603.hot
inst_mefi
22 / 25 / 5
Регистрация: 10.10.2013
Сообщений: 165
13.06.2014, 22:04  [ТС]     Std::wostream не выводит wchar_t #15
alsav22, вылетает в исключение на stream<<name; до этого все нормально, если убрать эту строчку, тогда вообще все нормально.

Добавлено через 9 минут
alsav22, благодарю, подозревал что дело именно в этом, но подобной статьи так и не нагуглилось, а консольные методы тут не работают.
nmcf
4297 / 3718 / 1251
Регистрация: 14.04.2014
Сообщений: 14,540
13.06.2014, 22:12     Std::wostream не выводит wchar_t #16
Так в чём проблема была? Или она осталась?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2014, 22:54     Std::wostream не выводит wchar_t
Еще ссылки по теме:

Error: cannot bind 'std::basic_ostream<wchar_t>' lvalue to 'std::basic_ostream<wchar_t>&&'| C++
Std::wcout не выводит сообщение C++
C++ Std::initializer_list wchar_t

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 22:54     Std::wostream не выводит wchar_t #17
Цитата Сообщение от nmcf Посмотреть сообщение
Так в чём проблема была? Или она осталась?
http://www.rsdn.ru/forum/cpp/1853603.hot
Yandex
Объявления
13.06.2014, 22:54     Std::wostream не выводит wchar_t
Ответ Создать тему
Опции темы

Текущее время: 14:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru