Работа с текстовыми конфигурационными файлами

Объединенный Открытый Проект

Сайт для Настоящих Компьютерщиков

Сейчас просматривают эту тему:

а также: 1 гость, 0 скрытых пользователей.

Последние
Что лучше ноутбук или обычный ПК?
Хочу asus zenfone 5
Борьба со спамом на форуме
Тотализатор апдейтов Яндекса
Сайт по соционике

Самые активные 5 т

Случайные статьи

Объединенный Открытый Проект » Программирование » С/C++ » Работа с конфиг-файлами

Работа с конфиг-файлами

Вида параметр=значение

> Страницы: 1 * 2
Модератор: wsx
Печать
wsx

Модератор раздела
Юниксойд, сетевик

Откуда: Казань
Всего сообщений: 1074
Рейтинг пользователя: 28

Дата регистрации на форуме:
14 янв. 2005

Руководитель Проекта
Настоящий Компьютерщик

Откуда: Москва
Всего сообщений: 2994
Рейтинг пользователя: 79

Дата регистрации на форуме:
29 сен. 2001

Модератор раздела
Юниксойд, сетевик

Откуда: Казань
Всего сообщений: 1074
Рейтинг пользователя: 28

Дата регистрации на форуме:
14 янв. 2005

ёпппрст.
Хочешь, как легче, насоветуют, как тяжелее.

Эххх. Тьфу этот си. на перле чтоли написать ??

хм. интересно, а на перле под кернел можно накатаь ? гык.

Вот зачем нужно было придумывать ТАКОЙ СЛОЖНЫЙ язык. Страуструпа и Ричарда Столмана — повесить мало!

Руководитель Проекта
Настоящий Компьютерщик

Откуда: Москва
Всего сообщений: 2994
Рейтинг пользователя: 79

Дата регистрации на форуме:
29 сен. 2001

А код нарезки я сделал бы таким:

int pos;
FILE* fh;
char buffer[MAXLEN]; // MAXLEN — макс. длина строки
int counter=0; // количество строк (в

fh=fopen(filename,»r»);
if (fh==NULL) < обработка ошибки >
else <
fscanf(fh,»%s»,buffer); // здесь еще надо подумать, как сделать, чтобы не возникало проблем с макс. длиной строки
pos=0;
whle (buffer[pos] && buffer[pos]!=’=’) pos++;
if (pos) <
params[counter]=malloc(pos-1); // выделение памяти под параметр
values[counter]=malloc(strlen(buffer)-pos); // выделение памяти под значение (или может быть, лучше сразу выделять с запасом?)
memcpy(params[counter],buffer,pos-1); // копирование параметра из начала строки
strcpy(values[counter],buffer+pos+1); // копирование значения из конца строки
counter++;
>
>
fclose(fh);

Всего сообщений: 9
Рейтинг пользователя: 2

Дата регистрации на форуме:
9 авг. 2005

Всего сообщений: 9
Рейтинг пользователя: 2

Дата регистрации на форуме:
9 авг. 2005

Вот самый простой и быстрый.

#include
#include
#include

/*
*вспомагательная функция
*возвращает номер символа в строке, следующего после запятой
*или ноль, если встретит символ коментария
*
*входные параметры:
* str — строка, в которой происходит сканирование
* nom — номер элемента, начиная с которого нужно производить поиск
*
*возвращаемое значение — номер символа, ПОСЛЕ которого стоит запятая
*
*/
int get_parm_offset(char * str,int nom)
<
while((str[nom]!=’,’)&&(str[nom]!=’;’)&&(str[nom]!=’\0′)) nom++;
if((str[nom]==’;’)||(str[nom]==’\0′)) return 0;
return(++nom);
>

/*
*функция conv_string() позволяет конвертировать
*переданные ей параметры из текстового вида в целочисленные.
*входные параметры:
* str — параметр-строка
*выходные параметры:
* save_buffer — буфер интеджеров ,куда следует сохранить параметр(ы)
*
*возвращаемое значение — количество элементов, помещенных в буфер — НЕ БАЙТ.
*/
int conv_string(char *str,int *save_buffer)
<
int nom=0; /*номер следующего символа после запятой в строке-параметре*/
int count=0;

/*
*функция read_sec_parm() позволяет прочесть
*заданный параметр секции
*из заданного конфигурационного файла
*
*входные параметры:
* filename — имя файла
* sect_num — имя секции
* parm_name — имя параметра
*выходные:
* save_buffer — буфер,куда следует сохранить параметр
* save_size — его длина
*возвращаемое значение — код ошибки
*/
int read_sec_parm(char *filename,char *sect_name,char *parm_name,char *save_buffer,size_t save_size)
<
FILE *cfg_file; /*указатель на конфигурационный файл*/
char Order[4000]; /*имя секции*/
char buf[4000]; /*временный буфер строки из файла*/
int num_char=0;

/*открытие конфигурационного файла на чтение*/
cfg_file=fopen(filename,»r»);
if(cfg_file==NULL)

/*построчное сканирование файла*/
while(fgets(buf,sizeof(buf),cfg_file)!=NULL)
<
int i=0;
char ch=buf;/*временная переменная, в которую заносится символ*/

/*
*замеряется отступ от начала строки
*(количество символов пробелов+табуляций)
*/
while((ch==’ ‘)||(ch==’\t’)) ch=buf[++i];

