Нижегородский государственный университет им. Н.И.Лобачевского
Опубликован: 25.11.2008 | Доступ: свободный | Студентов: 9592 / 1296 | Оценка: 4.06 / 3.66 | Длительность: 21:16:00
Лекция 11:

Работа с файлами

< Лекция 10 || Лекция 11: 1234 || Лекция 12 >

10.2. Форматные преобразования в оперативной памяти

Библиотека языков C, C++ включает две функции sprintf и sscanf, с помощью которых реализуются прямые и обратные форматные преобразования данных в оперативной памяти. Техника их использования ничем не отличается от уже рассмотренных функций printf/fprintf и scanf/fscanf. Разница только в том, что первым аргументом новых функций является указатель на строку – массив типа char, расположенный в оперативной памяти. Для функции sscanf эта строка является источником данных, а для функции sprintf в эту строку помещаются результаты преобразования данных из машинного представления:

sscanf(str,"список_форматов", список_ввода);
  sprintf(str,"список_форматов \n",список_вывода);

К форматным преобразованиям в оперативной памяти можно прибегнуть и при работе с двоичным файлом. Перед записью в файл с помощью функции sprintf машинные форматы данных преобразуются в символьную строку, которая потом записывается в двоичный файл. По сути дела, такое же преобразование происходит при записи данных в текстовый файл.

10.3. Файловые процедуры в системе BCB

Визуальная среда программирования BCB поддерживает все описанные выше функции работы с файлами и предлагает дополнительный набор средств ориентированных на возможности операционной системы Windows. Главные отличия новых процедур заключаются в двух моментах. Во-первых, вместо указателя на блок управления файлом здесь используется условный целочисленный номер (мы будем обозначать его через fHandle ), который операционная система присваивает каждому открываемому файлу (термин handle на американском сленге звучит как кликуха, кличка ). Во-вторых, почти все строковые константы, используемые в качестве параметров процедур, имеют тип AnsiString. Это новый тип (класс) строковых данных, упрощающий манипуляции над строками. Чаще всего в рассматриваемых ниже процедурах фигурирует строка с именем файла – FileName (на самом деле, в его качестве может выступать и полная спецификация файла).

10.3.1. Проверка существования файла

В некоторых ситуациях перед созданием нового файла или перед открытием существующего файла бывает полезно удостовериться в том, что файл с таким именем уже существует. В одном случае так можно предотвратить ошибочное уничтожение данных в существующем файле, который мы пытаемся открыть для записи. В другом случае так можно удостовериться в том, что файл, из которого мы собираемся читать исходные данные, действительно существует.

Для такого рода проверки используется функция FileExists:

if(FileExists(FileName))...	//если файл существует

Под управлением MS-DOS аналогичную роль выполняла функция access:

k=access(имя_файла,0);		//k=0,если файл существует

10.3.2. Создание нового файла

Для создания нового файла и его одновременного открытия используется функция FileCreate:

int fHandle = FileCreate(FileName);

Если возвращаемое значение положительно, то работа по созданию файла завершена успешно. В случае ошибки возвращаемое значение равно –1.

10.3.3. Открытие существующего файла

Для открытия существующего файла используется функция FileOpen:

int fHandle = FileOpen(FileName, Mode);

Здесь Mode – целочисленная константа, определяющая режим работы файла. Список мнемонических констант, предусмотренных в системе BCB, приведен в таблице 10.1.

Таблица 10.1.
Константа Режим
fmOpenRead Файл открывается только для чтения
fmOpenWrite Файл открывается только для записи
fmOpenReadWrite Файл открывается и для записи, и для чтения
fmShareExclusive Файл только для личного использования
fmShareDenyWrite Файл доступен другим приложениям для чтения
fmShareDenyRead Файл доступен другим приложениям для записи
fmShareDenyNone Файл доступен всем и для чтения, и для записи

Если значение, возвращаемое функцией равно -1, то открытие не состоялось.

10.3.4. Чтение из открытого файла

Для чтения двоичных данных из открытого файла используется функция FileRead:

int k = FileRead(fHandle, buf, count);

Здесь

  • buf – указатель типа void* на начало буфера, в который читаются данные;
  • count – количество запрашиваемых байтов;
  • k – количество реально прочитанных байтов.

10.3.5. Запись в открытый файл

Для записи двоичных данных в открытый файл используется функция FileWrite:

k = FileWrite(fHandle, buf, count);

Здесь

  • buf – указатель типа void* на начало буфера, из которого пишутся данные;
  • count – количество байтов, подлежащих записи;
  • k – количество реально записанных байтов.

Если k=-1, то произошла какая-то ошибка.

10.3.6. Перемещение указателя файла

Указатель файла перемещают в нужную позицию для организации прямого доступа к нужным данным. Для этой цели используется функция FileSeek:

int k = FileSeek(fHandle, delta, pos);

Здесь

  • delta – смещение в байтах, на которое нужно переместить указатель файла;
  • pos – точка отсчета, относительно которой производится смещение (0 – от начала файла, 1 – от текущей позиции, 2 – от конца файла);
  • k – новая текущая позиция.

Для определения длины файла можно воспользоваться обращением:

fLength = FileSeek(fHandle,0,2);

Под управлением MS-DOS перемещение указателя в двоичном файле выполняла функция fseek:

fseek(f1,delta,pos);	//f1 – указатель типа FILE

10.3.7. Закрытие файла

Для закрытия файла используется функция FileClose:

