Завершение программы C++
Функция, объявленная exit в , завершает программу C++. Значение, предоставленное в качестве аргумента exit , возвращается операционной системе в качестве возвращаемого кода программы или кода выхода. Принято, чтобы нулевым кодом возврата обозначалось, что программа завершена успешно. Константы EXIT_FAILURE можно использовать, а EXIT_SUCCESS также определенные в , чтобы указать успешность или сбой программы.
Функция abort
Функция abort , объявленная в стандартном формате, включает , завершает программу C++. Разница между exit и abort заключается в том, что exit обработка завершения среды выполнения C++ выполняется (вызывается глобальные деструкторы объектов). abort немедленно завершает программу. Функция abort проходит обычный процесс уничтожения для инициализированных глобальных статических объектов. Также осуществляется обход всей специальной обработки, которая была задана с помощью функции atexit .
Корпорация Майкрософт: по соображениям совместимости Windows реализация abort microsoft может разрешить выполнение кода завершения библиотеки DLL в определенных обстоятельствах. Дополнительные сведения см. в разделе abort .
Функция atexit
Используйте функцию atexit , чтобы указать действия, выполняемые до завершения программы. Перед выполнением функции выхода не инициализированы глобальные статические объекты, инициализированные перед вызовом atexit .
return оператор in main
Инструкция return позволяет указать возвращаемое значение из main . Оператор return в main первую очередь действует как любая другая return инструкция. Все автоматические переменные уничтожаются. main Затем вызывает возвращаемое exit значение в качестве параметра. Рассмотрим следующий пример:
// return_statement.cpp #include struct S < int value; >; int main() < S s< 3 >; exit( 3 ); // or return 3; >
return Операторы exit , описанные в предыдущем примере, имеют аналогичное поведение. Как завершить программу, так и вернуть значение 3 операционной системе. Разница заключается в том, что exit не уничтожает автоматическую переменную s , а return оператор делает.
Как правило, C++ требует, чтобы функции, имеющие возвращаемые типы, отличные от void возвращаемого значения. Функция является исключением. Она main может завершиться без инструкции return . В этом случае он возвращает значение, зависящее от реализации, в вызывающий процесс. (По умолчанию MSVC возвращает значение 0.)
Уничтожение потоков и статических объектов
При вызове exit напрямую (или при вызове после оператора из main ), объекты потоков, связанные с текущим потоком return , уничтожаются. Затем статические объекты уничтожаются в обратном порядке их инициализации (после вызовов функций, указанных в , если таковые имеются atexit ). В следующем примере показано выполнение такого процесса инициализации и удаления.
Пример
В следующем примере статические объекты sd1 создаются и sd2 инициализированы перед записью main . После завершения работы этой программы с помощью инструкции return сначала sd2 уничтожается, а затем sd1 . Деструктор класса ShowData закрывает файлы, связанные с этими статическими объектами.
// using_exit_or_return1.cpp #include class ShowData < public: // Constructor opens a file. ShowData( const char *szDev ) < errno_t err; err = fopen_s(&OutputDev, szDev, "w" ); >// Destructor closes the file. ~ShowData() < fclose( OutputDev ); >// Disp function shows a string on the output device. void Disp( char *szData ) < fputs( szData, OutputDev ); >private: FILE *OutputDev; >; // Define a static object of type ShowData. The output device // selected is "CON" -- the standard output device. ShowData sd1 = "CON"; // Define another static object of type ShowData. The output // is directed to a file called "HELLO.DAT" ShowData sd2 = "hello.dat"; int main()
Другой способ написания этого кода заключается в объявлении ShowData объектов с блоком область, который неявно уничтожает их при выходе из область:
Перенаправление ввода/вывода в Linux
Разбираемся, зачем нужно перенаправление потоков и как оно позволяет лучше работать с bash-скриптами.
Эта инструкция — часть курса «Linux: горячие клавиши и команды».
Смотреть весь курс
Введение
Стандартные потоки ввода и вывода в Linux являются одним из наиболее распространенных средств для обмена информацией процессов, а перенаправление >, >> и | является одной из самых популярных конструкций командного интерпретатора.
В данной статье мы ознакомимся с возможностями перенаправления потоков ввода/вывода, используемых при работе файлами и командами.
Требования
- Linux-система, например, Ubuntu 20.04
Потоки
Стандартный ввод при работе пользователя в терминале передается через клавиатуру.
Стандартный вывод и стандартная ошибка отображаются на дисплее терминала пользователя в виде текста.
Ввод и вывод распределяется между тремя стандартными потоками:
- stdin — стандартный ввод (клавиатура),
- stdout — стандартный вывод (экран),
- stderr — стандартная ошибка (вывод ошибок на экран).
Потоки также пронумерованы:
- stdin — 0,
- stdout — 1,
- stderr — 2.
Из стандартного ввода команда может только считывать данные, а два других потока могут использоваться только для записи. Данные выводятся на экран и считываются с клавиатуры, так как стандартные потоки по умолчанию ассоциированы с терминалом пользователя. Потоки можно подключать к чему угодно: к файлам, программам и даже устройствам. В командном интерпретаторе bash такая операция называется перенаправлением:
- < file— использовать файл как источник данных для стандартного потока ввода.
- > file — направить стандартный поток вывода в файл. Если файл не существует, он будет создан, если существует — перезаписан сверху.
- 2> file — направить стандартный поток ошибок в файл. Если файл не существует, он будет создан, если существует — перезаписан сверху.
- >>file — направить стандартный поток вывода в файл. Если файл не существует, он будет создан, если существует — данные будут дописаны к нему в конец.
- 2>>file — направить стандартный поток ошибок в файл. Если файл не существует, он будет создан, если существует — данные будут дописаны к нему в конец.
- &>file или >&file — направить стандартный поток вывода и стандартный поток ошибок в файл. Другая форма записи: >file 2>&1.
Стандартный ввод
Стандартный входной поток обычно переносит данные от пользователя к программе. Программы, которые предполагают стандартный ввод, обычно получают входные данные от устройства типа клавиатура. Стандартный ввод прекращается по достижении EOF (конец файла), который указывает на то, что данных для чтения больше нет.
EOF вводится нажатием сочетания клавиш Ctrl+D.
Рассмотрим работу со стандартным выводом на примере команды cat (от CONCATENATE, в переводе «связать» или «объединить что-то»).
Cat обычно используется для объединения содержимого двух файлов.
Cat отправляет полученные входные данные на дисплей терминала в качестве стандартного вывода и останавливается после того как получает EOF.
Пример
В открывшейся строке введите, например, 1 и нажмите клавишу Enter. На дисплей выводится 1. Введите a и нажмите клавишу Enter. На дисплей выводится a.
Дисплей терминала выглядит следующим образом:
test@111:~/stream$ cat 1 1 a a
Для завершения ввода данных следует нажать сочетание клавиш Ctrl + D.
Стандартный вывод
Стандартный вывод записывает данные, сгенерированные программой. Когда стандартный выходной поток не перенаправляется в какой-либо файл, он выводит текст на дисплей терминала.
При использовании без каких-либо дополнительных опций, команда echo выводит на экран любой аргумент, который передается ему в командной строке:
echo Пример
Аргументом является то, что получено программой, в результате на дисплей терминала будет выведено:
Пример
При выполнении echo без каких-либо аргументов, возвращается пустая строка.
Пример
Команда объединяет три файла: file1, file2 и file3 в один файл bigfile:
cat file1 file1 file1 > bigfile
Команда cat по очереди выводит содержимое файлов, перечисленных в качестве параметров на стандартный поток вывода. Стандартный поток вывода перенаправлен в файл bigfile.
Стандартная ошибка
Стандартная ошибка записывает ошибки, возникающие в ходе исполнения программы. Как и в случае стандартного вывода, по умолчанию этот поток выводится на терминал дисплея.
Пример
Рассмотрим пример стандартной ошибки с помощью команды ls, которая выводит список содержимого каталогов.
При запуске без аргументов ls выводит содержимое в пределах текущего каталога.
Введем команду ls с каталогом % в качестве аргумента:
В результате должно выводиться содержимое соответствующей папки. Но так как каталога % не существует, на дисплей терминала будет выведен следующий текст стандартной ошибки:
ls: cannot access %: No such file or directory
Перенаправление потока
Linux включает в себя команды перенаправления для каждого потока.
Пример
В приведенном примере команда cat используется для записи в файл file1, который создается в результате цикла:
cat > file1 a b c
Для завершения цикла нажмите сочетание клавиш Ctrl + D.
Если файла file1 не существует, то в текущем каталоге создается новый файл с таким именем.
Для просмотра содержимого файла file1 введите команду:
cat file1
В результате на дисплей терминала должно быть выведено следующее:
a b c
Для перезаписи содержимого файла введите следующее:
cat > file1 1 2 3
Для завершения цикла нажмите сочетание клавиш Ctrl + D.
В результате на дисплей терминала должно быть выведено следующее:
1 2 3
Предыдущего текста в текущем файле больше не существует, так как содержимое файла было переписано командой >.
Для добавления нового текста к уже существующему в файле с помощью двойных скобок >> выполните команду:
cat >> file1 a b c
Для завершения цикла нажмите сочетание клавиш Ctrl + D.
Откройте file1 снова и в результате на дисплее монитора должно быть отражено следующее:
1 2 3 a b c
Каналы
Каналы используются для перенаправления потока из одной программы в другую. Стандартный вывод данных после выполнения одной команды перенаправляется в другую через канал. Данные первой программы, которые получает вторая программа, не будут отображаться. На дисплей терминала будут выведены только отфильтрованные данные, возвращаемые второй командой.
Пример
ls | less
В результате каждый файл текущего каталога будет размещен на новой строке:
file1 file2 t1 t2
Перенаправлять данные с помощью каналов можно как из одной команды в другую, так и из одного файла к другому, а перенаправление с помощью > и >> возможно только для перенаправления данных в файлах.
Пример
Для сохранения имен файлов, содержащих строку «LOG», используется следующая команда:
dir /catalog | find "LOG" > loglist
Вывод команды dir отсылается в команду-фильтр find. Имена файлов, содержащие строку «LOG», хранятся в файле loglist в виде списка (например, Config.log, Logdat.svd и Mylog.bat).
При использовании нескольких фильтров в одной команде рекомендуется разделять их с помощью знака канала |.
Фильтры
Фильтры представляют собой стандартные команды Linux, которые могут быть использованы без каналов:
- find — возвращает файлы с именами, которые соответствуют передаваемому аргументу.
- grep — возвращает только строки, содержащие (или не содержащие) заданное регулярное выражение.
- tee — перенаправляет стандартный ввод как стандартный вывод и один или несколько файлов.
- tr — находит и заменяет одну строку другой.
- wc — подсчитывает символы, линии и слова.
Как правило, все нижеприведенные команды работают как фильтры, если у них нет аргументов (опции могут быть):
- cat — считывает данные со стандартного потока ввода и передает их на стандартный поток вывода. Без опций работает как простой повторитель. С опциями может фильтровать пустые строки, нумеровать строки и делать другую подобную работу.
- head — показывает первые 10 строк (или другое заданное количество), считанных со стандартного потока ввода.
- tail — показывает последние 10 строк (или другое заданное количество), считанные со стандартного потока ввода. Важный частный случай tail -f, который в режиме слежения показывает концовку файла. Это используется, в частности, для просмотра файлов журнальных сообщений.
- cut — вырезает столбец (по символам или полям) из потока ввода и передает на поток вывода. В качестве разделителей полей могут использоваться любые символы.
- sort — сортирует данные в соответствии с какими-либо критериями, например, арифметически по второму столбцу.
- uniq — удаляет повторяющиеся строки. Или (с ключом -с) не просто удалить, а написать сколько таких строк было. Учитываются только подряд идущие одинаковые строки, поэтому часто данные сортируются перед тем как отправить их на вход программе.
- bc — вычисляет каждую отдельную строку потока и записывает вместо нее результат вычисления.
- hexdump — показывает шестнадцатеричное представление данных, поступающих на стандартный поток ввода.
- strings — выделяет и показывает в стандартном потоке (или файле) то, что напоминает строки. Всё что не похоже на строковые последовательности, игнорируется. Команда полезна в сочетании с grep для поиска интересующих строковых последовательностей в бинарных файлах.
- sed — обрабатывает текст в соответствии с заданным скриптом. Наиболее часто используется для замены текста в потоке: sed s/было/стало/g.
- awk — обрабатывает текст в соответствии с заданным скриптом. Как правило, используется для обработки текстовых таблиц, например, вывод ps aux и т.д.
- sh -s — текст, который передается на стандартный поток ввода sh -s. может интерпретироваться как последовательность команд shell. На выход передается результат их исполнения.
- ssh — средство удаленного доступа ssh, может работать как фильтр, который подхватывает данные, переданные ему на стандартный поток ввода, затем передает их на удаленный хост и подает на вход процессу программы, имя которой было передано ему в качестве аргумента. Результат выполнения программы (то есть то, что она выдала на стандартный поток вывода) передается со стандартного вывода ssh.
Если в качестве аргумента передается файл, команда-фильтр считывает данные из этого файла, а не со стандартного потока ввода (есть исключения, например, команда tr, обрабатывающая данные, поступающие исключительно через стандартный поток ввода).
Пример
Команда tee, как правило, используется для просмотра выводимого содержимого при одновременном сохранении его в файл.
wc ~/stream | tee file2
Пример
Допускается перенаправление нескольких потоков в один файл:
ls -z >> file3 2>&1
В результате сообщение о неверной опции «z» в команде ls будет записано в файл t2, поскольку stderr перенаправлен в файл.
Для просмотра содержимого файла file3 введите команду cat:
cat file3
В результате на дисплее терминала отобразиться следующее:
ls: invalid option -- 'z' Try 'ls --help' for more information.
Заключение
Мы рассмотрели возможности работы с перенаправлениями потоков >, >> и |, использование которых позволяет лучше работать с bash-скриптами.
Работа с файлами и каталогами в Linux
Как остановить ввод в c
Здравствуйте! Ребят, выручайте, помогите проверить мое решение контрольной работы по программированию, код есть, не могу просто остановить последовательность, вот код первой задачи:
#include int main() < int posl; //элемент последовательности int count_otr=0; int count_pol=0;//счетчик do < scanf("%d",&posl); //если кратно 5, то увелич.счетчик if poslwhile (//как остановить ввод?); if count_pol==count_otr printf("ODINAKOVO"); if count_pol>count_otr printf("POLOJIT BOLSHE, VSEGO: %d ",count_pol); else printf("OTRIC Bolshe, VSEGO: %d ",count_otr); return 0; >
Задача 2, вроде правильно, но не уверен
#include int main() < const int n=150; int a[n]; // int a[n],b[n], так можно писать? int b[n]; int j=1; for (int i=0,ifor (int i=0,i return 0 >
Помогите, пожалуйста, задача на скрине, заранее спасибо!
з.ы. Сорь если раздел не тот, возможно надо было обратиться в «помощь студентам», так что не судите строго
Изображения
| eYsuzkKkaGg.jpg (45.0 Кб, 174 просмотров) |
from dark to light)
Последний раз редактировалось Алексей_2012; 31.10.2014 в 23:25 .
| Алексей_2012 |
| Посмотреть профиль |
| Найти ещё сообщения от Алексей_2012 |
Регистрация: 12.01.2011
Сообщений: 19,500
| Задача 2, вроде правильно, но не уверен |
Что-то странный код.
По-моему там речь о
a[i] = a[i] + b[i];
Ну и для b * вместо +.
Только видимо нужно еще в другой массив сначала скопировать перед вычислением первого (сумма), иначе на втором (произведение) А уже измененный будет.
И про форматирование кода слышал? Хотя бы CTRL+A, CTRL+K, CTRL+F для отступов если Visual Studio.
А то придет min@y со своим бонусом http://programmersforum.ru/showpost. 02&postcount=6
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,254
int neg = 0, pos = 0, a; while (scanf("%d", &a) == 1) < pos += (a >0 && a % 5 == 0); neg += (a
И в if’ах условия нужно писать в скобках.
for (int i = 0; i
for (int i = 0; i
Пишите язык программирования — это форум программистов , а не экстрасенсов. (<= это подпись )
Последний раз редактировалось BDA; 31.10.2014 в 23:49 .
Участник клуба
Регистрация: 20.03.2012
Сообщений: 1,849
Ребят, спасибо, у нас все через QT пишется, скачал торрент, но там почему-то только с++ поддерживается, поэтому пишу на листочках :D, на скрине все что в QT, нужно создать консольное С приложение, так что опробовать код смогу только в лабораторке
поясните это, пожалуйста, я решил использовать цикл с постусловием, чтоб ввод данных осуществлялся хотя бы один раз, и, как я понял, последовательность прекращает ввод при условии если ввели А (просто мы так никогда не писали и данный код мне не очень понятен)
int neg = 0, pos = 0, a; while (scanf("%d", &a) == 1) < pos += (a >0 && a % 5 == 0); // если а больше 0 и кратно 5 neg += (a < 0 && a % 5 == 0); // если а меньше 0 и кратно 5. )) >
a[i] = a[i] + b[i];
да, спасибо, а у меня в А массиве получилось бы просто что каждое число на единицу увеличивалось бы, потом на следующем этапе на двойку и т.п., в общем спасибо что поправили, а скомпилировать и проверить не дано , пока 😀
Изображения
| Безымянный.jpg (18.8 Кб, 119 просмотров) |
from dark to light)
Последний раз редактировалось Алексей_2012; 01.11.2014 в 00:07 .
| Алексей_2012 |
| Посмотреть профиль |
| Найти ещё сообщения от Алексей_2012 |
Регистрация: 12.01.2011
Сообщений: 19,500

Последний раз редактировалось Alex11223; 01.11.2014 в 00:09 .
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,254
while (scanf(«%d», &a) == 1) — scanf возвращает количество успешно считанных полей. Считывание происходит, пока не закончится входной поток. Чтобы закончить ввод, нужно, скорее всего, нажать Ctrl+Z и Enter (чтобы программа начала считывать данные).
Пишите язык программирования — это форум программистов , а не экстрасенсов. (<= это подпись ) Участник клуба Регистрация: 20.03.2012 Сообщений: 1,849
Ребят, почему-то не запускается консольное приложение, хотя сборка сборка проходит нормально, вот что пишется:
»
00:45:29: Выполняются этапы для проекта untitled.
00:45:29: Запускается: «C:\Qt\5.3\mingw482_32\bin\qmake.ex e» C:\Users\Алексей\untitled\untitled. pro -r -spec win32-g++ «CONFIG+=debug»
Cannot find file: C:\Users\Алексей\untitled\untitled. pro.
00:45:29: Процесс «C:\Qt\5.3\mingw482_32\bin\qmake.ex e» завершился с кодом 2.
Ошибка при сборке/установке проекта untitled (комплект: Desktop Qt 5.3 MinGW 32bit)
Во время выполнения этапа «qmake»
00:45:29: Прошло времени: 00:00.»
с делфи проще было 😀
Изображения
| Безымянный.jpg (24.5 Кб, 118 просмотров) |
C++ Как закончить ввод данных в цикле? Если ctrl + z не работает!
на Ctrl + c завершается программа полностью, а с ctrl + z должен завершаться ввод (как сказал мне учитель). Можно как-то это сделать по другому?
а разве завершать ввод должен не Enter?
Остальные ответы
while (true)
int x;
cin >> x;
if (cin.eof())
break;
cout lmao kill meУченик (105) 5 лет назад
что значит (cin.eof())?
Дед Мазай Гений (58121) http://www.cplusplus.com/reference/ios/ios/eof/ Проверка на конец файла
Привет!
С Наступающим Новым Годом!
Лови код. Если есть вопросы — задавай.
using namespace std;
int main()
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
system(«color 0A»);
system(«pause»);
return 0;
>
Похожие вопросы
Ваш браузер устарел
Мы постоянно добавляем новый функционал в основной интерфейс проекта. К сожалению, старые браузеры не в состоянии качественно работать с современными программными продуктами. Для корректной работы используйте последние версии браузеров Chrome, Mozilla Firefox, Opera, Microsoft Edge или установите браузер Atom.