/*
*если встретился символ коментариев или новая строка, то осуществляется
*переход на следующую строку
*/
if ((ch==’#’)||(ch==’;’)||(ch==’\n’)) continue;

/*нахождение секции*/
if(sscanf(buf+i,»[%s]»,Order)!=0) continue;

/*если секция не наша то дальше продолжается сканирование*/
if (strncmp(sect_name,Order,strlen(sect_name))!=0) continue;

/*сравнение названий параметров*/
if (strncmp(parm_name,buf+i,strlen(parm_name))!=0) continue;

int j=i;/*номер последнего символа в строке*/
ch=buf[j];

/*закрытие файла*/
fclose(cfg_file);
return num_char;
>

Работа с текстовыми редакторами (стр. 1 из 2)

1. Обработка текстовой информации в автоматизированных системах.

Ввод, редактирование и форматирование текстов.

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

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

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

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

Текстовые редакторы и текстовые процессоры.

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

Более того, форматирование текстового документа в некоторых случаях вредит делу, поскольку информация о форматировании заносится в текст в виде невидимых кодов. Наличие подобных кодов может мешать определенным программам, работать с текстами. Так, например, текстовой редактор Блокнот не способен отразить на экране текстовой файл, созданный в текстовом процессоре WordPad, хотя обе программы принадлежат к одной группе стандартных программ Windows 9x и обе предназначены для работы с текстами.

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

Все текстовые редакторы сохраняют в файле «чистый» текст и благодаря этому совместимы друг с другом. Различные текстовые процессоры записывают в файл информацию о форматировании по – разному и по этому несовместимы друг с другом. Однако во многих текстовых процессорах есть возможность преобразования текста из одного формата в другой.

В состав системы Windows 9х входит стандартный текстовый редактор Блокнот и простой текстовой процессор WordPad. Неформатированные текстовые файлы в системе Windows имеют расширение .ТХТ, а файлы WordPad – расширение .DOC.

2. Текстовой редактор «Microsoft Word». Режим работы и команды.

Word является стандартной Windows – программой, его запуск и завершение осуществляется стандартно (двойным щелчком левой кнопки мыши по значку).

В верхней части окна располагаются панели команд, к которым относятся строка меню и панели инструментов – Стандартная и Форматирование.

Под панелями инструментов располагается линейка, проградуированная в сантиметрах.

Основную часть окна занимает рабочая область, содержащая окно редактируемого документа.

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

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

Методы представления документа.

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

1. Первая кнопка включает обычный режим. Этот режим предназначен только для работы с текстом.

2. Режим электронного документа необходим для просмотра готового документа.

3. В режиме разметки документ представляется на экране точно так, как он будет выглядеть при печати на бумаге.

4. Режим структуры удобен для работ над планом документа.

Работа с несколькими документами.

В отличие от своего упрощенного аналога, процессора Wordpad, текстовой процессор Word позволяет работать одновременно с несколькими документами.

Активное окно документа имеет собственные кнопки:

После сворачивания окно документа отображается в виде небольшой панели в левом нижнем углу рабочей области.

Для переключения в окно нужного документа нужно щелкнуть кнопкой мыши в любом месте этого окна.

Ввод и редактирование текста.

Окно текущего документа всегда содержит мигающую вертикальную черту – курсор.

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

Команды управления курсором.

HOME В начало текущей строки
END В конец текущей строки
CTRL+HOME В начало документа
CTRL+END В конец документа
PAGE UP Вверх на один экран
PAGE DOWN Вниз на один экран
CTRL+PAGE DOWN На одну печатную страницу вперед
CTRL+PAGE UP На одну печатную страницу назад
CTRL+ВЛЕВО На одно слово назад
CTRL+ВПРАВО На одно слово вперед
CTRL+ВНИЗ На один абзац вперед
CTRL+ВВЕРХ На один абзац назад

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

Выделенный фрагмент удаляют нажатием клавиши Delete.

Отмена действия ошибочных команд.

Отмену последней выполненной команды выполняют командой Правка – Отменить или кнопкой на панели инструментов.

Отмена подразумевает восстановление состояния документа таким, каким оно было до исполнения соответствующей команды. Если операция была отменена по ошибке, то сразу после этого ее можно повторить с помощью команды Правка – Повторить. Повторение операций возможно только непосредственно после их отмены.

Определение вида начертания шрифта.

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

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

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

Элементы управления вкладки Шрифт соответствуют элементам панели Форматирования. Раскрывающийся список Подчеркивание представляет нестандартные варианты подчеркивания текста (например, двойной чертой или пунктиром). Цвет отображения текста изменяют в раскрывающемся списке Цвет. Эта операция имеет смысл только для электронных документов и документов, которые будут распечатываться на цветном принтере.

Элементы управления вкладки Интервал позволяют изменить интервалы между символами. Благодаря этому текст может быть уплотнен или разрежен, что нередко используют в заголовках.

Выравнивание абзаца – это расположение его между правыми и левыми полями страницы.

В программе Word выравнивание задают щелчком на соответствующей кнопке на панели инструментов Форматирование. Из четырех кнопок (По левому краю, По центру, По правому краю, По ширине) может быть включена только одна.

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

Но более удобно форматировать при помощи линейки.

Форматирование с помощью линейки.

Линейка позволяет управлять боковыми границами и позициями табуляции текущего абзаца. Границы абзаца задают путем перемещения (перетаскивания) специальных маркеров.

1. Треугольный маркер, расположенный слева внизу (острием вверх) задает левую границу для всех строк абзаца, кроме первой.

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

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

4. Треугольный маркер, расположенный справа, задает правую границу текущего абзаца.

5. Символ, обозначающий позицию табуляции, располагается на линейке слева. Он имеет вид «уголка». Щелкнув на нем, можно изменить вид символа табуляции и, соответственно, метод отображения текста.

Работа с текстовыми файлами

Работа с текстовыми файлами

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

  • 1. Открыть файл, для того, чтобы к нему можно было обращаться. Соответственно, открывать можно для чтения, записи, чтения и записи, переписывания или записи в конец файла и т.п. Когда вы открываете файл, может также произойти куча ошибок – файла может не существовать, это может быть файл не того типа, у вас может не быть прав на работу с файлом и т.д. Всё это необходимо учитывать.
  • 2. Непосредственно работа с файлом — запись и чтение. Здесь также нужно помнить, что мы работаем не с памятью с произвольным доступом, а с буферизированным потоком, что добавляет свою специфику.
  • 3. Закрыть файл. Так как файл является внешним по отношению к программе ресурсом, то если его не закрыть, то он продолжит висеть в памяти, возможно, даже после закрытия программы (например, нельзя будет удалить открытый файл или внести изменения и т.п.). Кроме того, иногда необходимо не закрывать, а «переоткрывать» файл для того, чтобы, например, изменить режим доступа.

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

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

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

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

Создание и выделение памяти под объект типа FILE осуществляется с помощью функции fopen или tmpfile (есть и другие, но мы остановимся только на этих).

Функция fopen открывает файл. Она получает два аргумента – строку с адресом файла и строку с режимом доступа к файлу. Имя файла может быть как абсолютным, так и относительным. fopen возвращает указатель на объект FILE, с помощью которого далее можно осуществлять доступ к файлу.

Например, откроем файл и запишем в него Hello World

Функция fopen сама выделяет память под объект, очистка проводится функцией fclose. Закрывать файл обязательно, самостоятельно он не закроется.

Функция fopen может открывать файл в текстовом или бинарном режиме. По умолчанию используется текстовый. Режим доступа может быть следующим

Параметры доступа к файлу.

Тип Описание
r Чтение. Файл должен существовать.
w Запись нового файла. Если файл с таким именем уже существует, то его содержимое будет потеряно.
a Запись в конец файла. Операции позиционирования (fseek, fsetpos, frewind) игнорируются. Файл создаётся, если не существовал.
r+ Чтение и обновление. Можно как читать, так и писать. Файл должен существовать.
w+ Запись и обновление. Создаётся новый файл. Если файл с таким именем уже существует, то его содержимое будет потеряно. Можно как писать, так и читать.
a+ Запись в конец и обновление. Операции позиционирования работают только для чтения, для записи игнорируются. Если файл не существовал, то будет создан новый.

Если необходимо открыть файл в бинарном режиме, то в конец строки добавляется буква b, например “rb”, “wb”, “ab”, или, для смешанного режима “ab+”, “wb+”, “ab+”. Вместо b можно добавлять букву t, тогда файл будет открываться в текстовом режиме. Это зависит от реализации. В новом стандарте си (2011) буква x означает, что функция fopen должна завершиться с ошибкой, если файл уже существует. Дополним нашу старую программу: заново откроем файл и считаем, что мы туда записали.

Вместо функции fgets можно было использовать fscanf, но нужно помнить, что она может считать строку только до первого пробела.
fscanf(file, «%127s», buffer);

Также, вместо того, чтобы открывать и закрывать файл можно воспользоваться функцией freopen, которая «переоткрывает» файл с новыми правами доступа.

Функции fprintf и fscanf отличаются от printf и scanf только тем, что принимают в качестве первого аргумента указатель на FILE, в который они будут выводить или из которого они будут читать данные. Здесь стоит сразу же добавить, что функции printf и scanf могут быть без проблем заменены функциями fprintf и fscanf. В ОС (мы рассматриваем самые распространённые и адекватные операционные системы) существует три стандартных потока: стандартный поток вывода stdout, стандартный поток ввода stdin и стандартный поток вывода ошибок stderr. Они автоматически открываются во время запуска приложения и связаны с консолью. Пример

Ошибка открытия файла

Если вызов функции fopen прошёл неудачно, то она возвратит NULL. Ошибки во время работы с файлами встречаются достаточно часто, поэтому каждый раз, когда мы окрываем файл, необходимо проверять результат работы

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

В простых случаях можно действовать влоб, как в предыдущем куске кода. В более сложных случаях используются методы, подменяющиее RAII из С++: обёртки, или особенности компилятора (cleanup в GCC) и т.п.

Буферизация данных

Как уже говорилось ранее, когда мы выводим данные, они сначала помещаются в буфер. Очистка буфера осуществляется

  • 1) Если он заполнен
  • 2) Если поток закрывается
  • 3) Если мы явно указываем, что необходимо очистить буфер (здесь тоже есть исключения:)).
  • 4) Также очищается, если программа завершилась удачно. Вместе с этим закрываются и все файлы. В случае ошибки выполнения этого может не произойти.

Форсировать выгрузку буфера можно с помощью вызова функции fflush(File *). Рассмотрим два примера – с очисткой и без.

Раскомментируйте вызов fflush. Во время выполнения откройте текстовый файл и посмотрите на поведение.

Буфер файла можно назначить самостоятельно, задав свой размер. Делается это при помощи функции

которая принимает уже открытый FILE и указатель на новый буфер. Размер нового буфера должен быть не меньше чем BUFSIZ (к примеру, на текущей рабочей станции BUFSIZ равен 512 байт). Если передать в качестве буфера NULL, то поток станет небуферизированным. Можно также воспользоваться функцией

которая принимает буфер произвольного размера size. Режим mode может принимать следующие значения

  • _IOFBF — полная буферизация. Данные записываются в файл, когда он заполняется. На считывание, буфер считается заполненным, когда запрашивается операция ввода и буфер пуст.
  • _IOLBF — линейная буферизация. Данные записываются в файл когда он заполняется, либо когда встречается символ новой строки. На считывание, буфер заполняется до символа новой строки, когда запрашивается операция ввода и буфер пуст.
  • _IONBF – без буферизации. В этом случае параметры size и buffer игнорируются.

В случае удачного выполнения функция возвращает 0.

Пример: зададим свой буфер и посмотрим, как осуществляется чтение из файла. Пусть файл короткий (что-нибудь, типа Hello, World!), и считываем мы его посимвольно

Видно, что данные уже находятся в буфере. Считывание посимвольно производится уже из буфера.