FileClose(fHandle);

10.3.8. Расчленение полной спецификации файла

Описываемые ниже функции позволяют выделить из полной спецификации файла имя диска, имя каталога, имя файла, расширение файла и путь к файлу. Все они возвращают значение строки типа AnsiString:

s=ExtractFileDrive(FileName);	//имя диска
  s=ExtractFileDir(FileName);	//имя каталога
  s=ExtractFileName(FileName);	//имя файла
  s=ExtractFileExt(FileName);	//расширение имени файла
  s=ExtractFilePath(FileName);	//путь к файлу

Аналогичные операции под управлением MS-DOS выполнялись единственной функцией fnsplit, которая из полной спецификации файла (первый аргумент функции) выделяла все составляющие компоненты:

fnsplit(const char *path,char *drive,char *dir,char *name,char *ext);

10.3.9. Удаление файлов и пустых каталогов

Функции удаления возвращают логическое значение true, если удаление состоялось, и false в случае отказа от операции (например, нельзя удалять не пустые каталоги, файлы с атрибутом Read-Only или несуществующие файлы).

bv = DeleteFile(FileName);
  bv = RemoveDir(DirName);

Под управлением MS-DOS для удаления файла можно было воспользоваться функцией unlink:

k=unlink(const char *filename);    //k=0, если файл удален

10.3.10. Создание каталога

Новый каталог создается с помощью функции CreateDir:

bv = CreateDir(DirName);

Если каталог создан, то возвращаемое значение равно true.

10.3.11. Переименование файла

Для замены имени файла используется функция RenameFile:

bv = FileRename(OldName,NewName);

Если переименование состоялось, то возвращаемое значение равно true.

10.3.12. Изменение расширения

Новое расширение ( Extension ) заменяет прежнее расширение в имени файла, если обратиться к функции ChangeExt:

as = ChangeFileExt(FileName, Extension);

При этом прежний файл и его содержимое сохраняется со своим старым именем. Создается новое имя файла ( as ), имеющее новое расширение.

Точно такой же функции в системе MS-DOS нет, но там можно было бы разложить спецификацию файла на составляющие (функция fnsplit ) и заново собрать компоненты, подменив расширение файла (функция fnmerge ).

10.3.13. Опрос атрибутов файла

Функция FileGetAttr позволяет узнать атрибуты файла, которые выдаются как двоичные разряды в возвращаемом значении:

int k = FileGetAttr(FileName);

В таблице 10.2 приведены значения отдельных флажков.

Таблица 10.2.
Флажок Значение Пояснение
faReadOnly 0x01 признак "Только для чтения"
faHidden 0x02 скрытый файл
faSysFile 0x04 системный файл
faVolumeId 0x08 признак "Идентификатор тома"
faDirectory 0x10 признак "Каталог"
faArchive 0x20 архивируемый файл
faAnyFile 0x3F суммарный набор признаков

Для проверки того или иного признака можно воспользоваться указанными константами:

if(k & faHidden)...     //если файл скрытый

10.3.14. Установка атрибутов файла

Для установки новых атрибутов используется функция FileSetAttr:

k = FileSetAttr(FileName,Attr);

Второй аргумент задается как логическая сумма флажков, приведенных в табл. 10.2:

Attr = faReadOnly | faSysFile;

10.3.15. Опрос и изменение текущего каталога

Текущий каталог – это каталог, из которого запущена программа. Если файлы используемые программой находятся в текущем каталоге, то во всех файловых процедурах можно указывать только короткое имя файла. Если файл находится в другом каталоге, то приходится задавать полную спецификацию файла. Для сокращения можно изменить имя текущего каталога, чтобы избежать задания полных путей. Система BCB предлагает две функции, с помощью которых можно узнать или изменить имя текущего каталога:

as = GetCurrentDir();         //опрос имени текущего каталога
  vb = SetCurrentDir(NameDir);  //смена текущего каталога
< Лекция 10 || Лекция 11: 1234 || Лекция 12 >
Alexey Ku
Alexey Ku

Попробуйте часть кода до слова main заменить на 

#include "stdafx.h" //1

#include <iostream> //2
#include <conio.h>

using namespace std; //3

Александр Талеев
Александр Талеев

#include <iostream.h>
#include <conio.h>
int main(void)
{
int a,b,max;
cout << "a=5";
cin >> a;
cout <<"b=3";
cin >> b;
if(a>b) max=a;
else max=b;
cout <<" max="<<max;
getch();
return 0;
}

при запуске в visual express выдает ошибки 

Ошибка    1    error C1083: Не удается открыть файл включение: iostream.h: No such file or directory    c:\users\саня\documents\visual studio 2012\projects\проект3\проект3\исходный код.cpp    1    1    Проект3

    2    IntelliSense: не удается открыть источник файл "iostream.h"    c:\Users\Саня\Documents\Visual Studio 2012\Projects\Проект3\Проект3\Исходный код.cpp    1    1    Проект3

    3    IntelliSense: идентификатор "cout" не определен    c:\Users\Саня\Documents\Visual Studio 2012\Projects\Проект3\Проект3\Исходный код.cpp    6    1    Проект3

    4    IntelliSense: идентификатор "cin" не определен    c:\Users\Саня\Documents\Visual Studio 2012\Projects\Проект3\Проект3\Исходный код.cpp    7    1    Проект3

при создании файла я выбрал пустой проект. Может нужно было выбрать консольное приложение?