Школа
программирования 180)
Программирование на Си и С++: Работа с файлами Мы изучили основные принципы программирования, это конечно
азы, но зная эти азы, дальше уже можно совершенствоваться самостоятельно --
просто писать как можно больше кода, это чистая практика. Но к рассылке присоединяются новые читатели, поэтому
напоминаю -- если вы не умеете программировать на Си и С++, и хотите этому
научиться, то пишете мне письмо и получаете задания. Делаете их, после чего мы
совместно разбираем, что получилось, что нет, и двигаемся дальше. В принципе, в
архиве рассылки уже есть все, что надо для самостоятельного изучения, но
многим, почему-то :) , нужен живой тьютор, поэтому схема с письмами продолжает
функционировать. В письме указываете, как вас зовут (на письма без подписи, с
никами или кличками, принципиально не отвечаю), и не забываете здороваться:)
Одна принципиально важная вещь, которая пока
осталась непройденной -- это работа с файлами. Программа, которая не сохраняет
результаты своей работы, очевидно, не очень-то и нужна. Мы научимся создавать
файлы, записывать в них информацию, и затем считывать ее обратно в программу.
Работа с файлами складывается из трех шагов. 1. Файл открывается. Это означает, что программа
"захватывает" заданный по имени файл, сообщает Windows, что далее она
будет с ним работать. Данный шаг нужен, чтобы не возникало конфликтов, когда
несколько программ одновременно хотят записывать информацию в один и тот же
файл. Правда, считывать данные из файла, очевидно, допустимо одновременно
множеством программ, поэтому в операции открытия файла обычно уточняется, что
файл открывается "на чтение" (считывание информации, которая не
меняется) либо "на запись" (данные в файле модифицируются).
Операция открытия файла возвращает некий идентификатор (как правило, целое
число), которое идентифицирует в программе в дальнейшем нужный открытый файл.
Этот идентификатор запоминается в переменной; обычно такая переменная
называется файловой переменной. 2. Ведется работа с
файлом. Из него данные либо считываются, либо в него записываются. 3. Файл закрывается. После этой операции он снова доступен
другим программам для обработки. Стандартные
операции работы с файлами, существующие практически во всех реализациях Си,
хранятся в библиотеке stdio.h. Функция открытия файла называется fopen(). Она
возвращает указатель на объект стандартного (определенного в данной библиотеке)
типа FILE. Параметров у функции fopen() два. Первый -- это путь к файлу
(строка), второй -- параметры открытия файла.
Допустим, мы хотим создать в текущем каталоге проекта новый текстовый файл и
записать в него два числа и строку. Пусть этот файл будет называться test.txt.
Параметр открытия файла на запись в текстовом виде записывается строкой
"wt". Буква w означает write (писать), буква t -- text (текст). Если
такой файл в каталоге существует, он перезаписывается (все старое содержимое в
нем уничтожается), если он не существует, то создается исходно пустым. Тогда команда открытия (создания пустого) файла запишется
так: FILE
* fo; fo = fopen("test.txt","wt");
Можно задать и полный путь к файлу,
например:
fo = fopen("c:\\\\tmp\\\\test.txt","wt");
Не забываем, что одиночный символ \\ внутри
строки Си задается двумя наклонными слэшами \\\\. Это частая ошибка. После открытия файла в файловую переменную fo занесется
некоторое число. Если таким числом будет ноль, считается, что файл открыть не
удалось. В Си нередки записи вида if(
(fo=fopen("c:\\\\tmp\\\\test.txt","wt")) == 0 ) {
// ошибка! }
где одновременно открывается файл и проверяется, успешно ли
это сделано. Закрывается файл с помощью функции
fclose(): fclose(fo); После закрытия файла к файловой переменной
обращаться уже нельзя. Запись текстовой строки в
файл выполняет функция fprintf(): fprintf( имя-файловой-переменной,
формат, список-переменных-для-вывода ); Формат - это
текстовая строка, задающая формат записываемого в файл текста. Все, что
содержится в этой строке, пишется в файл один-в-один: fprintf( fo,
"Привет!" );
В этом случае в
файл запишется строка "Привет!", а так как никаких значений
переменных в данном случае мы не выводим, то и список выводимых переменных
отсутствует. Чтобы вывести значение некоторой
переменной, надо использовать элемент формата, который начинается с символа % .
Так, формат %d задает вывод целочисленного значения, формат %s - вывод
строки. Например: int n = 10; char
str[20] = "значение переменной n равно ";
fprintf( fo, "Вывод: %s %d", str, n );
В файл запишется строка ""Вывод: значение
переменной n равно 10". Вместо формата %s подставлено значение переменной
str, а вместо формата %d - значение переменной n. Для
вывода дробных чисел используют формат %f, где перед f ставят число всех
выводимых символов и число символов после запятой, разделенные точкой.
Например: "%5.2f" означает вывод числа из пяти позиций, причем две из
них будут отведены для дробного значения. Если оно не уместится в этих
позициях, то вылезет за границу, а если займет меньше, то дополнится пробелами
(хотя в разных реализациях может быть по разному).
Следующая программка записывает в файл 100 строк с числами. Результирующий файл
будет текстовым, его можно открыть и просмотреть, например, в Блокноте. FILE * fo; fo = fopen("test.txt","wt");
int i; for( i=0; i<100;
i++ ) { fprintf( fo, "%d\\n", i );
} fclose(fo);
Комбинация символов "\\n" в конце строки формата
означает перевод на новую строку в выводимых текстовых данных. Для ввода данных (текстовой строки) используют функцию
fscanf(). Она напоминает fprintf(): fscanf(
файловая-переменная, формат-ввода, список-адресов-переменных ) При вводе список адресов переменных отличается от списка
имен переменных. Если в Си указывается имя переменной, то подразумевается
значение этой переменной. Но при вводе нужно не значение, а местонахождение
области в памяти, отведенной для заданной переменной - чтобы в эту область
поместить новое значение, считанное из файла.
Операция &, примененная к имени переменной, возвращает адрес этой
переменной в памяти. Тогда операцию ввода числа из текстового файла fi в
целочисленную переменную n можно записать так:
fscanf( fi, "%d", &n ); Формат
записывается также, как и в случае с fprintf, а вот перед именем переменной n
дополнительно указывается операция получения адреса &. Полезная функция feof(файловая-переменная) возвращает 1
(истинное значение), если файл, открытый для считывания, закончился. Она
возвращает 0, если из файла еще можно продолжать ввод. Программа считывания из файла всех строк с числами
запишется так:
FILE * fi; fi =
fopen("test.txt","rt"); // rt означает открытие текстового
файла на чтение int n;
while( !feof(fi) ) {
fscanf( fi, "%d", &n ); }
fclose(fi);
(c) 2004-2007 Сергей Бобровский : bo собака
russianenterprisesolutions.com Школа программирования
с нуля Все предыдущие выпуски базового курса всегда тут: http://www.infiltration.ru/p/ Неофициальный сайт поддержки (со срочными вопросами -
сюда): www.prog-begin.net.ru. Мои книги (учебные курсы) "Технологии Delphi /
C++ / C#".
http://shop.piter.com/publish/authors/17681/191180213/ Все эти учебные курсы рассчитаны не только на
разработчиков, но и на всех тех, кто хочет стать ИТ-менеджером. Для
этого как минимум нужно иметь общее представление о современных технологиях
разработки и их истории и владеть соответствующей терминологией. Именно это мои
книги и дают. В учебных курсах описаны десятки технологий, каждой из
которых посвящены отдельные книги. Таким образом, купив один учебный курс, вы
существенно сэкономите :) В книгах полностью описаны: - Delphi (версия
2006, полностью совместимая с Delphi 2005/2006/2007 и Turbo Delphi) для обеих
платформ - Win32 и .NET; - C# (новый язык Microsoft, на котором
базируется платформа .NET и все новые версии Windows); - C++ для
платформы Win32. Охвачены также темы работы с файлами на этих платформах,
создания файл-серверных, клиент-серверных, распределенных приложений,
веб-программ (Indy, ASP.NET, веб-сервисы). Описаны языки SQL и OCL. Немало глав
посвящены истории программирования и различных технологий. Особое внимание
уделено созданию программ с помощью технологии ECO и языка моделирования UML -
программы фактически рисуются, и теперь даже для создания корпоративных
приложений и их переноса в Интернет не обязательно знать программирование! Отдельная часть отведена технологиям организации групповой работы,
управления требованиями, контроля версий, локализации и тестирования. Тут
подробнее про книги. Мои книги, которые пока
доступны в продаже: Дизайн
рассылки: Алексей
Голубев - Web-дизайн и web-программирование
|