Функция int feof (FILE * stream); возвращает истину, если конец файла достигнут. Функцию удобно использовать, когда необходимо пройти весь файл от начала до конца. Пусть есть файл с текстовым содержимым text.txt. Считаем посимвольно файл и выведем на экран.

Всё бы ничего, только функция feof работает неправильно. Это связано с тем, что понятие «конец файла» не определено. При использовании feof часто возникает ошибка, когда последние считанные данные выводятся два раза. Это связано с тем, что данные записывается в буфер ввода, последнее считывание происходит с ошибкой и функция возвращает старое считанное значение.

Этот пример сработает с ошибкой (скорее всего) и выведет последний символ файла два раза.

Решение – не использовать feof. Например, хранить общее количество записей или использовать тот факт, что функции fscanf и пр. обычно возвращают число верно считанных и сопоставленных значений.

Примеры

1. В одном файле записаны два числа — размерности массива. Заполним второй файл массивом случайных чисел.

2. Пользователь копирует файл, при этом сначала выбирает режим работы: файл может выводиться как на консоль, так и копироваться в новый файл.

3. Пользователь вводит данные с консоли и они записываются в файл до тех пор, пока не будет нажата клавиша esc. Проверьте программу и посмотрите. как она себя ведёт в случае, если вы вводите backspace: что выводится в файл и что выводится на консоль.

4. В файле записаны целые числа. Найти максимальное из них. Воспользуемся тем, что функция fscanf возвращает число верно прочитанных и сопоставленных объектов. Каждый раз должно возвращаться число 1.

Другое решение считывать числа, пока не дойдём до конца файла.

5. В файле записаны слова: русское слово, табуляция, английское слово, в несколько рядов. Пользователь вводит английское слово, необходимо вывести русское.

Файл с переводом выглядит примерно так

солнце sun
карандаш pen
шариковая ручка pencil
дверь door
окно windows
стул chair
кресло armchair

и сохранён в кодировке cp866 (OEM 866). При этом важно: последняя пара cлов также заканчивается переводом строки.

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

6. Подсчитать количество строк в файле. Будем считывать файл посимвольно, считая количество символов ‘\n’ до тех пор, пока не встретим символ EOF. EOF – это спецсимвол, который указывает на то, что ввод закончен и больше нет данных для чтения. Функция возвращает отрицательное значение в случае ошибки.
ЗАМЕЧАНИЕ: EOF имеет тип int, поэтому нужно использовать int для считывания символов. Кроме того, значение EOF не определено стандартом.

Работа с текстовыми файлами

Читайте также:

  1. D-триггеры, работающие по фронту.
  2. I.15.11.1 Выработать основные положения проекта
  3. VI. Лекционный материал: РАБОТА С УЧЕБНИКОМ
  4. XIII. Файловая структура ОС. Операции с файлами
  5. АЧР не должна работать при процессах, которые отличаются от переходных процессов в энергосистеме при дефиците мощности, и сопровождаются изменением частоты.
  6. Без дисциплины работать трудно
  7. Безопасность сосудов и баллонов, работающих под давлением.
  8. Безопасность эксплуатации сосудов, работающих под давлением (котлы, газовые баллоны и т. д.)
  9. Безымянно работающие и сейчас
  10. Бывают ситуации когда ферменты не работают
  11. В банках должна работать Программа проверки внутреннего контроля
  12. Валидов, неработающей молодежи.

Процедура: Append(var Vf: Text); Модуль: System

Описание: Процедура открывает внешний файл с доступом только для записи и устанавливает указатель в конец файла. Vf — файловая переменная, ассоциированная с файлом при помощи процедуры AssignFile. Если файл Vf уже открыт, то при вызове процедуры Append он закрывается и открывается вновь. Если файл не существует, то происходит ошибка. Если в последнем 128-байтовом блоке файла присутствует символ Ctrl+’Z’ (ASCII код 26), то файловый указатель устанавливается так, чтобы следующий добавляемый в файл символ был записал поверх первого Ctrl+’Z’ в блоке. Таким образом, текст может быть конкатенирован к файлу, который завершается на Ctrl+’Z’.

Процедура: AssignPrn(var Vf: Text); Модуль: Printers

Описание: Процедура устанавливает ассоциативную связь между файловой переменной Vf и принтером. Вся информация, записываемая в файл Vf, будет отправляться на принтер. После вызова процедуры AssignPrn необходимо вызвать процедуру Rewrite для того, чтобы создать и открыть файл печати.

Процедура: Flush(var Vf: Text); Модуль: System

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

Процедура: Read([var Vf: Text] V1[V2, . Vn]); Модуль: System

Описание: Процедура читает одно или больше значений из файла в соответствующее количество переменных. Запись упакованной строки: Имеет такой же результат, как для строки, длина которой равна количеству элементов упакованной строки. Запись значений булева типа: Имеет такой же результат, как для строк ‘True’ или ‘False’

Процедура: Readln([var Vf: Text] V1[V2, . Vn]); Модуль: System

Описание: Процедура читает строку текста из файла и переводит указатель на начало следующей строки. Вызов Readln(Vf) без параметров просто переводит указатель в начало следующей строки.

Процедура: SetTextBuf(var Vf: Text [; var Size: Integer]); Модуль: System

Описание: Процедура устанавливает буфер ввода/вывода для текстового файла. Каждая файловая переменная текстового файла имеет внутренний 128-байтовый буфер чтения/записи. Данный буфер не играет роли в большинстве приложений, однако, если программа жестко привязана к вводу/выводу, то наличие буфера позволяет увеличить ее эффективность за счет уменьшения обращений к диску и непроизводительных затрат системы. Процедура SetTextBuf устанавливает для текстового файла, связанного с файловой переменной Vf, взамен внутреннего 128-байтового буфера, буфер указанный в параметре Buf, размером Size байт. Если переменная Size опущена, то размер принимается равным SizeOf(Buf). Новый заданный буфер будет ассоциирован с файлом Vf до вызова функции AssignFile для данного файла. Процедура SetTextBuf вызывается сразу после вызова процедур Reset, Rewrite или Append. Если до вызова SetTextBuf над файлом производились операции ввода/вывода, то из-за смены буфера информация может быть потеряна.

Процедура: Write([var Vf: Text;] P1[, P2 , . Pn ]); Модуль: System

Описание: Процедура записывает одно или больше значений в текстовый файл, связанный с файловой переменной Vf. Файл, в который записываются данные, должен быть открыт для записи. Если параметр Vf опущен, то действие процедуры применяется к стандартному Файлу вывода. В параметрах P, указывается значение, которое должно быть записано в файл. Значения параметров Pn должны иметь один из следующих типов: — Char; — целочисленный тип (Byte, ShortInt, Word, LongInt, Cardinal); — значение с плавающей запятой (Single, Real, Double, Extended, Currency); — строковый тип (PChar, AnsiString, ShortString); — тип упакованной строки; — булевый тип (Boolean, Bool). Записываемый параметр должен иметь форму: OutExpr[:MinWidth [:DecPlaces]], где OutExpr — выводимое выражение, MinWidth, DecPlaces — параметры форматирования. Параметр MinWidth: Integer определяет минимальную ширину поля (должна быть >0). Параметр DecPlaces: Integer определяет количество десятичных позиций после запятой (для фиксированного вывода чисел с плавающей запятой). Данный параметр должен указываться только для значений действительных типов, и только тогда, когда определен параметр MinWidth. Значение DecPlaces должно быть больше или равно 0. Запись значений символьного типа. Если опущен параметр MinWidth, то в файл записывается указанный символ, иначе необходимая длина поля достигается записью дополнительных пробелов. Запись значений целочисленного типа. Если опущен параметр MinWidth, то в файл записывается значение один к одному, иначе недостающее количество позиций заполняется пробелами. Запись значения действительного типа. Формат записи зависит от наличия параметра DecPlaces. Параметр MinWidth определяет суммарное количество символов. Если параметр MinWidth опущен, то принимается значение по умолчанию (17 символов). Если MinWidth 11, то принимается значение по умолчанию равное 11. Если параметр DecPlaces опущен или имеет отрицательное значение, то записывается десятичная строка с плавающей запятой в экспонентальном виде: [ /-] . E[+/-] Если значение DecPlaces присутствует, а значение указанное в параметре MinWidth превышает количество выводимых символов, то недостающее количество заполняется пробелами перед числом.

Пример:
&nbsp-12.3456789:1 = -1.2E+0000
&nbsp-12.3456789:8 = -1.2E+0000
&nbsp-12.3456789:12 = -1.234E+0001
&nbsp-12.3456789:22 = -1.2345678900000E+0001
&nbsp-12.3456789:3:1 = -12.3
&nbsp-12.3456789:3:5 = -12.34567
&nbsp-12.3456789:15:5 = -12.34567

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

