Шаг 17.
Microsoft Visual C++ 2010. Язык С/С++. Программы для работы с символьными данными. Программа копирования символьного файла (1-й вариант)

    На этом шаге мы рассмотрим работу такой программы.

    Напишем программу, в которой входной файл будет вводиться с клавиатуры (входное стандартное устройство - клавиатура), а выводиться на экран (выходное стандартное устройство - экран). Текст программы представлен ниже:

// Copy_1.cpp: главный файл проекта.

#include "stdafx.h"
#include <clocale> //обязательно для функции setlocale()

#include <conio.h>	// для getch()
#include <stdio.h>	// для getchar(), putchar(), printf()
#define eof -1	        // признак конца файла Ctrl+Z

using namespace System;

int main()
{
	setlocale(LC_ALL,"Russian"); //функция setlocale() с аргументами
                                     //для корректного вывода кириллицы
	int c;

	printf("Задайте строку>\n");
	c=getchar();
	while(c != eof)
	{
		putchar(c); 
		c=getchar();
	}
	_getch();  /*вводит символ, но без эхо-сопровождения 
			   (для организации задержки экрана) */

    return 0;
}
Архив проекта можно взять здесь.

    Переменная c, в которую вводится один символ, описана как int, а не как char. Почему? Дело в том, что в языке С типы char и int взаимозаменяемы (переменная с фактически содержит код символа, т. е. некоторое число).

    С другой стороны, чтобы определить момент наступления конца ввода с клавиатуры, мы должны сравнить содержимое переменной с с числом eof. Именно поэтому с объявлена как int.

    Функция printf() выводит на экран запрос на ввод. Далее вводится первое значение переменной с (как мы договаривались ранее, набираем на клавиатуре строку и нажимаем клавишу Enter, тогда getchar() начинает обработку по одному символу). Потом с помощью конструкции цикла while начинается циклическая обработка ввода/вывода символов. Пока условие в заголовочной части while истинно (т. е. пока мы не нажали комбинацию клавиш Ctrl+Z), выполняется тело цикла while - все операторы, находящиеся внутри фигурных скобок: putchar(c) выводит введенный символ на экран, c=getchar() вводит новый символ в качестве значения переменной с.

    После этого программа доходит до конца тела цикла while - закрывающей фигурной скобки - и снова возвращается в его заголовочную часть, где начинает проверять выполнение записанного там условия. Если условие истинно, т. е. введенный в качестве значения переменной с символ не соответствует Ctrl+Z, то снова выполняются операторы, находящиеся в теле цикла while.

    Как только мы нажмем комбинацию клавиш Ctrl+Z, в переменной с появится ее код - число -1. Поскольку условие выполнения цикла while нарушится (значение переменной с станет равно eof), то управление будет передано следующему после while оператору. Это будет функция _getch(), которая потребует ввода символа с клавиатуры. Пока мы не нажмем какую-либо клавишу, _getch() будет ждать ввода, а мы в это время будем рассматривать картинку на экране и гадать, что же у нас получилось. Если мы нажмем на любую клавишу, то наша программа завершится.

    Следует кое-что уточнить: независимо от того, вывели мы символ на экран или нет, он будет отображен на экране функцией getchar(). В таком случае говорят, что getchar() работает с эхо-сопровождением. Поэтому, когда сработает функция putchar(c), то может показаться, что она повторно выведет введенный символ. На самом деле это не так, двойник символа на экране строкой выше появится из-за излишней плодовитости getchar(). Функция же _getch() работает без эхо-сопровождения.

    Для закрепления материала желательно выполнить программу в режиме отладки, чтобы детально посмотреть, как все происходит на самом деле. Для этого щелкните мышью в поле подшивки слева от строки while (с ! = eof). В этом поле появится пометка в виде красного шарика. Это так называемая точка прерывания программы (в опции Debug (Отладка) главного меню среды вы ее обнаружите под названием Breakpoint (Точка останова)).


Рис.1. Точка останова

    Запуск программы на выполнение надо выполнить в режиме отладки: либо по нажатию клавиши F5, либо командами Debug (Отладка) | Start Debugging (Начать отладку).

    Введите, например, символы 123. Их коды по таблице ASCII: 49, 50, 51. После нажатия клавиши Enter программа остановится в точке прерывания (в красном кружочке появится желтая стрелка вправо - это сигнал о том, что произошел останов программы). Начинается цикл обработки введенной последовательности 1, 2, 3.

    Наведите мышь на переменную с. Тут же всплывет подсказка, показывающая значение этой переменной. Вы увидите, что первое значение переменной будет равно 49 - это код единицы, т. е. в обработку поступил первый введенный символ (запомните, что в переменных находятся коды, а не сами значения!).

    Чтобы выполнить следующий оператор, откройте опцию Debug (Отладка) главного меню и посмотрите, какую команду надо в ней выполнить. Это будет команда Step Over (Шаг с обходом) (или нажатие клавиши F10). При этой команде выполняется всегда целый оператор. Но в качестве оператора может выступать, как мы увидим далее, и некоторая функция (или подпрограмма), имя которой с параметрами указано в тексте программы (заголовок), после имени стоит точка с запятой.

    А вам хочется посмотреть по шагам, как выполняется функция. Чтобы в отладочном режиме попасть внутрь функции, надо после останова на ее имени выполнить опцию Шаг с заходом пункта меню Отладка или нажать клавишу F11. Таким образом, последовательно нажимая на клавишу F10, вы пошагово выполните всю программу, проследив, как и почему выполняются в определенной последовательности операторы программы. Именно так отлаживается любая программа.

    На рисунке 2 приведен результат работы нашей программы.


Рис.2. Результат работы программы

    На следующем шаге мы продолжим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг