Меню сайта
Наш опрос
Оцените мой сайт
Всего ответов: 5
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Главная » 2014 » Июль » 22 » Занятие 13. Азы работы с файлами и потоками. Случайные числа.
16:04
Занятие 13. Азы работы с файлами и потоками. Случайные числа.
Добрый день друзья. Не знаю как вас, а меня жутко раздражает одна штука. Вот вам еще не надоело, каждый раз, когда проверяете свою программу вводить заново исходные данные с клавиатуры? Меня этот факт всегда печалил. Хочется быстрее посмотреть, как работает программа, а тут тебе бац, такая засада – снова данные надо вводить. Я думаю пора с этим покончить, тем более для этого у нас уже достаточно знаний и средств.  Так что, сегодняшний мини-урок будет посвящен именно решению этой проблемы.Не далее, как полтора года назад, я рассказывал вам о стандартных потоках ввода и вывода. Для тех, кто подзабыл, рекомендую повторить материалы занятия про ввод и вывод данных. Теперь еще потренируем свою память. Что вы помните об авгиевых конюшнях?  Ну вспоминайте-вспоминайте. Если никак я напомню.  Был такой персонаж – Геракл. Большой силач, как утверждают некоторые. Так вот, встала перед ним однажды задачка, почистить конюшни, которые 30 лет никто не чистил. История умалчивает, но возможно Геракл, был первым, кто реально мог на себе почувствовать, что значит быть «по уши в дерьме». Говорят здоровяки обычно тупые. Это было явно не про нашего героя. Хитрый Геракл, перегородил   рядом протекающую речку,  направив поток воды в эти самые конюшни. Водичка за день вымыла весь навоз.  Много воды утекло с тех пор. Сейчас данная история известна как шестой подвиг Геракла. Кто еще не понял, чего я тут упражняюсь в остроумии, говорю напрямую. Сегодняшнее занятие будет посвящено  перенаправлению стандартных потоков ввода и вывода. Хотя нас, в данной ситуации, больше интересует поток ввода. Перенаправлять потоки мы будем в текстовый файл и из текстового файла соответственно. Мы еще посвятим файлам отдельное занятие, сейчас же коснемся лишь некоторых основных моментов. С текстовым файлом в Си можно работать в нескольких режимах:“r” – режим, при котором мы можем читать информацию из файла. Понятное дело, что файл должен существовать, иначе откуда мы будем читать-то?  “w” – режим,  который создает новый файл для записи в него информации. Если файл уже существовал, то его содержимое удаляется.“a” – режим, при котором создается новый файл для записи в него, либо если файл уже существует, то в отличие от режима “w” вся прежняя информации будет сохранена. А новые данные будут записаны в конец этого файла.“r+” – при данном режиме, файл открывается сразу и для чтения и для записи. То есть мы можем как читать из файла, так и записывать в него информацию. Файл должен существовать.“w+” –  создается новый файл для чтения и записи. Если файл уже существовал, то его содержимое будет удалено. “a+” – файл открывается или создается для чтения и записи информации в него. Вся информация будет записана в конец файла.Каждый режим немного отличается от другого.  В различных ситуациях удобно использовать тот или иной режим работы с файлом.Теперь о потоках. Когда наша программа запускается, у нас уже открыты два стандартных потока: stdin– стандартный поток ввода, изначально связан с клавиатурой.stdout– стандартный поток вывода, изначально связан с монитором.Как отмечалось выше, мы хотим перенаправить наши потоки в текстовые файлы. Для этого предусмотрена функция freopen.На следующем рисунке показан пример её использования.Разберем, что означают её аргументы. Всего их три. Первый аргумент (красный)  - указывает путь к файлу. Двойные кавычки обязательны.  Про двойной обратный слеш отмечу отдельно. Обратный слеш, это начало управляющей последовательности как известно. Но сейчас нам никакие управляющие последовательности не нужны, а  нужен  просто обратный слеш, как символ. В таких случаях используют двойной обратный слеш. Второй аргумент (зеленый) – указывает режим работы с файлом. В нашем случае обычный режим чтения. Двойные кавычки обязательны. Третий аргумент (синий) – имя потока.Что делает функция freopen.  Данная функция, открывает файл (указанный в первом аргументе) с заданным режимом (второй аргумент) и связывает его с потоком, который указан в третьем аргументе.Получается в нашем случае, мы открываем для чтения файл 1.txt , хранящийся на диске D, и связываем его со стандартным потоком ввода. Естественно я не привожу сейчас полный синтаксис данной функции, кому интересно может посмотреть его в любом справочнике. Для новичков этих данных более чем достаточно.Вы уже осознали масштабы, которые открывает нам эта функция?  Допустим мне нужно ввести в программу 100 целых чисел, сохранить их в массив. Для дальнейшей работы с ними. Если я буду каждый раз запускать программу и вводить заново 100 чисел, у меня на это уйдет больше времени, чем на исправление ошибок. Теперь же мы можем, просто записать их один раз в файл и пользоваться им в дальнейшем. Ниже пример. Листинг 13.1#include<stdio.h> int main(){       freopen("D:\\input.txt","r",stdin);       int arr[30];       for %d",&arr[i]);       for summa elementov massiva %d\n",arr[0]);       return 0;}На следующем рисунке  показан результат работы программы и содержимое файла input.txt. В программе достаточно один раз связать файл с некоторым потоком, и он будет связан с ним, до конца выполнения программы. Аналогично, мы можем связать стандартный поток вывода данных с некоторым файлом. Следует, конечно же, изменить режим работы с файлом. Я обычно использую режим w. Ну и это еще не всё. Файлы это все конечно классно, но вот вводить 100 чисел руками, даже один раз затруднительно. А точнее лениво. Было бы классно, чтобы программа сама как-нибудь заполняла такой файл разными числами.  Решение давно существует. Функция rand(). Данная функция возвращает случайное целое число в диапазоне от нуля до RAND_MAX.  RAND_MAX это зарезервированная константа языка Си, в ней содержится максимальное целое число, которое может быть возвращено функцией rand().Для работы с этой функций, не обходимо подключить заголовочный файл stdlib.h Кстати, этом же файле описана константа RAND_MAX. Вы можете найти этот файл у себя на компьютере, и посмотреть её значение.Рассмотрим простой пример. Необходимо заполнить массив случайными числами.Листинг 13.2#include <stdio.h> #include <stdlib.h> int main(void){       int arr[10];       for(int printf("%d\t",arr[i]);}Результат работы это программы:Теперь рассмотрим, как наложить некоторые ограничения на эту функцию.1. Пусть нам нужны числа, которые больше 100.  Функция rand() выдает нам числа, начиная с нуля. Т.е. самое маленькое число, которое может получиться, будет нуль. Если мы прибавим к возвращаемому значению rand() число 100, то  получим левую границу нужного нам множества.В нашей программе мы должны были бы printf("%d\t",arr[i]);}Результат её работы на следующем рисункеС целыми числами разобрались. А как быть с вещественными? Как вариант можно поделить возвращаемое значение на RAND_MAX, при этом не забывайте о коварном свойствеоперации деления описанной в четвертом занятии.float b; Обычная таблица"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin-top:0cm; mso-para-margin-right:0cm; mso-para-margin-bottom:10.0pt; mso-para-margin-left:0cm; line-height:115%; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin;}
Просмотров: 173 | Добавил: admin | Рейтинг: 0.0/0
Всего комментариев: 0
avatar
Форма входа
Календарь
«  Июль 2014  »
ПнВтСрЧтПтСбВс
 123456
78910111213
14151617181920
21222324252627
28293031
Архив записей