Процедура: WriteLn([var Vf: Text;] P1[, P2 , . Pn ]); Модуль: System

Описание: Действие данной процедуры аналогично процедуре Write для текстовых файлов, но, в отличие от нее, процедура Writeln добавляет к записываемому тексту маркер конца строки. Если при вызове Writeln параметры Pn опущены, то процедура просто записывает в файл маркер конца строки.

Функция: Eof[(var Vf)]: Boolean; Модуль: System

Описание: Функция определяет, стоит ли файловый указатель в конце файла. Vf — файловая переменная, связанная с текстовым файлом. Eof(Vf) возвращает True, когда указатель текущей позиции стоит на последнем символе файла, или если файл не содержит данных (пустой), в противном случае возвращается False. Функция Eof для текстовых файлов аналогична функции Eof для типизированных файлов, за исключением того, что для текстовых файлов параметр Vf может быть опущен, и тогда функция будет обращаться к стандартному файлу ввода.

Функция: SeekEof[(var Vf: Text )]: Boolean; Модуль: System

Описание: Функция определяет, достигнут ли конец файла. Если указатель стоит в конце файла, то функция возвращает True, а иначе — False. Данная функция может применяться только к открытым текстовым файлам.

Пример:
var
Vf1, Vf2: TextFile;
i, j: Integer;
begin
AssignFile(Vf1, 'work1.txt');
Rewrite(Vf1); //создает и открывает файл 'work1.txt'
AssignFile(Vf2, 'work2.txt');
Rewrite(Vf2); //создает и открывает файл 'work2.txt'
Writeln(Vf1, '1 2 3'); //записывает строку в файл'work1.txt'
Writeln(Vf1, '10 20 30'); //записывает 2-ю строку в файл
Writeln(Vf1, '100 200 300'); //записывает 3-ю строку в файл
Reset(Vf1); //устанавливает указатель файла 'work1.txt' в начало файла
while not SeekEof(Vf1) do
begin //цикл, пока не достигнут конец файла
if SeekEoln(Vf1) then Readln; //если достигнут конец строки в файле, то переход на следующую строку
Read(Vf1, j); //читает число из файла 'work1.txt'
Writeln(Vf2, j); //записывает число в файл 'work2.txt'
end;
CloseFile(Vf1);
CloseFile(Vf2);
end;

Дата добавления: 2014-01-07 ; Просмотров: 237 ; Нарушение авторских прав? ;

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

C++. Работа с текстовыми файлами

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

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

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

Для работы с файлами используются специальные типы данных, называемые потоками. Поток ifstream служит для работы с файлами в режиме чтения, а ofstream в режиме записи. Для работы с файлами в режиме как записи, так и чтения служит поток fstream.

В программах на C++ при работе с текстовыми файлами необходимо подключать библиотеки iostream и fstream.

Для того чтобы записывать данные в текстовый файл, необходимо:

  1. описать переменную типа ofstream.
  2. открыть файл с помощью функции open.
  3. вывести информацию в файл.
  4. обязательно закрыть файл.

Для считывания данных из текстового файла, необходимо:

  1. описать переменную типа ifstream.
  2. открыть файл с помощью функции open.
  3. считать информацию из файла, при считывании каждой порции данных необходимо проверять, достигнут ли конец файла.
  4. закрыть файл.

Запись информации в текстовый файл

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

ofstream F;

Будет создана переменная F для записи информации в файл. На следующим этапе файл необходимо открыть для записи. В общем случае оператор открытия потока будет иметь вид:

F.open(«file», mode);

Здесь F — переменная, описанная как ofstream, file — полное имя файла на диске, mode — режим работы с открываемым файлом. Обратите внимание на то, что при указании полного имени файла нужно ставить двойной слеш. Для обращения, например к файлу accounts.txt, находящемуся в папке sites на диске D, в программе необходимо указать: D:\\sites\\accounts.txt.

Файл может быть открыт в одном из следующих режимов:

  • ios::in — открыть файл в режиме чтения данных; режим является режимом по умолчанию для потоков ifstream;
  • ios::out — открыть файл в режиме записи данных (при этом информация о существующем файле уничтожается); режим является режимом по умолчанию для потоков ofstream;
  • ios::app — открыть файл в режиме записи данных в конец файла;
  • ios::ate — передвинуться в конец уже открытого файла;
  • ios::trunc — очистить файл, это же происходит в режиме ios::out;
  • ios::nocreate — не выполнять операцию открытия файла, если он не существует;
  • ios::noreplace — не открывать существующий файл.

Параметр mode может отсутствовать, в этом случае файл открывается в режиме по умолчанию для данного потока.

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

Открыть файл (в качестве примера возьмем файл D:\\sites\\accounts.txt) в режиме записи можно одним из следующих способов:

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

Если вы хотите открыть существующий файл в режиме дозаписи, то в качестве режима следует использовать значение ios::app.

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

Например, для записи в поток F переменной a, оператор вывода будет иметь вид:

F #include «stdafx.h»
#include
#include
#include
using namespace std ;
int main ( )
<
setlocale ( LC_ALL, «RUS» ) ;
int i, n ;
double a ;
//описывает поток для записи данных в файл
ofstream f ;
//открываем файл в режиме записи,
//режим ios::out устанавливается по умолчанию
f. open ( «D: \\ sites \\ accounts.txt» , ios :: out ) ;
//вводим количество вещественных чисел
cout «n=» ; cin >> n ;
//цикл для ввода вещественных чисел
//и записи их в файл
for ( i = 0 ; i n ; i ++ )
<
cout «a=» ;
//ввод числа
cin >> a ;
f a « \t « ;
>
//закрытие потока
f. close ( ) ;
system ( «pause» ) ;
return 0 ;
>

Чтение информации из текстового файла

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

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

Например, для чтения данных из потока F в переменную a, оператор ввода будет выглядеть так:

F>>a;

Два числа в текстовом редакторе считаются разделенными, если между ними есть хотя бы один из символов: пробел, табуляция, символ конца строки. Хорошо, когда программисту заранее известно, сколько и какие значения хранятся в текстовом файле. Однако часто известен лишь тип значений, хранящихся в файле, при этом их количество может быть различным. Для решения данной проблемы необходимо считывать значения из файла поочередно, а перед каждым считыванием проверять, достигнут ли конец файла. А поможет сделать это функция F.eof(). Здесь F — имя потока функция возвращает логическое значение: true или false, в зависимости от того достигнут ли конец файла.

Следовательно, цикл для чтения содержимого всего файла можно записать так:

Для лучшего усвоения материала рассмотрим задачу.

Задача 2

В текстовом файле D:\\game\\accounts.txt хранятся вещественные числа, вывести их на экран и вычислить их количество.

Решение

На этом относительно объемный урок по текстовым файлам закончен. В следующей статье будут рассмотрены методы манипуляции, при помощи которых в C++ обрабатываются двоичные файлы.

Работа с текстовыми файлами

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

Если считывание или запись данных в файл производится с некоторой позиции, то говорят, что в этой позиции находится файловый указатель. При использовании процедуры rewrite указатель помещается в первую позицию файла. После выполнения единичной операции записи или чтения файловый указатель смещается на следующую позицию.

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

eoln(файл_перем) и eof(файл_перем)

соответственно. Тип возвращаемого значения этих функций — логический (true, если файловый указатель находится в конце строки или файла, false — иначе).

Обычно символ конца строки имеет ASCII-код 13 (соответствует нажатию клавиши Enter), конец файла имеет код ASCII, равный 26 (соответствует нажатию сочетания клавиш Ctrl + Z).

Для записи данных в файл применяются процедуры

write(файл_перем,список_переменных); и writeln(файл_перем,список_переменных);.

При их вызове в файл, связанный с файл_перем, последовательно записываются значения из список_переменных. Отличие первой процедуры от второй заключается в том, что во втором случае после записи значений вставляется символ конца строки и файловый указатель помещается на первую позицию новой строки.

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

Для чтения данных из файла применяются процедуры

read(файл_перем,список_переменных); и readln(файл_перем,список_переменных);.

Процедура read имеет следующие особенности:

  • • если переменная из список_переменных имеет тип char, то выполняется считывание в позиции файлового указателя одного символа, который и присваивается переменной. Если файловый указатель находится в позиции символа конца строки либо конца файла, то переменной будет присвоен этот символ;
  • • если переменная из список_переменных имеет тип string, то:
    • — при отсутствии ограничений на длину переменной ей присваивается вся строка, начиная с текущей позиции, до символа конца строки или конца файла, не включая последние;
    • — при превышении максимальной длины переменной длины строки переменной присваивается вся строка, начиная с текущей позиции до символа конца строки или конца файла, не включая последние;
    • — при превышении длины считываемой строки максимальной длины переменной лишние символы отбрасываются. Дальнейшие попытки использовать процедуру read приведут к тому, что остальные строковые переменные будут иметь значение ‘ ‘ (пустое значение);
  • • если переменная из список_переменных имеет какой-либо из числовых типов, то:
  • — начиная с текущей позиции файлового указателя выделяется подстрока до символа конца строки (или конца файла);
  • — из этой подстроки удаляются все лидирующие разделители (пробелы, табуляции, символы конца строки) до первого значащего символа. Если после удаления лидирующих разделителей следующим символом идет символ конца файла, то переменной присваивается значение 0 (ноль);
  • — первый встречающийся после этого символа один из указанных выше разделителей или символ конца файла считается концом выделенной подстроки;
  • — полученная подстрока рассматривается как символьное представление числа;
  • — если при переводе символьного представления в числовое формат данных не совпадает, то возникает ошибка ввода-вывода. В противном случае переменной присваивается числовое значение.

Процедура readln аналогична процедуре read, но имеет следующие особенности:

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

Текстовый файл work.dat содержит данные по заказам изготовления деталей и имеет структуру, представленную в листинге 8.1. Максимальная длина каждого поля (в том числе, полей заголовка) — 14 символов. Количество строк с данными в файле неизвестно.

Длина, мм Ширина, мм 145 12

Требуется сформировать новый текстовый файл work_new.dat, который, вместе с имеющейся информацией, содержал бы новый столбец «Стоимость», указывающий стоимость работы по каждой позиции из расчета 1,5 руб./см 2 .

Программный код задачи с пояснениями приведен в листинге 8.2. Количество добавляемых пробелов в строке

было рассчитано вручную (всего на поле отводится 14 символов, из которых слово «Стоимость» занимает девять).

Конфигурационные файлы

Конфигурационный файл

Задание профиля с помощью командной строки – метод далеко не всегда удобный. Даже при работе с самой командной строкой используется окружение для сохранения настроек, чтобы не задавать их всякий раз и для всякой команды. Что уж говорить о сложных системных службах, свойства которых должны сохраняться не от сеанса к сеансу, а постоянно (в том числе при перезагрузке системы). Вывод прост: профиль необходимо держать в файле, вроде того, что создается по команде «сохранить настройки».

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

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

Одним словом, если есть конфигурационный файл , то должны быть и средства редактирования этого файла. Учитывая, что в Linux реализована высокоразвитая система хранения и переработки (как ручной, так и автоматической) данных в текстовом виде, изобретать какой-то новый формат – все равно что изобретать велосипед. Тем более, что именно текст, разделенный на строки и слова, лучше всего подходит тогда, когда есть четкое деление профиля на объекты управления и их свойства (например, настройки какого-нибудь демона и значения этих настроек). Вдобавок, именно со структурированными текстами отменно управляются текстовые редакторы Linux: Vi, Emacs и др:

Вот как выглядит конфигурационный файл для Vim , написанный Мефодием на основе файла, взятого у Гуревича. Легко заметить, что файл состоит из команд режима командной строки Vi с комментариями (в отличие от большинства утилит Linux, в Vi комментарии начинаются на «»»). Символы » ^O » и » ^M » – это именно соответствующие управляющие символы (вставленные в текстовый файл с помощью » ^V «, см. лекцию 9). Такой конфигурационный файл легко понимать и изменять.

Как уже было замечено, набор переменных окружения составляет особенный профиль , к которому чувствительны все запускаемые программы – в этом его достоинство. Задаются переменные окружения обычно в командном сценарии, который тоже можно рассматривать как конфигурационный файл ). Например, во многих дистрибутивах используется конфигурационный файл .i18n для настройки языковых особенностей клавиатуры, языка вывода сообщений и т. п. 2 Обозначение «i18n» происходит от слова » internationalization «, в котором 20 букв, т. е. «i», «n» и 18 букв между ними. :

Однако хранить настройки специфической программы (не нужные всем остальным) в окружении – не самое удачное решение: синтаксис, задающий переменную окружения , слишком прост ( имя_переменной=значение ), а самих переменных становится слишком много, поэтому при просмотре трудно выделить, какая из них к какой группе настроек относится. Если пытаться упаковать все настройки в значение одной переменной, это значение окажется трудночитаемым, и все преимущество текстового формата сойдет на нет. Например, стандартный конфигурационный файл утилиты ls (точнее, только ее цветовых предпочтений) – /etc/DIR_COLORS (его можно подменить личным файлом

/.dir_colors ) занимает около ста строк вместе с комментариями. Команда ls использует не этот файл, а создаваемую утилитой dircolors переменную LS_COLORS , значение которой – 600-символьная строка без всяких комментариев.

Если профиль слишком велик, держать его в одном конфигурационном файле – значит, доставлять пользователю сомнительное удовольствие разбирать этот файл целиком даже при необходимости внести минимальное изменение. Методов борьбы с неудобочитаемостью несколько. В частности, уже известный по лекции 10 механизм » .d «: файл разделяется на несколько независимых друг от друга файлов так, что редактировать приходится только один из файлов, а программа во время самонастройки считывает все.

Другой способ опирается на то, что изменения, которые пользователь вносит в профиль , как правило, существенно меньше объема всего профиля . Поэтому может быть выгодно хранить все настройки по умолчанию в каком-нибудь файле, менять который вообще не надо, а файл пользовательских настроек использовать как бы «поверх», изменяя профиль в соответствии с ними после того, как выставлен профиль по умолчанию. Дополнительное преимущество такого способа – в том, что пользователь всегда может подглядеть в «большой» файл, чтобы узнать, как оформляется та или иная настройка. Например, утилита updfstab, которая изменяет содержимое /etc/fstab при появлении или удалении съемного дискового носителя (например, лазерного диска), считывает данные из конфигурационного файла /etc/updfstab.conf . Сам этот файл состоит из единственной строки: include /etc/updfstab.conf.default , что приводит к чтению файла с настройками по умолчанию, где задан способ работы со многими съемными устройствами системы. Если администратору нужно как-то изменить поведение updfstab в отношении определенного устройства, он копирует соответствующую группу настроек из updfstab.conf.default в updfstab.conf после строчки include.. . и исправляет их. То, что эти группы настроек читаются дважды, не играет особой роли: чтение коротких файлов выполняется быстро.

Наконец, третий способ сделать конфигурационный файл удобочитаемым — секционирование профиля , когда все настройки разбиваются на группы, каждой группе дается собственное имя, и синтаксис конфигурационного файла проектируется так, чтобы границы групп хорошо различались при просмотре. В сущности, этот способ – предок схемы » .d «, где группе соответствует отдельный файл, однако нередки ситуации, когда разбивать на файлы неудобно (например, если группы не полностью независимы, поэтому может понадобиться редактировать их сразу несколько). Конфигурационный файл утилиты дозвона wvdial , например, секционируется по адресату (провайдеру) плюс отдельная секция «по умолчанию». Сами секции отделяются друг от друга заголовками, заключенными в квадратные скобки:

Утилита wvdial обладает высокоразвитым искусственным интеллектом: она самостоятельно догадывается, какой именно тип идентификации используется на сервере. Например, «с той стороны» может оказаться терминал Linux, которому требуется сначала ввести обыкновенное входное имя и пароль, затем надо получить командную строку, запустить на сервере сетевой демон pppd , и только после этого запустить pppd на собственной машине. Другой вариант: pppd на сервере уже запущен, а настройки «Username» и «Password» означают идентификационную информацию протокола CHAP , используемого pppd . Обо всем этом и о многом другом wvdial способна догадаться,так же как wvdialconf умел определять, какое же из устройств является модемом.

Однако на любой искусственный интеллект найдется непостижимая ему жизненная ситуация. На одном из серверов (секция «Dialer hotspace») тоже стоит программа с зачатками искусственного интеллекта, которая тоже пытается определить, каким способом хочет идентифицироваться позвонивший. Оттого эти два кудесника, созвонившись, все ждут, пока кто-нибудь не проявит себя. Помогает настройка TOnline , которая заставляет wvdial немедленно задействовать протокол ppp , на что сервер, подумавши «ах, ppp!», с облегчением запускает pppd . Остается вопрос: почему эта полезная настройка никак не отражена в документации (ее нашел в исходных текстах программы Гуревич)? Не потому ли, что пара wvdialconf-wvdial не по-Linux-овски стремится все делать за пользователя, а стало быть, пользовательская документация для разработчиков этой программы – не главное?

Идею чтения настроек по умолчанию можно развить. Оказывается, бывает удобно, когда описание настройки помещено не в руководство, а непосредственно в конфигурационный файл в виде комментариев. Тогда при изменении этой настройки пользователь сразу видит, что она собой представляет, при этом отпадает необходимость сначала находить строчку в файле, а потом искать ее же в руководстве. Такой распространенный способ оформления называется самодокументированием профиля . Например, файл /etc/man.conf , управляющий работой команды man , оформлен в самодокументированном стиле:

Мефодий, может быть, и не понял бы сразу, зачем команде man использовать утилиту cmp, однако в поясняющем комментарии написано: когда нужно показать несколько руководств разом, они предварительно сравниваются, и показываются только несовпадающие.

Если пойти еще дальше, то можно создать несколько различных файлов с примерами настроек, чтобы пользователь мог взять один из них и довести до нужного ему состояния. Именно такую – демонстрационную – настройку Мефодий и включил в качестве настройки по умолчанию в свой .vimrc (в первой строке). Кстати, на самом деле профиль Vim весьма сложен, но большинство его настроек по умолчанию находятся в различных файлах дерева каталогов /usr/share/ vim – эдакая «схема .d/.d «, где файлы профиля , соответствующие подгруппам настроек, лежат в подкаталогах, соответствующих группам. Включение определенного настроечного файла может происходить неявно: например, строчка colorscheme desert из .vimrc приводит к чтению /usr/share/ vim /colors/desert. vim .

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

Примеры работы с текстовыми файлами

Пример 1.Дан текстовый файл с именем str.txt. В него занесено несколько строк. Программа считывает строкииз файла и распечатывает их на экран.

Program MyTest10_1;

Uses SysUtils, EsConsole in ‘EsConsole.pas’;

Var F: TextFile ;

Begin

While not eof (f) do

Begin

end;

end.

Пример 2. Дан текстовый файл с именем input.txt, имеющий следующие данные. В первой строке указана размерность массива. Во второй строке содержится число . Начиная с третьей строки, заданы целочисленные элементы одномерного массива. Вывести массив из файла на экран. Вычислить сумму элементов массива от первого до элемента с индексом : и среднее арифметическое значение оставшихся. Создать новый текстовый файл output.txt, в который с соответствующими заголовками поместить исходный массив и результат работы. Перед каждым заголовком вставить по две пустой строке.

Пример исходного и полученного файлов:

program ex2;

Uses SysUtils, EsConsole in ‘EsConsole.pas’;

var f1,f2: textFile;

a: array[1..100] of integer;

Begin

assignFile(f1,’input.txt’); reset(f1);<открываем файл для чтения>

<считываем размер массива и номер элемента>

for i:=1 to n do read(f1,a[i]); <считываем элементы массива>

closeFile(f1);<закрываем исходный файл, он больше не нужен>

assignFile(f2,’output.txt’);rewrite(f2); <открываем новый файл для записи>

<выводим в файл две пустые строкии заголовок>

<заносим в файл элементы массива>

for i:=1 to n do write(f2,a[i],’ ‘);writeln(f2);

<рассчитываем сумму до k-го элемента>

for i:=1 to k do sumk:=sumk+a[i];

<выводим сумму в файл, вставив перед ней две пустые строки>

writeln(f2);writeln(f2);writeln(f2,’sum do ‘,k,’-o elem=’,sumk);

<рассчитываем среднее от k-го элемента>

for i:=k+1 to n do sred:=sred+a[i];

<выводим среднее в файл, вставив перед две пустые строки>

writeln(f2);writeln(f2);writeln(f2,’sred ot ‘,k,’-o elem=’,sred:10:3);

end.

Пример 3. Дан текстовый файл c именем dat.dat, в который занесен массив целых чисел. Найти среди них максимум. Размер матрицы задан в первой строке файла, элементы – начиная со второй строки.

Создать новый текстовый файл, в который вывести исходную матрицу, отступив одну строку вывести максимум и его индексы.

Пример исходного и полученного файлов:

program ex_file;

Uses SysUtils, EsConsole in ‘EsConsole.pas’;

var f:textFile;

matr: array[1..100,1..100] of integer;

Begin

for i:=1 to n do for j:=1 to m do read(f,matr[i,j]);closeFile(f);

for i:=1 to n do begin

for j:=1 to m do write(f,matr[i,j],’ ‘);

end;

for i:=1 to n do for j:=1 to m do

if max

2. ВЫБЕРИТЕ ВЕРНОЕ ОПИСАНИЕ ТЕКСТОВОГО ФАЙЛА:

1) Var t: textfile;

2) Var t: file of string;

3) Var t: filetext;

4) Var t: text of file;

3. КАКИЕ ОПЕРАТОРЫ ЦИКЛА ЖЕЛАТЕЛЬНО ИСПОЛЬЗОВАТЬ ПРИ ЧТЕНИИ ИНФОРМАЦИИ ИЗ ТЕКСТОВОГО ФАЙЛА:

Практические задания

Задание 1: работа с текстовыми файлами (контрольное)

Получение практических навыков работы с текстовыми файлами.

Задать текстовый файл input1.txt, содержащий несколько строк. Определить, сколько строк содержится в этом файле, сколько символов «v» содержится во второй строке. Результаты заносятся в отдельный текстовый файл output1.txt по следующему формату:

Исходный текст

Кол-во строк=

Символов v=

Исходный файл данных создать в редакторе Блокнот.

Задание 2: работа с текстовыми файлами (контрольное)

Закрепление практических навыков работы с текстовыми файлами.

Задать текстовый файл input2.txt, содержащий несколько строк. Произвести указанные действия с файлами. Результаты заносятся в отдельный текстовый файл output2.txt обязательно с соответствующими заголовками и согласно формату, указанному в задании.

Исходный файл данных создать в редакторе Блокнот.

Варианты заданий

1 вариант.1. Определить количество слов в файле. Отступить две строки. 2. Определить, с какого символа начинается третья строка. Если файл содержит всего две строки, вывести сообщение об этом.

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

3 вариант.1. Определить количество символов «о» в строках файла, если таких символов нет, вывести сообщение. Отступить три пустых строки. 2. Определить, сколько слов в третьей строке файла, если файл содержит меньшее количество строк, вывести сообщение в файл.

4 вариант.1. Убрать пробелы в строках и занести полученные строкив новый файл. Отступить одну строку. 2. Определить длину полученных строк. Каждое число вывести с новой строки.

5 вариант. 1. Заменить символ «а» на символ «о», переписать полученные строкив новый файл. Если такого символа нет в исходном файле, вывести об этом сообщение. Отступить 2 строки. 2. Вывести свою фамилию в файл.

6 вариант. 1. Переписать строкив новый файл, вставляя в начало каждой строки по одному пробелу. Отступить 3 строки. 2. Определить, с какого символа начинается второе слово в первой строке, если такого слова нет, вывести сообщение.

7 вариант.1. Записать строкииз исходного файла в новый в перевернутом виде. Отступить 3 строки. 2. Определить, сколько символов «.» содержит исходный файл, если таких нет, вывести сообщение.

8 вариант.1. Определить длину четвертой строкиисходного файла, если файл содержит меньшее количество строк, вывести сообщение об этом. Отступить 4 строки. 2. Вывести первую строку без первого символа.

9 вариант.1. Определить количество строк в исходном файле. 2. Если строка одна, переписать ее в новый файл так, чтобы на строке было по одному символу. Если строк больше, склеить их в одну строку.

10 вариант.1. Определить количество пробелов в исходном файле. 2. Если их количество четное, то вывести первую строку; если нечетное – вторую. Если пробелов нет или файл содержит всего одну строку, вывести сообщение об этом.

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

12 вариант.Дан текстовый файл. В каждой строке перенести последний символ в начало строки.

Задание 3: обработка текстовых файлов, содержащих одномерные массивы (контрольное)

Освоение работы с текстовыми файлами для хранения и обработки одномерных массивов чисел.

Определить, сколько всего элементов содержится в текстовом файле input3.txt. Результат вывести в новый файл output3.txt.

1. Исходные данные задать как текстовый файл в экранном редакторе Блокнот. Данные целого типа находятся в первой строке файла через пробел.

2. Файл отчета должен содержать исходный массив с заголовком и результат решения:

massiv:

itog=

Задание 4: обработка текстовых файлов, содержащих одномерные массивы

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

Написать программу для обработки исходных файлов данных согласно индивидуальному варианту задания.

1. Исходные данные задать как текстовый файл в экранном редакторе Блокнот. Массив должен содержать как положительные, так и отрицательные элементы.

2. В первой строке содержится число, указывающее размер массива, элементы массива задаются через пробел, начиная со второй строки.

3. Файл отчета должен содержать исходный массив с заголовком и результат решения.

Варианты заданий

1 вариант. Определить количество положительных и отрицательных элементов в массиве. Отступить 2 строки. Вывести только положительные элементы и их сумму.

2 вариант.Определить количество положительных и отрицательных элементов в массиве. Отступить 4 строки. Вывести только отрицательные элементы, расположенные до 4-го элемента включительно. Если таких нет, вывести сообщение.

3 вариант.Определить количество положительных и отрицательных элементов в массиве. Отступить 1 строку. Вывести все элементы по абсолютной величине и их сумму от 3-го до 7 –го элемента. Если элементов в массиве меньше, вывести сообщение об этом.

4 вариант.Определить количество положительных и отрицательных элементов в массиве. Отступить 3 строки. Вывести сумму элементов, имеющих четный порядковый номер. Если она равна нулю, вывести в виде сообщения.

5 вариант. Определить количество положительных и отрицательных элементов в массиве. Отступить 2 строки. Вывести набор тех чисел, чье количество больше. Если их одинаковое количество, вывести соответствующее сообщение.

6 вариант. Определить количество положительных и отрицательных элементов в массиве. Отступить 5 строк. Вывести только отрицательные элементы и их среднее арифметическое значение.

7 вариант.Определить количество положительных и отрицательных элементов в массиве. Отступить 4 строки. Вывести элементы по абсолютной величине превосходящие число 5. Если таких нет, вывести сообщение об этом.

8 вариант.Определить количество положительных и отрицательных элементов в массиве. Отступить 2 строки. Вывести только положительные элементы, расположенные между 3-им и 8-м элементами. Если таких элементов нет или массив содержит меньшее количество элементов, вывести сообщение.

9 вариант.Определить количество положительных и отрицательных элементов в массиве. Отступить 3 строки. Вывести их сумму. Отступить 2 строки. Разделить каждый элемент на сумму, занести полученные значения в файл. Если она равна нулю, вывести сообщение об этом.

10 вариант.Определить количество положительных и отрицательных элементов в массиве. Отступить 1 строку. Определить сумму положительных элементов. Отступить 1 строку. Определить количество отрицательных элементов, по абсолютной величине меньших числа 3. Если таких элементов нет, вывести сообщение об этом.

11 вариант. Определить количество отрицательных и положительных элементов в массиве. Отступить 6 строк. Вывести только положительных элементы и их среднее арифметическое значение.

12 вариант.Определить количество отрицательных и положительных элементов в массиве. Отступить 2 строки. Вывести элементы по абсолютной величине превосходящие число 9. Если таких нет, вывести сообщение об этом.

Задание 5: обработка текстовых файлов, содержащих матрицы (контрольное)

Получение навыков работы с текстовыми файлами для хранения и обработки двумерных массивов чисел.

1. Создать программу, которая создает текстовый файл, содержащий матрицу размера . Первая строка файла содержит размерность. Элементы матрицы – целые числа в интервале располагаются по строкам, начиная со второй строкифайла.

2. Написать программу, которая определяет минимум первой строкиматрицы и максимум последней строки.

1. Первая программа использует: матрицу , элементы которой задаются случайным образом; текстовый файл, в котором первая строка содержит два числа – Размерность матрицы, а элементы матрицы записаны, начиная со второй строки, в виде таблицы (стандартное отображение матрицы) (см. пример 3).

2. Вторая программа считывает данные из файла, используя переменную типа двумерный массивс элементами целого типа. Результат выводится на экран.

Задание 6: обработка текстовых файлов, содержащих матрицы

Закрепление навыков работы с текстовыми файлами для хранения и обработки двумерных массивов чисел.

1. Создать программу для задания исходных данных.

2. Написать программу для обработки исходных файлов данных.

1. Исходные данные задать как текстовый файл в экранном редакторе Блокнот.

2. Обработку вести, используя переменную типа, указанного в задании.

Варианты заданий

1 вариант.В данной действительной квадратной матрице порядка N найти наименьший элемент. Получить квадратную матрицу порядка N-1 путем выбрасывания из исходной матрицы строкии столбца, на пересечении которых расположен элемент с найденным значением.

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

3 вариант.Даны целочисленная матрицаразмера N x M, целые числа k, t (1£ k £N, 1£ t £N, k ¹ t). Преобразовать матрицу так, чтобы строка с исходным номером k непосредственно следовала за строкой с исходным номером t, сохранив порядок следования остальных строк.

