Программа, которая собирает данные и записывает в файл. Как сделать так, чтобы в любом месте можно было выйти из программы по нажатию клавиши ESC? Как я понял нужно создавать поток, в котором постоянно проверяется нажата ли клавиша ESC и если нажата то завершается процесс. Только как это все организовать не понимаю.
#include #include #include #include #include char Bar[14], bar[19], Name[100], Prace[11]; FILE *basa; char cContinue( void ) < char key; printf( «Нажмите любую клавишу чтобы продолжить или ESC для выходаn» ); key = getch(); return key; >int main( void ) < int i, b; setlocale( LC_ALL, «RUS»); do < b = 0; printf( «Введите штрих-код: » ); scanf( «%14s», Bar ); fflush( stdin ); if( Bar[13] != 0 ) < b = 1; Bar[13] = 0; >for( i = 0; i < 13 b != 1; i ++ ) < if( Bar[i] < ‘0’ || Bar[i] >’9′ ) < b = 1; break; >> if( b == 1 ) < printf(«Ошибка! Некорректный штрих-код!n»); continue; >basa = fopen( «BarDB.txt», «r» ); while( fscanf( basa, «%s», bar ) > -1 ) < if( strcmp( Bar, bar ) == 0 ) < printf( «Такой Штрих-код уже есть!n» ); b = 1; break; >fscanf( basa, «%s» ); fscanf( basa, «%s» ); > fclose( basa ); if( b == 1 ) continue; printf( «Введите название товара: » ); fgets( Name, 99, stdin ); fflush( stdin ); for( i = 0; i < 99 Name[i] != 0; i++ ) < if( Name[i] == ‘n’ ) < Name[i] = 0; break; >> do < i = 0; b = 0; printf( «Введите цену на товар: » ); scanf( «%10s», Prace ); fflush( stdin ); while( Prace[i] != 0 ) < if( Prace[i] < ‘0’ Prace[i] != ‘,’ || Prace[i] >’9′ ) < printf(«Ошибка! Некорректная цена!n»); b = cContinue(); break; >i++; > > while( b != 27 b != 0 ); if( b == 27 ) break; basa = fopen( «BarDB.txt», «a» ); fprintf( basa, «%st», Bar ); fprintf( basa, «%stt», Name ); fprintf( basa, «%sn», Prace ); fclose( basa ); > while( cContinue() != 27 ); return 0; >
Код к задаче: «Выход из программы по нажатию клавиши ESC»
Листинг программы
Ключевое слово continue c++ что это. Оператор continue. Пример. Синтаксис. Урок #19.
printf( «Введите штрих-код или «s» для окончания работы: » ); scanf( «%14s», Bar ); if(Bar[0]==’s’ Bar[1]==0) < // Оформить окончание работы. >
Источник: studassistent.ru
exit , _Exit , _exit
Завершает вызывающий процесс. Функция exit завершает его после очистки; _exit и _Exit завершают его мгновенно.
Не используйте этот метод для завершения работы приложения универсальная платформа Windows (UWP), за исключением сценариев тестирования или отладки. Программные или пользовательские способы закрытия приложения Магазина не допускаются в соответствии с политиками Microsoft Store. Дополнительные сведения см. в разделе Жизненный цикл приложения UWP. Дополнительные сведения о приложениях UWP см. в документации по универсальная платформа Windows.
Язык Си — Как создать и открыть окно с помощью функций WinAPI.
Синтаксис
void exit( int const status ); void _Exit( int const status ); void _exit( int const status );
Параметры
status
Код состояния завершения.
Комментарии
Функции exit , _Exit и _exit завершают вызывающий процесс. Функция exit вызывает деструкторы для объектов локального потока, а затем вызывает в порядке «последним пришел — первым вышел» (LIFO) функции, зарегистрированные atexit и _onexit , а затем очищает все файловые буферы перед завершением процесса. Функции _Exit и _exit завершают процесс без удаления объектов локального потока или обработки функций atexit или _onexit , а также без очистки буферов потока.
exit Хотя вызовы , _Exit и _exit не возвращают значение, значение в status становится доступным для среды узла или ожидающего вызывающего процесса, если таковой существует, после завершения процесса. Как правило, вызывающая функция задает для status значение 0 для указания нормального завершения или принимает другое значение для указания ошибки. Значение status становится доступным для пакетной команды операционной системы ERRORLEVEL и представлено одной из двух констант: EXIT_SUCCESS , которая представляет значение 0, или EXIT_FAILURE , которая представляет значение 1.
Функции exit , _Exit , _exit , quick_exit , _cexit и _c_exit ведут себя следующим образом.
exit | Выполняет полные процедуры завершения библиотеки C, завершает процесс и предоставляет полученный код состояния среде узла. |
_Exit | Выполняет минимальные процедуры завершения библиотеки C, завершает процесс и предоставляет полученный код состояния среде узла. |
_exit | Выполняет минимальные процедуры завершения библиотеки C, завершает процесс и предоставляет полученный код состояния среде узла. |
quick_exit | Выполняет быстрые процедуры завершения библиотеки C, завершает процесс и предоставляет полученный код состояния среде узла. |
_cexit | Выполняет полные процедуры завершения библиотеки C и возвращает управление вызывающему объекту. Не завершает процесс. |
_c_exit | Выполняет минимальные процедуры завершения библиотеки C и возвращает управление вызывающему объекту. Не завершает процесс. |
При вызове exit функции или _Exit _exit деструкторы для любых временных или автоматических объектов, существовавших во время вызова, не вызываются. Автоматический объект — это нестатический локальный объект, определенный в функции. Временный объект — это объект, созданный компилятором, например значение, возвращаемое вызовом функции. Чтобы уничтожить автоматический объект перед вызовом exit , _Exit или _exit , явным образом вызовите деструктор для объекта , как показано ниже:
void last_fn() <> struct SomeClass <> myInstance<>; // . myInstance.~SomeClass(); // explicit destructor call exit(0); >
Не используйте для DLL_PROCESS_ATTACH вызова exit из DllMain . Чтобы выйти из DLLMain функции, вернитесь FALSE из DLL_PROCESS_ATTACH .
По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.
Требования
exit , _Exit , _exit | или |
Дополнительные сведения о совместимости см. в разделе Compatibility.
Пример
// crt_exit.c // This program returns an exit code of 1. The // error code could be tested in a batch file. #include int main( void )
Источник: learn.microsoft.com
Русские Блоги
1) Выход используется для завершения программы в любое время во время работы программы, а параметры выхода возвращаются в ОС.Функция выхода вызывается неявно, когда заканчивается основная функция. Когда функция выхода запускается, она сначала выполняет функцию, зарегистрированную функцией atexit (), а затем выполняет некоторую собственную работу по очистке, одновременно обновляя все выходные потоки, закрывая все открытые потоки и закрывая временные объекты, созданные стандартной функцией ввода-вывода tmpfile (). файл, Выход — завершить процесс, он удалит пространство памяти, используемое процессом, и вернет сообщение об ошибке родительскому процессу одновременно, а возврат — вернуть значение функции и выйти из функции. Нормальная ситуация: выход (0) означает, что программа в норме, выход (1) и выход (-1) означает, что программа завершается ненормально, выход (2) означает, что система не может найти указанный файл. Во всей программе просто вызовите exit to end (текущий процесс или всю программу в основном).
2)return это уровень языка, он представляет возврат стека вызовов; Return () — это возвращение текущей функции. Конечно, если она находится в основной функции main, она естественным образом завершит текущий процесс. Если нет, она вернется к предыдущему вызову. В нескольких процессах. Если иногда вы хотите определить, завершился ли предыдущий процесс нормально.
Будет использовано возвращаемое значение предыдущего процесса и так далее. Покавыход — уровень системного вызова, он представляет конец процесса 。
3) Функция выхода — выход из приложения и возврат состояния приложения в ОС. Это состояние идентифицирует некоторую информацию о работе приложения.
4) Обычно относится к машине и операционной системе: 0 означает нормальный выход, ненулевое значение означает ненормальный выход;
2. Рабочая среда и управление процессом
exit (int n) фактически предназначен для непосредственного выхода из программы, поскольку стандартная запись программы по умолчанию — int main (int argc, char ** argv), а возвращаемое значение — тип int. Как правило, запускайте программу под оболочкой, а затем используйте команду echo $? Для получения возвращаемого значения программы, то есть значения выхода.
В main () вы можете напрямую использовать return n или exit (n). делать. По умолчанию правильный выход из Unix должен возвращать 0 и возвращать ненулевое значение при ошибке. Теоретически, exit может вернуть любое целое число меньше 256. Различные возвращаемые значения в основном обрабатываются вызывающей стороной по-разному.
Отдельный процесс возвращается в операционную систему. Если это многопроцессный процесс, он возвращается родительскому процессу. Вызовите waitpid () и другие функции в родительском процессе, чтобы получить состояние выхода дочернего процесса для другой обработки.
В соответствии с соответствующим возвращаемым значением пусть вызывающая сторона выполняет соответствующую обработку. В основномExit () означает, что текущий процесс возвращает управление программе, которая вызвала программу. Возвращаемое значение в скобках сообщает вызывающей программе о текущем состоянии программы.。
1) Начало процесса:
Программа на C выполняется из основной функции, прототип выглядит следующим образом:
int main(int argc, char *argv[]);
Обычно возвращаемое значение main имеет тип int, который правильно возвращает 0. Если возвращаемое значение main равно void, некоторые компиляторы выдают предупреждение. В это время возвращаемое значение main обычно равно 0.
2) Завершение процесса:
Существует два типа завершения программы на Си: нормальное завершение и ненормальное завершение.
Обычное завершение делится на: возврат, выход, _exit, _Exit, pthreade_exit. Ненормальный средний палец подразделяется на: прерывание, сигнал и отмена ответа потока.
в основном говорит о первых четырех типах нормального завершения: серии выходных функций.
#include void exit(int status); void _Exit(int status); #include void _exit(int status);
Разница между тремя вышеупомянутыми функциями заключается в следующем: exit () (или return 0) вызовет обработчик завершения и стандартную программу очистки ввода-вывода в пользовательском пространстве (например, fclose). _Exit и _Exit не вызываются и непосредственно передаются ядру для очистки. Следовательно, выход (0) эквивалентен возврату 0 в основной функции.
3) Обработчик завершения Atexit:
ISO C предусматривает, что процесс может зарегистрировать до 32 функций обработки завершения, которые автоматически вызываются при выходе в обратном порядке регистрации. Если одна и та же функция зарегистрирована несколько раз, она будет вызываться несколько раз.
Прототип выглядит следующим образом:
#include int atexit(void (*func)(void));
Параметр является указателем на функцию, которая указывает на функцию обработки завершения, которая не имеет параметров и не возвращает значения. Функция atexit сама возвращает 0 после успешного вызова.
Возьмем следующую программу в качестве примера:
#include #include static void myexit1() printf(«first exit handlern»); > static void myexit2() printf(«second exit handlern»); > int main() atexit(my_exit2); atexit(my_exit1); atexit(my_exit1); printf(«main is donen»); return 0; >
$ ./a.out main is done first exit handler first exit handler second exit handler
Обратите внимание на приведенные выше результаты, вы можете обнаружить, что эти функции автоматически вызываются при выходе в обратном порядке регистрации (сначала myexit1, а затем myexit2). Если одна и та же функция зарегистрирована несколько раз, она будет вызываться несколько раз (например, myexit1 здесь). Эти функции обработки вызываются с помощью функции atexit при выходе из программы. Но если вы выйдете из программы с помощью _exit (), она не закроет файлы, не очистит буферы и не вызовет функции завершения!
Источник: russianblogs.com