Начнём с кода: Code #include <stdio.h> #include <iostream>
int cx=0, dx=0;
void getcol (char ch) { if (ch == char(10)) cx+=2; else if ((ch == char(9)) | (ch == char(32))) cx++; else dx++; }
void main (void) { char ch, name[50]; FILE *in; using namespace std; using std::endl; wcout.imbue (locale( ".866" )); wcout << L"Введите имя файла для просмотра: "; cin >> name; if ((in=fopen(name, "r")) == NULL) {wcout << L"Файл "; printf ("%s",name); wcout << L" не открыт." << endl;} else { while (!feof(in)) { ch=getc(in); if (!feof(in)) getcol (ch); putchar(ch); } } wcout << endl << L"Пустых символов - " << cx << endl << L"Непустых символов - " << dx << endl;
system ("pause"); } Данный код не совершенен, это факт. Читаемый файл должен быть сохранён в DOS'овской кодировке, если хотите увидеть кириллицу. Для определения "пустых" символов создана функция getcol() Code if ((in=fopen(name, "r")) == NULL) Здесь мы открываем файл на чтение и заодно проверяем его на существование. Code while (!feof(in)) { ch=getc(in); if (!feof(in)) getcol (ch); putchar(ch); } В этом куске мы видим цикл, который прекратит работу в случае достижения конца файла. В этом цикле читаем символы в первой строчке. Во второй мы видим странную конструкцию, ещё раз проверяем на конец файла и проверяем символ на эквивалентность к "пустому". Повторная проверка конца файла сделана потому, что цикл while по достижению конца файла сделает ещё одну итерацию. (поэтому можно рассмотреть реализацию цикла с помощью других функций do, for). В третей строке выводим символ на экран. Переменные cx и dx сделаны глобальными, чтобы особо не париться с ними в главной функции и в функции getcol();
|