Ввод данных из файла и вывод в файл. Урок 18 курса «Основы языка C»

Функция fgets читает строку из указанного потока данных.

Чтение данных из файла

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

  • fread
  • fgets
  • fgetss
  • fgetc
  • readfile
  • file
  • file_get_contents

Функция fread

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

fread (указатель на файл,длина)

Параметр указатель на файл позволяет установить связь с файлом из которого будет происходить считывание. Указатель на файл возникает момент создания нового файла или открытия существующего ($h=fopen()). Параметр длинна позволяет указать количество информации (в байтах), которое будет считано из файла. Длину файла можно узнать при помощи функцииfilesize().

В результате своего выполнения функция fread() возвращает строку со считанной из файла информацией.

<?php
$h = fopen(«my_file.1″,»r+»);
$content = fread($h,filesize(«my_file.1»));
fclose($h);
echo $content;
?>
Строка для записи в файл.

Функция fgets

Работа функции fgets() практически аналогична функции fread() за тем лишь исключением, что в данном случае не обязательно указывать длину файла. Синтаксис у нее следующий:

fgets ( указатель на файл [, длина])

Если параметр длинна не указан, то файл будет считан целиком:

<?php
$h = fopen(«my_file.1″,»r+»);
$content = fgets($h,11);
fclose($h);
echo $content;
?>
Строка для

Функция fgetss

Функция fgetss() позволяет считать данные из файла, параллельно удаляя все встретившиеся HTML теги. Синтаксис fgetss()такой:

fgetss(указатель на файл, длина , допустимые теги])

Следует отметить, что в отличие от функции fgets() в данном случае параметр длина является обязательным.

Рассмотрим пример:

для начала создадим файл file1.txt:

<?
$h=fopen(«file1.txt»,w);
$text=»<h1>Заголовок H1 </h1> <b>Жирный шрифт </b><p>Параграф</p>»;
if (fwrite($h,$text))
echo «файл готов»;
else
echo «произошла ошибка»;
?>
файл готов

А теперь произведем чтение из файла, параллельно удалив все HTML теги, кроме <H1>:

<?php
$h = fopen(«file1.txt»,»r»);
while (!feof ($h))
{
$content = fgetss($h,1024,'<h1>’);
echo $content,»<br>»;
}
fclose($h);
?>

Жирный шрифт Параграф

В данном примере мы производим считывание данных из файла внутри цикла while. Условием выполнение цикла является проверка окончания файла – !feof ($h). Если не произошло окончание файла, то считывается 1024 байта данных из файла, с параллельным удалением всех встречающихся HTML тегов, за исключением <h1>.

Функция fgetc

Функция fgetc() позволяет считать один символ из файла и обладает следующим синтаксисом:

string fgetc ( указатель на файл )

Попробуем считать весь файл посимвольно:

<?php
$h = fopen(«file1.txt»,»r»);
while (!feof ($h))
{
$content = fgetc($h);
echo $content;
}
fclose($h);
?>

Жирный шрифтПараграф

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

Функция readfile

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

readfile ( имя_файла [ use_include_path])

Если используется аргумент use_include_path, то поиск файла будет производиться внутри директории для скриптов по умолчанию (include_path), расположение которой задается в настройках PHP.

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

<?php
$n = readfile («my_file.1»);
echo «<br>».$n;
?>
Строка для записи в файл.
25

Функция file

Функция file() позволяет считать данные из файла, записав их в массив:

file ( имя_файла [ use_include_path])

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

Попробуем считать данные из файла file1.txt при помощи функции file():

<?php
$arr = file («file1.txt»);
foreach($arr as $i => $a)
echo $i,»: «,htmlspecialchars($a), «<br>»;
?>
0: <h1>Заголовок H1 </h1> <b>Жирный шрифт </b><p>Параграф</p>

В данном примере мы использовали функцию htmlspecialchars() для перевода всех символов HTML форматирования в их специальную кодировку для вывода их на экран.

Функция file_get_contents

Функция file_get_contents() позволяет произвести чтение файла в строку и имеет следующий синтаксис:

file_get_contents ( имя_файла [ use_include_path])

В общем–то данная функция не привносит нового функционала в работу с файлами, но все–же рассмотрим пример:

<?php
$a = file_get_contents («file1.txt»);
echo $a;
?>

Жирный шрифтПараграф

Открытие и закрытие файлов

До этого при вводе-выводе данных мы работали со стандартными потоками — клавиатурой и монитором. Теперь рассмотрим, как в языке C реализовано получение данных из файлов и запись их туда. Перед тем как выполнять эти операции, надо открыть файл и получить доступ к нему.

В языке программирования C указатель на файл имеет тип FILE и его объявление выглядит так:

FILE *myfile;

С другой стороны, функция fopen() открывает файл по указанному в качестве первого аргумента адресу в режиме чтения («r»), записи («w») или добавления («a») и возвращает в программу указатель на него. Поэтому процесс открытия файла и подключения его к программе выглядит примерно так:

myfile = fopen(«hello.txt», «r»);

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

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

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

Объявление функции fopen() содержится в заголовочном файле stdio.h, поэтому требуется его подключение. Также в stdio.h объявлен тип-структура FILE.

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

fclose(myfile);

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

Пример 1: Чтение файла построчно функцией readline()

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

Как использовать функцию file.readline()

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

  1. Открываем файл в режиме чтения. При этом возвращается дескриптор файла.
  2. Создаём бесконечный цикл while.
    1. В каждой итерации считываем строку файла при помощи readline().
    2. Если строка не пустая, то выводим её и переходим к следующей. Вы можете проверить это, используя конструкцию if not. В противном случае файл больше не имеет строк и мы останавливаем цикл с помощью break.
  3. К моменту выхода из цикла мы считаем все строки файла в итерациях одну за другой.
  4. После этого мы закрываем файл, используя функцию close.
# получим объект файлаfile1 = open(«sample.txt», «r»)while True: # считываем строку line = file1.readline() # прерываем цикл, если строка пустая if not line: break # выводим строку print(line.strip())# закрываем файлfile1.close

Вывод:

Привет!Добро пожаловать на PythonRu.Удачи в обучении!

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

В этой статье мы узнаем, как считывать данные из файлов и записывать информацию в файлы в программах си. Файлы в си используются для того, чтобы сохранять результат работы программы си и  использовать его при новом запуске программы . Например можно сохранять результаты вычислений , статистику игр.
Чтобы работать с файлами в си необходимо подключить  библиотеку stdio.h
#include <stdio.h>
Чтобы работать с файлом в си необходимо задать  указатель на файл по образцу
FILE *имя указателя на файл;
Например  
FILE *fin; 
Задает  указатель  fin на файл
Дальше необходимо  открыть файл и привязать его к файловому указателю. Для открытия файла в си на чтение  используется команда
Имя указателя на файл= fopen(«путь к файлу», «r»);
Например следующая команда
fin = fopen(«C:\Users\user\Desktop\data.txt», «r»);
откроет файл  data.txt, находящийся на рабочем столе  по пути C:UsersuserDesktop Чтобы узнать путь к файлу можно выбрать файл мышью нажать на правую кнопку мыши и выбрать свойства файла. В разделе Расположение будет указан путь к файлу. Обратите внимание , что в си путь указывается с помощью двух слешей. 
После работы с файлом в си , необходимо его закрыть с помощью команды
fclose(имя указателя на файл)

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

Чтобы можно было считывать русские символы из файла, необходимо настроить работу с Кириллицей с помощью команды
setlocale(LC_ALL, «Russian»);

При этом необходимо в начале программы подключить #include <iostream>

Опции-параметры для открытия файлов

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

  • wb — запись бинарного файла.
  • rb – чтение бинарного файла.
  • ab – продожение записи.
  • w+b – создается бинарный файл для чтения и записи.
  • r+b – чтение или запись бинарного файла.
  • a+b – если файл отсутствует, то создается, если присутствует и заполнен, то продолжение записи.

Те же параметры применяются и для текстовых файлов, только без символа «b». Режимы задаются чтобы расширить возможности манипуляций с файлом и ограничить их до чтения или только записи. Также режимы задают формат файла — бинарный или текстовый. Неправильно установленный режим может привести либо к ошибке, либо к некорректной интерпретации файла.

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

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

#include <stdio.h>#include <conio.h>#include <stdlib.h>#define ERROR_OPEN_FILE -3void main() { FILE *file; char buffer[128]; file = fopen(«C:/c/test.txt», «w»); if (file == NULL) { printf(«Error opening file»); getch(); exit(ERROR_OPEN_FILE); } fprintf(file, «Hello, World!»); freopen(«C:/c/test.txt», «r», file); if (file == NULL) { printf(«Error opening file»); getch(); exit(ERROR_OPEN_FILE); } fgets(buffer, 127, file); printf(«%s», buffer); fclose(file); getch();}

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

…FILE *inputFile, *outputFile; unsigned m, n; unsigned i, j; inputFile = fopen(INPUT_FILE, READ_ONLY); if (inputFile == NULL) { printf(«Error opening file %s», INPUT_FILE); getch(); exit(3); } outputFile = fopen(OUTPUT_FILE, WRITE_ONLY); if (outputFile == NULL) { printf(«Error opening file %s», OUTPUT_FILE); getch(); if (inputFile != NULL) { fclose(inputFile); } exit(4); }…

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

Чтение из двоичного файла и запись в него

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

При открытии файла для двоичного доступа, вторым параметром функции fopen() является строка «rb» или «wb».

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

Функции fread() и fwrite() принимают в качестве параметров:

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

Эти функции возвращают количество успешно прочитанных или записанных данных. Т.е. можно «заказать» считывание 50 элементов данных, а получить только 10. Ошибки при этом не возникнет.

Пример использования функций fread() и fwrite():

#include <stdio.h>#include <string.h> int main () { FILE *file; char shelf1[50], shelf2[100]; int n, m;  file = fopen(«shelf1.txt», «rb»); n=fread(shelf1, sizeof(char), 50, file); fclose(file);  file = fopen(«shelf2.txt», «rb»); m=fread(shelf2, sizeof(char), 50, file); fclose(file);   shelf1[n] = ; shelf2[m] = n; shelf2[m+1] = ;  file = fopen(«shop.txt», «wb»); fwrite(strcat(shelf2,shelf1), sizeof(char), n+m, file); fclose(file); }

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

  1. Напишите программу, которая запрашивает у пользователя имя (адрес) текстового файла, далее открывает его и считает в нем количество символов и строк.
  2. Напишите программу, которая записывает в файл данные, полученные из другого файла и так или иначе измененные перед записью. Каждая строка данных, полученная из файла, должна помещаться в структуру.

Курс с решением части задач:
android-приложение, pdf-версия

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: