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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
inst_mefi
22 / 25 / 5
Регистрация: 10.10.2013
Сообщений: 165
#1

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

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

Здравствуйте.
Есть кусочек кода для записи в файл. Перед ним еще похожий кусочек записывает данные из другого класса(только числа с пробелами). Так вот, когда доходит до 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2014, 12:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Std::wostream не выводит wchar_t (C++):

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

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

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

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

Std::wcout не выводит сообщение - C++
Здравствуйте. Вот в таком коде : int _tmain(int argc, _TCHAR* argv) { std::vector&lt;std::string&gt; Directories; //...

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

16
nmcf
5362 / 4678 / 1568
Регистрация: 14.04.2014
Сообщений: 18,712
13.06.2014, 12:03 #2
write() же для бинарного режима.
Ты содержимое name проверял? А флаги у потока?
0
inst_mefi
22 / 25 / 5
Регистрация: 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
nmcf
5362 / 4678 / 1568
Регистрация: 14.04.2014
Сообщений: 18,712
13.06.2014, 13:16 #4
Памяти выделяешь недостаточно, надо (length+1) выделять.
А calloc() для чего? Есть же new.
0
inst_mefi
22 / 25 / 5
Регистрация: 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
alsav22
5425 / 4820 / 442
Регистрация: 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
inst_mefi
22 / 25 / 5
Регистрация: 10.10.2013
Сообщений: 165
13.06.2014, 20:25  [ТС] #7
alsav22, файл открывается и пишется до первого столкновения с wchar.
num банально не доходят руки переименовать во что-то более "универсальное".
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 20:33 #8
Цитата Сообщение от inst_mefi Посмотреть сообщение
файл открывается и пишется до первого столкновения с wchar.
Как видите это?
0
inst_mefi
22 / 25 / 5
Регистрация: 10.10.2013
Сообщений: 165
13.06.2014, 21:02  [ТС] #9
alsav22, во-первых, обратно из файла считывается часть данных, которая записана до ошибки, во-вторых, блокнот есть. А еще выяснилось, что эта чертова замечательная функция не хочет работать с массивами.

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

Добавлено через 7 минут
Выделение памяти исправили? Покажите код, который сейчас пробуете.
0
inst_mefi
22 / 25 / 5
Регистрация: 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
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 21:38 #12
Отладчиком смотрели, что в name перед записью?
0
inst_mefi
22 / 25 / 5
Регистрация: 10.10.2013
Сообщений: 165
13.06.2014, 21:40  [ТС] #13
alsav22, смотрел, там L"Пшеница твердая".
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 21:54 #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
1
inst_mefi
22 / 25 / 5
Регистрация: 10.10.2013
Сообщений: 165
13.06.2014, 22:04  [ТС] #15
alsav22, вылетает в исключение на stream<<name; до этого все нормально, если убрать эту строчку, тогда вообще все нормально.

Добавлено через 9 минут
alsav22, благодарю, подозревал что дело именно в этом, но подобной статьи так и не нагуглилось, а консольные методы тут не работают.
0
13.06.2014, 22:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2014, 22:04
Привет! Вот еще темы с ответами:

Не воспринимает ни std::cout, ни std::cin. Вобщем ничего из std. Также не понимает iostream - C++
Здравствуйте! Я хотел начать изучать язык C++. Набрал литературы. Установил Microsoft Visual C++ 2005 Express Edition. Образ диска...

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri - C++
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка error: cannot convert 'std::string {aka...

Wchar_t и unsigned wchar_t в windows - C++
Печально, но факт: wchar_t - 2 байта, unsigned wchar_t - 4 байта Вопрос1: используется ли unsigned wchar_t для хранения...

Cannot convert from 'wchar_t' to 'const wchar_t *' - C++
такой код, порылся в инете не помогло. ломать голову надоело может кто подскажет, буду благодарен. wchar_t * english = L&quot;abvgdee...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru