Отправляет email-рассылки с помощью сервиса Sendsay

Инвестирование с нуля

  Все выпуски  

Программирование на Си и С++ с нуля: Работа с файлами


Школа программирования

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-программирование


В избранное