Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
22 / 25 / 11
Регистрация: 10.10.2013
Сообщений: 165
1

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

13.06.2014, 12:00. Показов 2342. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Есть кусочек кода для записи в файл. Перед ним еще похожий кусочек записывает данные из другого класса(только числа с пробелами). Так вот, когда доходит до 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 минуту
Ах, да, что я делаю не так и как надо? Гугл-мугл не помогает
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.06.2014, 12:00
Ответы с готовыми решениями:

Error: cannot bind 'std::basic_ostream<wchar_t>' lvalue to 'std::basic_ostream<wchar_t>&&'|
Ругается на строку Log&lt;&lt;StripXML(__PRETTY_FUNCTION__)&lt;&lt;std::endl;. Функция такая: ...

Std::initializer_list wchar_t
Подскажите, не удаётся сделать функцию добавления в массив wchar_t template&lt;class T0, class T1&gt;...

Std::allocator<wchar_t>>' to 'LPCWSTR'
собственно есть list&lt;wstring&gt; куда вставили много адресов типа L&quot;D:\\66\\99&quot;; Задача удалять папки...

Неправильно сравнивает строки wchar_t* и std::wstring
#define _CRT_SECURE_NO_WARNINGS #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;string&gt; ...

16
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
13.06.2014, 12:03 2
write() же для бинарного режима.
Ты содержимое name проверял? А флаги у потока?
0
22 / 25 / 11
Регистрация: 10.10.2013
Сообщений: 165
13.06.2014, 13:14  [ТС] 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.
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
13.06.2014, 13:16 4
Памяти выделяешь недостаточно, надо (length+1) выделять.
А calloc() для чего? Есть же new.
0
22 / 25 / 11
Регистрация: 10.10.2013
Сообщений: 165
13.06.2014, 17:25  [ТС] 5
nmcf, length+1 не спасает. Все равно все фэйлится. Вроде поток для wchar_t специализированный и на нем он и зависает. И информации по ошибкам же не найдешь(
А calloc, как и new, для выделения памяти.

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

Добавлено через 3 часа 27 минут
Актуально и срочно. Как исправить вывод строки?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 19:28 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;
0
22 / 25 / 11
Регистрация: 10.10.2013
Сообщений: 165
13.06.2014, 20:25  [ТС] 7
alsav22, файл открывается и пишется до первого столкновения с wchar.
num банально не доходят руки переименовать во что-то более "универсальное".
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 20:33 8
Цитата Сообщение от inst_mefi Посмотреть сообщение
файл открывается и пишется до первого столкновения с wchar.
Как видите это?
0
22 / 25 / 11
Регистрация: 10.10.2013
Сообщений: 165
13.06.2014, 21:02  [ТС] 9
alsav22, во-первых, обратно из файла считывается часть данных, которая записана до ошибки, во-вторых, блокнот есть. А еще выяснилось, что эта чертова замечательная функция не хочет работать с массивами.

Добавлено через 4 минуты
Хотя да, она вообще с буквами не хочет работать, только с пробелами и переводами строки.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 21:23 10
GetNameOfCulture() что возвращает?

Добавлено через 7 минут
Выделение памяти исправили? Покажите код, который сейчас пробуете.
0
22 / 25 / 11
Регистрация: 10.10.2013
Сообщений: 165
13.06.2014, 21:30  [ТС] 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*
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 21:38 12
Отладчиком смотрели, что в name перед записью?
0
22 / 25 / 11
Регистрация: 10.10.2013
Сообщений: 165
13.06.2014, 21:40  [ТС] 13
alsav22, смотрел, там L"Пшеница твердая".
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 21:54 14
Лучший ответ Сообщение было отмечено inst_mefi как решение

Решение

При заходе сюда, поток рабочий?
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
1
22 / 25 / 11
Регистрация: 10.10.2013
Сообщений: 165
13.06.2014, 22:04  [ТС] 15
alsav22, вылетает в исключение на stream<<name; до этого все нормально, если убрать эту строчку, тогда вообще все нормально.

Добавлено через 9 минут
alsav22, благодарю, подозревал что дело именно в этом, но подобной статьи так и не нагуглилось, а консольные методы тут не работают.
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
13.06.2014, 22:12 16
Так в чём проблема была? Или она осталась?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 22:54 17
Цитата Сообщение от nmcf Посмотреть сообщение
Так в чём проблема была? Или она осталась?
http://www.rsdn.ru/forum/cpp/1853603.hot
0
13.06.2014, 22:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.06.2014, 22:54
Помогаю со студенческими работами здесь

Расстановка девяти чисел (Turbo C) Выводит ошибку using Matrix = std::array<std::array<int, 3>, 3>; и bool NextSet
#include &lt;iostream&gt; #include &lt;array&gt; using Matrix = std::array&lt;std::array&lt;int, 3&gt;, 3&gt;; //...

Ошибка E0349 Отсутствует оператор ">>" соответствующий этим операндам. тип операндов: std::ifstream >> wchar_t[32]
#include&lt;iostream&gt; #include&lt;fstream&gt; #include&lt;string&gt; struct Muzician { wchar_t Name;...

Почему const wchar_t* воспринимается как wchar_t* ?
Здравствуйте. Я написал вот так: const wchar_t* dir = directory.c_str(); StartModule(dir);...

Std::wcout не выводит сообщение
Здравствуйте. Вот в таком коде : int _tmain(int argc, _TCHAR* argv) {...


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

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