4 вариант.Даны действительная матрицаразмера N x M (N

Дата добавления: 2020-12-06 ; просмотров: 641 | Нарушение авторских прав

Как быстро и эффективно редактировать файлы конфигурации в Linux

Оригинал: How to Effectively and Efficiently Edit Configuration Files in Linux
Автор: Jack Wallen
Дата публикации: 30 сентября 2020 г.
Перевод: А.Панин
Дата перевода: 3 декабря 2020 г.

Jack Wallen описывает инструменты с интерфейсом командной строки, которые значительно повышают эффективность работы с файлами конфигурации.

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

На самом деле, все не так печально. Фактически, большинство администраторов Linux-систем выполняют задачи, связанные с отладкой или конфигурацией приложений с большим энтузиазмом. Исследование особенностей функционирования серверов и прикладных приложений является отличным времяпрепровождением. При этом описанные действия не должны осуществляться с помощью малоэффективных инструментов. Стоит помнить о том, что каждому систмному администратору доступны специализированные инструменты, которые претерпели множество эволюционных изменений с целью максимального упрощения процесса редактирования файлов конфигурации. Я собираюсь описать несколько таких инструментов, позволяющих немного упростить вашу профессиональную деятельность в роли администратора Linux-систем. В первую очередь я предлагаю обсудить инструменты с интерфейсом командной строки, которые просто необходимы в том случае, если вы хотите оптимизировать процесс редактирования файлов конфигурации системы.

Ну что же, давайте приступим к рассмотрению описанных инструментов.

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

Представьте, что у вас имеются два файла конфигурации. Файл File1 содержит следующий текст:

Файл File2 — следующий текст:

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

Благодаря существованию утилиты diff мы сможем без каких-либо сложностей найти различия между этими файлами. Если мы откроем окно терминала и выполним с помощью него команду diff File1 File2 , мы увидим следующий вывод, четко отражающий различия между ними (Рисунок 1).

Рисунок 1: Утилита diff выводит информацию о различиях между файлами File1 и File2.

Вам следует обращать особое внимание на буквы a , c и d , причем:

  • a обозначает, что строка была добавлена
  • c обозначает, что строка была изменена
  • d обозначает, что строка была удалена

В данном примере несложно обнаружить строку вывода 1c1 , которая обозначает, что строка 1 была изменена во втором файле.

Вывод утилиты diff является немного неочевидным, так как он предназначен для чтения специализированным программным обеспечением, а не людьми. Эта утилита была разработана с целью получения информации о том, как нужно модифицировать файлы для того, чтобы синхронизировать их содержимое. Однако, важно понимать, что в ее выводе отражаются лишь те строки файлов, которые различаются. В нашем примере все строки файлов являются идентичными за исключением их первых строк, точнее их фрагментов, а именно «/var/www» в первом файле и «/var/www/html» во втором. Использование утилиты diff значительно упрощает поиск различий между двумя файлами конфигурации. Конечно, утилита diff является гораздо более сложной, но понимание данного фундаментального приема ее использования может значительно облегчить задачу поиска различий в файлах.

Мы можем изменить содержимое файла File2 следующим образом:

В этом случае вывод утилиты diff будет более сложным. Чтобы упростить его, мы можем выполнить команду diff -c File1 File2 . Параметр c позволяет активировать контекстный формат вывода, который гораздо проще читается (Рисунок 2).

Рисунок 2: Более сложный вывод команды diff в более простом для понимания формате благодаря наличию параметра c.

В данном случае утилита diff выводит информацию о том, что строки 1 и 4 из файла File1 и строки 1 и 3 файла File2 отличаются. Теперь вы можете внести все необходимые изменения в них.

Утилита grep наверняка является одной из первых утилит, изученных вами в процессе подготовке к исполнению обязанностей администратора Linux-систем. Без нее вы будете, как в известной поговорке, искать иголку в стогу сена, особенно при редактировании сложных файлов конфигурации. Представьте, что вам нужно, к примеру, деактивировать директиву EnableSendfile в файле конфигурации веб-сервера Apache из состава дистрибутива CentOS. В этом случае вы можете либо открыть файл конфигурации /etc/httpd/httpd.conf с помощью любого текстового редактора и прокручивать его содержимое до момента появления нужной директивы, либо выполнить команду grep -n EnableSendfile /etc/httpd/conf/httpd.conf .

Утилита grep всего лишь выводит номера строк, которые совпадают с поисковым запросом. Да, все настолько просто. Однако, в случае добавления параметра -n она будет также выводить номера строк, в которых встречается поисковый запрос. В нашем случае утилита grep сообщает нам о том, что директива EnableSendfile встречается в строках под номерами 340, 346 и 349 (Рисунок 3).

Рисунок 3: Использование утилиты grep для поиска директивы в файле конфигурации.

Если вы используете такой текстовый редактор, как nano , для редактирования файлов конфигурации, вы можете открыть файл /etc/httpd/conf/httpd.conf , пролистать его содержимое немного вниз и воспользоваться сочетанием клавиш Ctrl+c для получения информации о текущем номере строки. Вам придется пролистывать содержимое файла до появления строки, которую нужно отредактировать. Также вы можете открыть этот файл в nano с использованием параметра -c для постоянного вывода номера текущей строки (без необходимости использования упомянутого сочетания клавиш — Рисунок 4).

Рисунок 4: Текстовый редактор nano выводит номер текущей строки.

Утилита grep является чрезвычайно мощной. Обратитесь к странице руководства (man grep) для получения информации обо всех возможностях данного полезного инструмента.

Подбор подходящего текстового редактора с графическим интерфейсом

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

Представьте, что вы открыли файл конфигурации /etc/httpd/conf/httpd.conf с помощью GEdit. Так как данный файл конфигурации является по своей сути обычным текстовым файлом, GEdit будет использовать режим подсветки синтаксиса «Текст» после его открытия (другими словами, вообще не будет активировать механизм подсветки синтаксиса). Вы можете выбрать подходящий режим подсветки синтаксиса с помощью раскрывающегося меню в строке состояния в нижней части окна. Если вы выберите режим «PHP», будет осуществляться подсветка всех синтаксических конструкций данного языка программирования, а также тэгов HTML (Рисунок 5).

Рисунок 5: Активация механизма подсветки синтаксиса для упрощения процесса редактирования файла конфигурации.

На данный момент существует огромное количество достойных текстовых редакторов, которые могут немного упростить процесс редактирования сложных файлов конфигурации. Начните работу с инструмента, поставляемого в составе вашего окружения рабочего стола по умолчанию и оцените его пригодность для выполнения описанной работы в вашем случае. Если вас не устроит данный инструмент, вы всегда сможете открыть менеджер пакетов программного обеспечения и найти текстовый редактор, который удовлетворит все ваши потребности (такой, как Sublime Text , Geany или Leafpad ).

Не позволяйте системе подавить вас

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

Работа с текстовыми файлами

Работа с текстовыми файлами

Программа и данные

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

Откуда берутся входные данные? Они могут задаваться пользователем в ходе решения задачи. Можно считать, что в этом случчае организуется диалог пользователя и программы. В консольных проектах инциатором диалога является программа. В Windows – проектах инициатором является пользователь.

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

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

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

В программировании файлом называют множество элементов, сохраняемых во внешней памяти. Элементы файла называюся записями.

В более общем контексте файлом называют собранную, сброшюрованную коллекцию бумаг, документов. В английском языке одно из значений слова «file» — это иголочка, на которую накалывают чеки, в русском – файлом называют папочку для хранения бумаг.

Одним из наиболее распространенных видов файлов в програмировании являются текстовые файлы, в которых каждая запись рассматривается как строка текста. Данные, читаемые с консоли, или выводимые на консоль, могут рассматриваться как текстовые файлы, над которыми определены операции ReadLine и WriteLine. Первая из этих операций читает очередную запись файла – строку текста. Вторая – записывает в файл очередную запись.

Создание текстового файла

Создать текстовый файл можно программно или в любом текстовом редакторе, например в Блокноте. При работе в среде Visual Sudio можно создать текстовый файл, не выходя из среды. Для этого достаточно в меню выбрать Файл/Создать/Файл.. В результате откроется текстовый редактор – аналог Блокнота, в котором можно создавать записи.

Нужно помнить одну важную особенность работы с текстовыми файлами при программировании на C#. Текстовые файлы должны сохраняться в формате UTF-8 (Unicode Text Format). Поэтому при сохранении файла нужно установить корректную кодировку. При работе в Блокноте нужно выбрать соответствущую кодировку на вкладке «Кодировка». При работе в среде Visual Sudio прежде чем сохранять файл из меню нужно выбрать Файл/Дополнительные параметры кодировки… В открывшемся окне установить требуемую кодировку.

Программное создание текстового файла рассмотрим чуть ниже.

Открытие текстового файла для чтения

Предположим, что текстовый файл уже создан. Как можно прочесть записи этого файла в нашей программе на C#?

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

После завершения чтения файла его следует закрыть и освободить соответствующий ресурс.

Давайте подробнее рассмотрим этот процесс работы с текстовым файлом в консольном проекте. Первым делом создайте консольный проект, например, с именем ConsoleTextFile. В построеном по умолчанию классе Program в разделе using добавьте ссылку на пространство имен

Пространство имен IO (Input / Output) содержит множество полезных классов для работы с файлами.

В поле класса Program объявите объект input, представляющий текстовый файл для чтения:

/// Входной файл для чтения

static StreamReader input;

Чтобы не перегружать процедру Main, выполняя непосредственно в ней все работы, связанные с файлом, разобъем нашу задачу на подзадачи. Для каждой задачи зададим свой метод, а в процедуре Main будем вызывать эти методы.

Первым делом добавим в Main пару строчек:

//Открыть файл для чтения

Булевская переменная found будет принимать значение true, если файл удалось открыть, и false – в случае неудачи. Метод OpenReadFile обеспечивает открытие файла. Вот как он выглядит:

/// Путь к файлу input задан явно

/// true, если файл успешно открыт

static bool OpenReadFile()

//Задать путь к директории, хранящей проект и файл для чтения

//Проверка существования файла в указанной директории

//Открытие текстового файла для чтения

input = new StreamReader(path);

Console.WriteLine(«Файл открыт для чтения»);

Console.WriteLine(«Ошибка в задании пути файла!»);

Конструктор класса StreamReader создает программный объект input и связывает его с физическим файлом. Эта операция успешна, если путь к текстовому файлу указан правильно. Поскольку ошибки при выполнении этой операции могут возникать достаточно часто (файл удален, перемещен или путь к нему указан неверно), то предусмотрена проверка существования файла. При проверке используется статический метод Exist класса File, возвращающий true, если файл существует для указанного пути, false – если файла нет.

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

Обработка записей текстового файла

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

Другой способ основан на использовании свойства EndOfStream, которым обладает наш объект input класса StreamReader. Это булевское свойство возвращает значение true при достижении конца файла, так что несложно организовать цикл:

Добавим в Main еще пару строк текста:

//чтение и обработка файла

Если файл успешно открыт, то его можно прочесть и обработать, а завершив обработу, файл следует закрыть. Метод ReadingFile выполняет чтение и обработку файла. В данном примере метод устроен просто. Предполагается, что файл в первой строке содержит число реальных записей. Поэтому вначале читается первая строка, после чего становится известным значение n – число реальных записей. Далее в цикле по n читаются строки файла. Обработка строки в данном случае свдися к выводу ее на консоль. Вот текст этого метода:

/// Чтение и обработка файла

static void ReadingFile()

// первая строка файла содержит число далее идущих строк

/// Чтение и обработка файла

static void NextReading()

Console.WriteLine(«Повторное открытие и чтение файла»);

string current = input.ReadLine();

//обработка записи — вывод ее на консоль.

Программное создание текстового файла

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

Добавим в поля класса Program объект output, задающий файл с выходными данными, и другие объекты, используемые при работе с файлами:

/// Выходной файл для записи

static StreamWriter output;

static string path;

/// число записей в файле —

В процедуру Main добавим вызов метода открывающего файл для записи:

//Открыть файл для записи

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

/// Открытие файла на запись.

/// Если файл не существует, он будет создан

/// Если файл существует он будет переписан

/// Добавление записей в конец файла закомментировано

static void OpenWriteFile()

//Получить путь к директории, хранящей проект и файл для записи

//Открытие для добавления записей в конец файла

// output = new StreamWriter(path, true);

//Открытие текстового файла, старые записи удаляются

output = new StreamWriter(path);

//Создание текстового файла для записи в файл

output = new StreamWriter(path, true);

Console.WriteLine(«Файл открыт для записи»);

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

Процедура WritingFile осуществляет запись в файл:

static void WritingFile()

// первая строка файла содержит число далее идущих строк

Илон Маск рекомендует:  Что такое код socket_set_timeout
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL