Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






  • Сервис онлайн-записи на собственном Telegram-боте
    Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое расписание, но и напоминать клиентам о визитах тоже. Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.
    Для новых пользователей первый месяц бесплатно.
    Чат-бот для мастеров и специалистов, который упрощает ведение записей:
    Сам записывает клиентов и напоминает им о визите;
    Персонализирует скидки, чаевые, кэшбэк и предоплаты;
    Увеличивает доходимость и помогает больше зарабатывать;
    Начать пользоваться сервисом
  • Функции работы с файлами






     

    Файлом в С++, с одной стороны, называется последовательность байт, ограниченная стандартной константой EOF – признаком конца файла, с другой стороны, файлом называют некоторое пространство (объём памяти) на жёстком диске или некотором носителе. Таким образом, работа с файлами (запись в файл информации, чтение данных из файла) невозможна без создания потоков.

    При работе с файлами создается указатель на поток байтов. Этот поток может быть направлен из ОП на жёсткий диск при записи информации в файл или в ОП с жесткого диска при чтении информации из файла. Кроме того, при чтении или записи информации в файл особое место занимает переменная, которая носит название «указатель файла». Указатель файла определяет позицию (номер байта) в файле, начиная с которой записывается или считывается некоторая порция информации. Следовательно, указатель файла – это адрес байта, который предназначен

    для текущей обработки.

    В языке С++ работают с потоками (файлами) двух видов: текстовыми и двоичными. Текстовый поток – последовательность символов. В данном разделе такие потоки рассматриваться не будут. Двоичный поток – это последовательность байтов, соответствующая байтам на внешнем устройстве. Далее рассматривается работа именно с такими потоками.

    Объявление указателя на поток, который может быть направлен на жесткий диск (файл) записывается в виде:

    FILE *< имя_указателя>;

    Слово FILE – стандартное имя структурного типа, описанного в головном файле stdio.h. В этой структуре содержится вся необходимая информация для работы с файлами (например, указатель файла и др.).

    Следующий этап – это открытие потока с помощью стандартной функции fopen(). Форма открытия потока:

    < имя_указателя_на_поток> =fopen(< имя_файла>, < режим_открытия_файла>);

    < имя_файла> – строковая величина следующего формата. " < имя>.< расширение> " определяет имя физического файла расположенного на диске. < имя> файла – полный путь к файлу с указанием имени диска и имён папок, в которых находится этот файл. Полный путь записывается в случае, если открываемый файл находится не в одной папке с исполняемой программой. Под строкой < расширение> понимается тип файла.

    < режим_открытия_файла> – строковая величина, определяющая режим работы с открытым файлом. Режимы открытия файлов даны в табл.11.

    Таблица 11
    Параметр Режим
       
    " r" Файл открывается только для чтения: Ø если файла с указанным именем не существует, то его открытие приведет к остановке программы; Ø если открываемый файл с указанным именем существует, то открывается для чтения
    " w" Файл открывается только для записи: Ø если файла с указанным именем не существует, то он создаётся в той же папке, что и исполняемая программа; Ø если открываемый файл с указанным именем уже существует, то вся информация из этого файла удаляется. В этот файл можно только записывать информацию
    " а" Файл открывается для добавления данных: Ø если файл с указанным именем существует, то данные будут записываться в конец файла; Ø если файла с указанным именем не существует, то он создаётся, и в него может только записываться информация
       
    Продолжение таблицы 11
       
    " r+" Файл открывается для чтения и записи. Информация записывается с того места, на которое ссылается указатель файла
    " w+" Файл создаётся для чтения и записи. Информация записывается с того места, на которое ссылается указатель файла
    " a+" Файл открывается для добавления данных и чтения

     

    Если файл не может быть открыт по какой-либо причине, то функция fopen() возвращает значение NULL.

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

    FILE*pf;

    if((pf=fopen(" my_file.dat", " r+”)) = = NULL)

    {

    printf(" файл не открыт\n"); return 1;

    }

    Если поток (файл) открыт удачно, то можно записывать или считывать информацию с жесткого диска (файла) с помощью функций fwrite() или fread(). Формат записи этих функций выглядит следующим образом.

    Функция чтения блока данных из файла:

    i=fread(< адрес_буфера>, < объем_данных_блока>, < число_читаемых_блоков>, < указатель на поток>);

    Здесь i – переменная типа int; i = 1, если было произведено чтение из файла; i = 0, если чтение из файла невозможно; < адрес_буфера> – адрес переменной-буфера в ОП, по которому записываются читаемые данные из файла; < объем_данных_блока> – объем в байтах читаемых в буфер данных из файла; < число_читаемых_блоков> – количество блоков, читаемых из файла. Размер каждого блока указывается в параметре < объем_данных_блока>. < указатель на поток> – указатель на файл.

    Функция записи в файл:

    i=fwrite(< адрес_буфера>, < объем_данных_блока>, < число_записываемых_блоков>, < указатель на поток>);

    Здесь i – переменная типа int; i = 1, если была произведена запись в файл; i = 0, если записи не было; < адрес_буфера> – адрес переменной-буфера в ОП, из которого считываются данные в файл; < объем_данных_блока> – объем в байтах записываемых данных в файл из буфера; < число_читаемых_блоков> – количество блоков, записываемых в файл. Размер каждого блока указывается в предыдущем параметре < объем_данных_блока>. < указатель на поток> – указатель на файл.

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

    i = fseek (< указатель_на_поток>, < смещение>, < стартовая_позиция>);

    Здесь i – переменная типа int; i = 1, если смещение произошло, i = 0, если, например, произошло смещение за пределы файла; < указатель на поток> – указатель на открытый поток; < смещение> (длинное целое) – значение, которое определяет, на сколько байт от стартовой позиции будет смещён указатель файла. Если < смещение> больше нуля, то смещение производится к концу файла, если меньше нуля, то смещение происходит к началу файла. Нужно учитывать то, что автоматически не определяется, был ли указатель перемещен за пределы файла.

    < стартовая_позиция> – одна из констант:

    SEEK_SET (или 0) – установка указателя файла на нулевой байт файла;

    SEEK_CUR (или 1) – определение текущей позиции указателя файла;

    SEEK_END (или 2) – установка указателя файла на последний байт файла.

    В конце работы необходимо закрыть открытый поток с помощью стандартной функции fclose(). Формат её записи:

    fclose(< имя_указателя_на_поток>);

    Функции работы с файлами описаны в головном файле stdio.h. Примеры обращения к некоторым из них приведены в табл12.

    Таблица 12
    Функция Форма обращения к функции
       
    fopen pf=fopen(" my_file.dat", " r+"); pf – указатель на поток; " my_file.dat" – имя файла; " r+" – файл открывается в режиме чтения/записи
    fgetc ch=fgetc(pf); pf – указатель на поток; считывает один символ в переменную ch (тип char) из файла pf. Если достигнут конец файла, то в ch записывается константа EOF
    fputc сh1=fputc(ch, pf); pf – указатель на поток; записывает один символ в файл pf из переменной ch (тип char). Если запись произошла, то в ch1 (тип char) возвращается записанный символ, в противном случае в ch1 записывается константа EOF
    getw i=getw(pf); pf – указатель на поток; считывает целое число в переменную i (тип int) из файла pf. Если достигнут конец файла, то в i записывается константа EOF
    putw i1=putw(i, pf); pf – указатель на поток; записывает целое число в файл pf из переменной i (тип int). Если запись произошла, то в i1 (тип int) возвращается записанное число, в противном случае в i1 записывается константа EOF
    fwrite i=fwrite(& buf, sizeof(block), num_block, pf); & buf – адрес буферной переменной; sizeof(block) – объем записываемых данных из переменой buf в файл; num_block – переменная типа int (число записываемых блоков); pf – указатель на файл
    Продолжение таблицы 12
       
    fread i=fread(& buf, sizeof(block), num_block, pf); & buf – адрес буферной переменной; sizeof(block) – объем читаемых данных в переменную buf из файла; num_block – переменная типа int (число читаемых блоков); pf – указатель на файл, из которого читается информация
    fseek i=fseek(pf, -5, SEEK_END); pf – указатель на поток; -5 – смещение к началу файла; SEEK_END – смещение производится с последнего байта файла
    rewind rewind(pf); pf – указатель на поток; возвращает указатель на нулевой байт файла pf
    ftell li=ftell(pf); pf – указатель на поток; в переменную li (тип long int) возвращается значение указателя текущей позиции в файле pf
    fclose fclose(pf); pf – имя_указателя_на_поток
    remove remove (" my_file.dat"); Удаляет файл с именем " my_file.dat"

    Для нахождения длины файла в байтах можно определить конструкцию:

    FILE *pf;

    long int n;

    if((pf=fopen(" my_file.dat", " r+”)) = = NULL)

    {

    printf(" файл не открыт\n");

    return 1;

    }

    fseek(pf, 0, SEEK_END); //указатель файла на последнем байте файла

    n=ftell(pf); //в переменной n – значение указателя файла, т.е.

    //количество байт в файле

    rewind(pf); //перемещение указателя файла в начало файла

     

     






    © 2023 :: MyLektsii.ru :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.