Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Прерывается вывод на консоль :(  (Прочитано 10605 раз)
0 Пользователей и 1 Гость смотрят эту тему.
OldDummy
Гость
« : 10-01-2009 18:11 » 

Делаю программку на VC++ и возникла такая проблема:
С определенного момента вывод текста на экран не производится, по непонятной мне причине.
Но не забывается (где-то буферизируется видимо), поскольку в другом месте проги текст выводится...
Вот привожу фрагмент:
Код:
cout << RUS("Введите индивидуальный идентификатор прибора: "); cin >> NameFile;
  strcpy(NF,NameFile); strcpy(NameFile1,NameFile);
  strcat(NameFile,"-1.txt"); strcat(NameFile1,"-2.txt");
  ofstream TechnoModul1(NameFile, ios::out|ios::noreplace);
  ofstream TechnoModul2(NameFile1, ios::out|ios::noreplace);
  cout << RUS("Индивидуальный номер прибора: ")<< NF << "\n";
  TechnoModul1 << "\n" << "Индивидуальный номер прибора: "<< NF << "\n";
  TechnoModul2 << "\n" << "Индивидуальный номер прибора: "<< NF << "\n";
  if (!TechnoModul1||!TechnoModul2) {MessageBoxA(0,Info[3], Head[0], MB_ICONERROR); abort(); }
  time_t t;
  time(&t);
  cout << "\n" << RUS("Дата и время проведения испытаний указанного экземпляра: \n") << ctime(&t) << "\n";
Вот здесь фраза "Введите индивидуальный идентификатор прибора: " выводится на экран, далее инфа на экран прекращает выводиться. Производится запись в файлы TechnoModul1 и TechnoModul2
Но далее в программе весь "пропущенный" текст выводится на экран.  В чем я неправ?
Кстати. прога писалась для BC++, компилю в VC++.
« Последнее редактирование: 10-01-2009 20:13 от Finch » Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 10-01-2009 18:29 » 

Два совета по форме:
1. лучше использовать тег [code][/code] для обрамления кода на форуме
2. с точки зрения читаемости, размещать на одной строке кода 2 разных выражения, разделённые ';' - некомильфо Улыбаюсь

А что скрывается за макросами RUS и NF? (это ведь макросы?)
Записан
OldDummy
Гость
« Ответ #2 : 10-01-2009 18:35 » 

RUS() это как я понял кирилизация строки. Исходник не мой. так было. Делалось на Borland, может там и нужно было, но и у меня на VC 6.0 не ругается.
Остальные места исходника я переправил, а вот здесь просто не пойму, почему вывод на экран затыкается...
cout я не переопределял...
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 10-01-2009 20:09 » 

При работе с потоками, данные буфферизируются. Чтоб их протолкнуть дальше из буффера. есть несколько способов.
1) заполнить буффер до конца.
2) принудительно протолкнуть данные из буффера с помошью команды cout.flush()
3) напечатать перевод каретки с помошью endl или "\r\n" для Windows.   Тогда данные также автоматически проталкиваются.
« Последнее редактирование: 10-01-2009 20:12 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
OldDummy
Гость
« Ответ #4 : 10-01-2009 20:14 » 

Такое впечатление, что что-то затыкает вывод на экран, а потом типа отпускает...
Я так понимаю, что какие-то строки здесь виноваты, поэтому и привел фрагмент кода, первые строки которого выводятся, а последние ПОКА нет.
Записан
OldDummy
Гость
« Ответ #5 : 12-01-2009 11:14 » 

Проблема попрежнему остается
Сделал такой скриптик:

Код:
#include <iostream.h>
#include <fstream.h> 
#include <windows.h>
#include <string.h> 
#include <ctime.h>

char NNN[100], NameFile[50], NF[50];
char bufRus[256];
char *Head[]={"Ошибка","Уведомление"};
char *Info[]={"Файл уже существует ",
              "Информация сохранена в файле "};

 
char* RUS(const char*text) //функция поддержки русского языка
{
CharToOem(text,bufRus);
return bufRus;
}

void main()
{
  cout << RUS("Версия программного обеспечения Version 1.0 \n");
  cout << RUS("Введите идентификатор: ");
  cin >> NameFile;
  strcpy(NF,NameFile);
  strcat(NameFile,"-1.txt");

  ofstream OutFile(NameFile, ios::out);
 
  cout << RUS("Идентификатор: ")<< NF << "\n";  // ???

  OutFile << "\n" << "Идентификатор: "<< NF << "\n";
 
  if (!OutFile) {MessageBoxA(0,Info[0], Head[0], MB_ICONERROR); abort(); }
  time_t t;
  time(&t);
  cout << "\n" << RUS("Дата и время: \n") << ctime(&t) << "\n";
  OutFile << "\n" << "Дата и время: "<< ctime(&t)<< "\n";
 
 cout << RUS("Жду готовности \n");
 cout << RUS("Ввод данных завершен\n");

 OutFile.close();
 strcat(strcat(NNN,Info[1]),NameFile);
 MessageBoxA(0,NNN,Head[1], MB_OK);

}


Если компилирую его Borland C++ Bilder 6.0 - работает как надо...
Если компилирую его MS Visual C++ 6.0 то строка, откомментированная Не понял? и последующие строки выводятся только после получения MessageBoxA, которое в последней строке и нажатия кнопки ОК.
                                                                       
И попутно еще вопрос. При компиляции исходного скрипта (не этого) в MS VC++ EXEшник получается 250 кб (debug)
или 70кб (release)
При компиляции в Borlande не получается сделать меньше чем 300 кб. Где я еще лоханулся?
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 12-01-2009 11:38 » 

OldDummy, а MessageBox выводится? Я думал, он только в случае ошибки, и не рассматривал его. прочитал невнимательно. Что-то странное: значит, вывод продолжается только после MessageBox? или просто после выхода из блока?
« Последнее редактирование: 12-01-2009 11:42 от Вад » Записан
OldDummy
Гость
« Ответ #7 : 12-01-2009 12:11 » 

Там два MessageBox
Речь идет о последнем (первый в принципе можно и выкинуть в этом примерчике)
Прерванный вывод продолжается именно только после выхода из второго (последнего) MessageBox!
Причем повторюсь, только при компиляции Visual C++ Улыбаюсь
Если есть этот компилятор, можно на премерчике проверить...
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 12-01-2009 12:36 » 

У меня в VS2008 Express всё выводится до MessageBox-а (пришлось, правда, пару фиксов сделать - заголовки уже давно переименовали). На 6й студии проверить не могу - может, там какая-то специфика реализации потоков ввода-вывода, или ещё что...
« Последнее редактирование: 12-01-2009 12:37 от Вад » Записан
OldDummy
Гость
« Ответ #9 : 12-01-2009 12:47 » 

Спасибо!
Отнесу это на счет особенностей МС 6.0 и забью на это...
« Последнее редактирование: 02-03-2009 18:57 от Алексей1153++ » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines