Главная » Просмотр файлов » Лекция_2._Обработка_симв_инф_Файлы_Программирование_2_семестр

Лекция_2._Обработка_симв_инф_Файлы_Программирование_2_семестр (1271738), страница 2

Файл №1271738 Лекция_2._Обработка_симв_инф_Файлы_Программирование_2_семестр (Лекция) 2 страницаЛекция_2._Обработка_симв_инф_Файлы_Программирование_2_семестр (1271738) страница 22021-10-10СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 2)

/*или можно описать тот же самый шаблон так:

struct BOOK {char author[20]; char title[44];

int year; float price} ;*/

BOOK b;/*описание структурной переменной b*/

Память, занимаемая структурой, равна сумме объемов памяти полей (если исключить из рассмотрения особенности, связанные с выравниванием). В любом случае для определения размера памяти структуры можно использовать операцию sizeof(). Шаблон ВООК, на­пример, описывает структуру размером памяти 70.

Обращение к полю структурной переменной:

ИмяСтруктуры.ИмяПоля или АдресСтруктуры->ИмяПоля

.(точка) и -> являются операциями, соответственно, прямого и косвенного выбора компоненты структурированной переменной.

Например,

struct BOOK a,*pnta=&a;...

a.author="Byron"; pnta->author="Byron"; /*эквивалентные опера­торы*/

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

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

В Си существует еще один сложный тип, описание которого формально похоже на структуру. Это тип (и переменная) объедине­ние.

Объединение - это переменная, содержащая поля разного типа, помещаемые в одно и то же место памяти. По существу объедине­ние дает способ различной интерпретация содержимого памяти. Описание шаблона (типа) объединения и переменной этого типа выполняется также, как для структуры, только вместо ключевого слова struct используется union. Размер памяти, занимаемой объе­динением, равен максимальному из размеров полей.

2.3.Файлы в Си

2.3.1. Общее понятие о файлах в программировании

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

Файл - это последовательность однотипных компонент. Число компонент файла не ограничено. Компонентой файла мо­жет быть строка или байт, или значение какого-либо типа (целого, вещественного, структура, и т. д.). После последней компоненты файла стоит специальный код, называемый признаком конца файла; этот код обычно ставится автоматически, без участия программиста.

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

Абстрактная последовательность данных на некотором внешнем устройстве также называется потоком.

Обычно в алгоритмических языках определяется программное и физическое имя файлов. Программное имя - это имя переменной типа файл (в СИ типа FILE*), физическое имя - это имя файла на внешнем запоминающем устройстве. Существуют специальные операторы, связывающие про­граммное и физическое имя файла (см.§2.3.2).

Файлы бывают текстовыми и двоичными.

Текстовые файлы хранят информацию во внешнем пред­ставлении. Они имеют два основных признака: во-первых, их ком­понентами являются строки символов; во-вторых, эта символьная информация при чтении из файла или записи в файл преобразуется в соответствии с типом вводимых или выводимых переменных. Эти файлы являются обобщением данных на устройстве консоль (CON). Умение работать с текстовыми файлами необхо­димо даже начинающим программистам, так как обычно имеется потребность в длительном хранении исходных и выходных данных.

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

Двоичный файл - это последовательность байтов; обмен ин­формации между двоичным файлом и данными программы про­исходит без преобразования.

2.3.2. Функции Си для работы с файлами

Шаблон структуры FILE и прототипы основных функций работы с файлами хранятся в stdio.h. Перед использованием файла необхо­димо:

1. Описать его программное имя как указатель на структуру типа FILE:

FILE *ИмяУказателя

  1. Открыть файл. Функция открытия файла устанавливает связь между программным и физическим именами файла и подго­тавливает его к использованию.
    Шаблон функции открытия файла:
    FILE *fopen(char *ИмяФайла, char *режим);

первый параметр задает строку, в которой хранится физиче­ское имя файла, записанное по правилам операционной системы, второй - режим открытия.

Приведем некоторые режимы:

“r” - открыть для чтения;

“w” - открыть для записи;

“rb” - открыть двоичный файл для чтения;

“wb” - открыть двоичный файл для записи;

“rt” - открыть текстовый файл для чтения;

“wt” - открыть текстовый файл для записи;

“a” – открыть файл для дополнения.

Результат функции fopen необходимо присвоить переменной типа FILE *. Если функции fopen удалось открыть указанный файл, возвращается указатель на FILE. Если же файл не может быть открыт, возвращается NULL.

Пример открытия файла и обнаружения ошибки при открытии:

FILE *fp;

fp=fopen(“x.txt”,”w”);

if (fp==NULL)

puts(“Ошибка при открытии файла”)

else ....

Или:

FILE *fp;

if ((fp=fopen(“x.txt”,”w”))==NULL)

{ puts(“Ошибка при открытии файла”);

exit(1); }.

Функция с шаблоном

int feof(FILE *fp);

возвращает значение, не равное 0 (истина), если (при открытии файла, или чтении из файла, или записи в файл) конец файла достигнут, и значение 0 (ложь) в противном слу­чае.

В стандартной библиотеке Си функции ввода-вывода, в частности доступа к файлам, могут возвращать значение, равное символьной константе (точнее макроопределению) EOF для индикации, что достигнут конец файла. Реальное значение EOF является отрицательным числом, зависящим от системы (в основном −1), что гарантирует несовпадение с кодом символа.

Далее поясним, что такое открытие файла для чтения, записи и дополнения.

Открытие файла для чтения предусматривает выполнение следующих действий:

  1. Поиск файла с заданным физическим именем; если файл не найден, то выводится сообщение об ошибке.

  2. Указатель файла устанавливается на первую компоненту.

  3. Компонента, на которой стоит указатель, считывается в буфер.

  4. Если считан признак конца файла, то функция feof устанавливается в значение истина, иначе – в значение ложь.

Открытие файла для записи предусматривает выполнение следующих действий:

  1. Поиск файла с заданным физическим именем; если файл не найден, то создается новый файл.

  2. Содержимое файла очищается.

  3. Указатель файла устанавливается на конец файла, который, поскольку файл очищен, одновременно является его началом.

  4. Функция feof устанавливается в значение истина. Это значение сохраняется при последующей записи в файл, т. е. запись происходит в конец файла.

Открытие файла для дополненния предусматривает выполнение следующих действий:

  1. Поиск файла с заданным физическим именем; если файл не найден, то выдается сообщение об ошибке.

  2. Указатель файла устанавливается на конец файла (после последней компоненты).

  3. Функция feof устанавливается в значение истина.

Рассмотренные ранее функции scanf, printf, puts, gets имеют аналоги для работы с текстовыми файлами. Их названия получа­ются добавлением справа буквы f к именам упомянутых функций.

Шаблоны функций файлового форматного вывода и ввода:

int fprintf(програм_имя_ файла, форматная_строка, список_вывода);

int fscanf(програм_имя_ файла, форматная_строка, список_вывода);

Шаблоны функций fputs и fgets:

char *fgets(char *string, int nmax,FILE *f)

char *fputs(char *string, FILE *f)

где string - адрес начала вводимого массива символов,

f - указатель на текстовый файл,

nmax - максимальная длина вводимой строки плюс 1.

Функции putc (записать символ в поток) и getc (прочитать сим­вол из потока) работают как с текстовыми, так и с двоичными фай­лами. Их шаблоны:

int putc(int ch, FILE* f) (если оператор выполнен успешно, то возвращается записанный символ, иначе EOF)

int getc(FILE *f) (если считывание не выполнено, то EOF)

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

unsigned fread(void *buf, int zap, int n,FILE *f)

unsigned fwrite(const void *buf, int zap, int n,FILE *f)

где buf - указатель на область памяти, с которой будет происхо­дить обмен информацией, zap – размер в байтах считываемого или записываемого элемента (записи), n – максимальное число считываемых (записываемых) элементов, f - указатель на файл.

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

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

Шаблон функции за­крытия файла:

int fclose(FILE * f) - возвращает значение нуль, если операция закрытия прошла успешно.

2.3.3. Примеры программ, использующих файлы

Пример 1. Размеры матрицы n и m и значения элементов матрицы считываются из текстового файла f_in.txt , затем матрица изменяется (скажите, как) и выводится в текстовый файл f_out.txt.

#include <stdio.h>

#include <conio.h>

void main()

{

float a[5][5]; int n,m,i,j;

FILE* f_in, *f_out;

f_in=fopen("f_in.txt","rt"); //"c:\\dir\\f_in.txt"

fscanf(f_in,"%d%d", &n,&m);

for (i=0;i<n;i++)

for (j=0;j<m;j++)

fscanf(f_in,"%f",&a[i][j]);//fscanf(f_in,"%f", *(a+i)+j);

//закончен ввод из файла

for (i=0;i<n;i++)

for (j=0;j<m;j++)

a[i][j]=a[i][j]*a[i][j];

//закончена обработка матрицы

f_out=fopen("f_out.txt","wt");

fputs("output matrix:\n",f_out);

for (i=0;i<n;i++)

{

for (j=0;j<m;j++)

fprintf(f_out,"%6.1f ",a[i][j]);

fprintf(f_out,"\n");

}

// вывели изменную матрицу в файл

fclose(f_in);//необязательно

fclose(f_out);//обязательно!!!!!

puts("output file is ready!"); puts("output file is ready!");

//каждая фраза на отдельной строке

_getch();

}

Пример 2. В каждой строке входного файла f_in.txt через пробел записаны фамилия и имя человека. Каждая строка входного файла считывается в переменную-строку s. В выходной файл f_out.txt записываются строки входного файла, содержащие фамилии «Иванов» и «Иванова». Обратите наличие пробела после фамилий в соответствующих строковых литералах программы. Зачем он нужен?

#include <stdio.h>

#include <conio.h>

#include <string.h>

#define NMAX 100

void main()

{

char s[NMAX]; int k,i;//k-число Ивановых

Характеристики

Тип файла
Документ
Размер
124,5 Kb
Материал
Тип материала
Высшее учебное заведение

Список файлов лекций

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6367
Авторов
на СтудИзбе
310
Средний доход
с одного платного файла
Обучение Подробнее