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

    На этом шаге мы рассмотрим особенности реализации такой программы.

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

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

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

using namespace System;

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

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

	nc=0;
	printf("Вводимые символы>\n");
	while(getchar()!= eof)
		nc++ ;
	
	printf("Введено символов: %ld\n",nc); 

	_getch();  /*вводит символ, но без эхо-сопровождения 
			   (для организации задержки экрана) */
    return 0;
}
Архив проекта можно взять здесь.

    Здесь мы встречаемся с новым типом данных: long - длинное целое. Этот тип (можно и long int) применяется для описания больших целых чисел со знаком. По занимаемой памяти этот тип переменных больше или равен типу int. Переменные типа long могут объявляться как signed long или unsigned long, signed long - это синоним long. Существует также тип данных long long. Переменная этого типа занимает память больше, чем unsigned long. Переменные типа long long могут быть со знаком или без знака. Соответственно они объявляются как signed long long и unsigned long long, signed long long - это синоним long long.

    Так как мы подсчитываем количество символов в файле, который (в общем случае) может быть и не "клавиатурным", то должны быть готовы к тому, что в нем будет много символов, и их число превысит допустимое значение, помещающееся в переменной типа int. Количество вводимых символов подсчитывается в переменной nc типа long по правилу: ввели один символ - значение nc увеличивается на единицу, ввели еще один - снова nc увеличивается на единицу и т. д. В начале каждого выполнения программы значение nc обнуляется.

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

    Новый оператор nc++ равносилен выражению nc=nc+1 (т. е. к значению nc добавляется единица). Кстати, можно в данном случае писать и ++nc: пока операция ++ не участвует в выражении типа int x=nc++ или int x=++nc, это не имеет никакого значения. В последних же случаях положение символов ++ существенно: если они находятся до nc, то сначала операция выполняется, а потом уже результат присваивается переменной x. Если находятся после nc, то сначала содержимое nc присваивается переменной x, а потом уже nc изменяется на единицу. Этой операции родственна операция --, которая ведет себя как и ++, но не прибавляет, а вычитает единицу.

    В функции printf() мы снова видим новый формат: %ld. По этому формату выводятся числа типа long.

    Результат работы программы приведен на рисунке 1.


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

    Заметим, что в подсчете символов участвует и символ комбинации клавиш + и символ, который вводится для _getch().

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




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