- Работа с файлами в си ввод и вывод в файл в си
- Работа с файлами в си
- Считывание информации из текстового файла в Си
- Оператор fscanf()
- Построковое считывание информации из файла в СИ.Функция fgets ( )
- Запись информации в текстовый файл в Си
- Как сохранить в текстовый файл вывод командной строки Windows
- Использование перенаправления выполнения команд
- Ввод данных из файла и вывод в файл
- Открытие и закрытие файлов
- Чтение из текстового файла и запись в него
- fscanf()
- fgets()
- getc() или fgetc()
- Запись в текстовый файл
- Чтение из двоичного файла и запись в него
- Вывести строку файла утилита
- 1.1. cat, tail, head, tee: Команды для вывода содержимого файлов
- 1.2. grep: Поиск строк в файлах
- 1.3. egrep: Регулярные выражения и фильтрование
- 1.4. wc: Подсчет элементов в файлах
- 1.5. sort: Сортировка содержимого файла
Работа с файлами в си ввод и вывод в файл в си
Работа с файлами в си
В этой статье мы узнаем, как считывать данные из файлов и записывать информацию в файлы в программах си. Файлы в си используются для того, чтобы сохранять результат работы программы си и использовать его при новом запуске программы . Например можно сохранять результаты вычислений , статистику игр.
Чтобы работать с файлами в си необходимо подключить библиотеку stdio.h
#include
Чтобы работать с файлом в си необходимо задать указатель на файл по образцу
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
Оператор fscanf()
Для считывания слова из файла в си используется команда fscanf(). Эта команда аналогична команде ввода информации с клавиватуры в си scanf() только первый параметр это указатель на файл
fscanf(указатель на файл,»%формат ввода данных1% форматввода данных2…»,&перменная1,&переменная2…);
Например команда
fscanf(fin,»%d%d%d»,&a,&b,&c);
считает из файла, который привязан к указателю на файл fin строку из трех целочисленных переменных
Разберем пример программы, которая считывает из текстового файла data.txt в которые записаны три столбца цифр информацию и записывает ее в массивы. Для каждого столбца информации свой массив. Подробно о работе с массивами в Си.
#include
#include
main()
< int a[10];
int b[10];
int c[10];
int i;
// определяем указатель на файл
FILE *fin;
// открываем файл на чтение
fin = fopen(«C:\\Users\\user\\Desktop\\data.txt», «r»);
// построчное считывание из файла
for (i=0;i
Построковое считывание информации из файла в СИ.Функция fgets ( )
Оператор fscanf() считывает из файла слово , т.е. до первого встречного пробела.
Чтобы считать из файла всю строку из файла в Си используется конструкция
if ( NULL != fgets (строковая переменная, длина строки, указатель на файл ) )
<
действия при считывании строки
>
Например программа на Си которая считывает две строки из файла и выводит их на экран
#include
#include
#include
main()
<
// задаем строковые перменные
char st1[100];
char st2[100];
//определяем указатель на файл
FILE *fin;
// настриваем работу с Кириллицей
setlocale(LC_ALL, «Russian»);
// открываем файл на чтение
fin = fopen(«C:\\data.txt», «r»);
// считываем первую строку из файла
if ( NULL != fgets ( st1, 100, fin ) )
<
// выводим строку на экран
printf(«%s «,st1);>
// считываем вторую строку из файла
if ( NULL != fgets ( st2, 100, fin ) )
<
// выводим строку на экран
printf(«%s\n»,st2);>
// закрываем файл на чтение
fclose(fin);
>
Запись информации в текстовый файл в Си
Для записи данных в файл в Си, необходимо открыть файл в режиме записи
Имя указателя на файл= fopen(«путь к файлу», «w»);
Для записи в строку текстового файла используется команда fprnitf(), которая аналогична команде printf() вывод на экран в си только первый параметр это указатель на файл
fprintf (имя указателя на файл,”%формат ввода”, переменные);
Например запись в файл out.txt значение переменной а
a=10;
fout = fopen(«C:\\Users\\user\\Desktop\\out.txt», «w»);
fprintf (fout,”%d”, a);
Пример программы на си которая запрашивает два числа и записывает в файл out.txt оба эти числа и их сумму
main()
< int a;
int b;
int c;
FILE *fout;
fout = fopen(«C:\\Users\\user\\Desktop\\out.txt», «w»);
printf («введите первое число \n»);
scanf(«%d», &a);
printf («введите второе число \n»);
scanf(«%d», &b);
c=a+b;
fprintf(fout,»%d %d %d»,a,b,c);
getch();
fclose(fout);
>
Вернуться к содержанию Перейти к уроку Ошибки в программах на си
Источник
Как сохранить в текстовый файл вывод командной строки Windows
Командная строка — неизменный компонент любой операционной системы Windows, который берет свое происхождение прямиком от её предка — операционной системы MS-DOS. Данная программа имеет довольно широкие возможности, но сейчас мы поговорим о довольно примитивной вещи — сохранение (по факту — перенаправление) вывода командной строки в текстовый файл.
Использование перенаправления выполнения команд
В случае, если необходимо просто сохранить все, что вывела командная строка в текстовый файл, то нужно после введенной команды добавить символ «>», что приведет к созданию текстового файла и весь вывод командной строки отправится туда. Пример:
Как видно, командная строка не вывела никакого результата введенной команды на экран, но зато сохранила все в файл ping.txt. К сожалению, существуют ограничения перенаправления вывода, которые не позволяют одновременно отображать вывод и в окне командной строки, и сохранять их в текстовый файл. Однако, можно воспользоваться хитростью — сразу по завершению выполнения команды вывести содержимое текстового файла на экран с помощью команды type. Получится что-то следующее:
Если требуется файл не записывать (существующий текстовый файл будет перезаписан), а дописывать (существующий текстовый файл будет дополнен), нужно вместо одного символа «>» использовать два — «>>».
В случае, если в текстовый файл нужно сохранить так же какой-то текст (например, в составе bat файла), то можно воспользоваться комбинацией с командой echo:
Содержимое получившегося текстового файла будет следующим:
Источник
Ввод данных из файла и вывод в файл
Открытие и закрытие файлов
До этого при вводе-выводе данных мы работали со стандартными потоками — клавиатурой и монитором. Теперь рассмотрим, как в языке C реализовано получение данных из файлов и запись их туда. Перед тем как выполнять эти операции, надо открыть файл и получить доступ к нему.
В языке программирования C указатель на файл имеет тип FILE и его объявление выглядит так:
С другой стороны, функция fopen() открывает файл по указанному в качестве первого аргумента адресу в режиме чтения («r»), записи («w») или добавления («a») и возвращает в программу указатель на него. Поэтому процесс открытия файла и подключения его к программе выглядит примерно так:
Примечание. В случае использования относительной адресации текущим/рабочим каталогом в момент исполнения программы должен быть тот, относительно которого указанный относительный адрес корректен. Место нахождения самого исполняемого файла не важно.
При чтении или записи данных в файл обращение к нему осуществляется посредством файлового указателя (в данном случае, myfile).
Если в силу тех или иных причин (нет файла по указанному адресу, запрещен доступ к нему) функция fopen() не может открыть файл, то она возвращает NULL. В реальных программах почти всегда обрабатывают ошибку открытия файла в ветке if , мы же далее опустим это.
Объявление функции fopen() содержится в заголовочном файле stdio.h, поэтому требуется его подключение. Также в stdio.h объявлен тип-структура FILE.
После того, как работа с файлом закончена, принято его закрывать, чтобы освободить буфер от данных и по другим причинам. Это особенно важно, если после работы с файлом программа продолжает выполняться. Разрыв связи между внешним файлом и указателем на него из программы выполняется с помощью функции fclose() . В качестве параметра ей передается указатель на файл:
В программе может быть открыт не один файл. В таком случае каждый файл должен быть связан со своим файловым указателем. Однако если программа сначала работает с одним файлом, потом закрывает его, то указатель можно использовать для открытия второго файла.
Чтение из текстового файла и запись в него
fscanf()
Функция fscanf() аналогична по смыслу функции scanf() , но в отличии от нее осуществляет форматированный ввод из файла, а не стандартного потока ввода. Функция fscanf() принимает параметры: файловый указатель, строку формата, адреса областей памяти для записи данных:
Возвращает количество удачно считанных данных или EOF. Пробелы, символы перехода на новую строку учитываются как разделители данных.
Допустим, у нас есть файл содержащий такое описание объектов:
Тогда, чтобы считать эти данные, мы можем написать такую программу:
В данном случае объявляется структура и массив структур. Каждая строка из файла соответствует одному элементу массива; элемент массива представляет собой структуру, содержащую строковое и два числовых поля. За одну итерацию цикл считывает одну строку. Когда встречается конец файла fscanf() возвращает значение EOF и цикл завершается.
fgets()
Функция fgets() аналогична функции gets() и осуществляет построчный ввод из файла. Один вызов fgets() позволят прочитать одну строку. При этом можно прочитать не всю строку, а лишь ее часть от начала. Параметры fgets() выглядят таким образом:
Такой вызов функции прочитает из файла, связанного с указателем myfile, одну строку текста полностью, если ее длина меньше 50 символов с учетом символа ‘\n’, который функция также сохранит в массиве. Последним (50-ым) элементом массива str будет символ ‘\0’, добавленный fgets() . Если строка окажется длиннее, то функция прочитает 49 символов и в конце запишет ‘\0’. В таком случае ‘\n’ в считанной строке содержаться не будет.
В этой программе в отличие от предыдущей данные считываются строка за строкой в массив arr. Когда считывается следующая строка, предыдущая теряется. Функция fgets() возвращает NULL в случае, если не может прочитать следующую строку.
getc() или fgetc()
Функция getc() или fgetc() (работает и то и другое) позволяет получить из файла очередной один символ.
Приведенный в качестве примера код выводит данные из файла на экран.
Запись в текстовый файл
Также как и ввод, вывод в файл может быть различным.
- Форматированный вывод. Функция fprintf ( файловый_указатель, строка_формата, переменные ) .
- Посточный вывод. Функция fputs ( строка, файловый_указатель ) .
- Посимвольный вывод. Функция fputc() или putc( символ, файловый_указатель ) .
Ниже приводятся примеры кода, в которых используются три способа вывода данных в файл.
Запись в каждую строку файла полей одной структуры:
Построчный вывод в файл ( fputs() , в отличие от puts() сама не помещает в конце строки ‘\n’):
Пример посимвольного вывода:
Чтение из двоичного файла и запись в него
С файлом можно работать не как с последовательностью символов, а как с последовательностью байтов. В принципе, с нетекстовыми файлами работать по-другому не возможно. Однако так можно читать и писать и в текстовые файлы. Преимущество такого способа доступа к файлу заключается в скорости чтения-записи: за одно обращение можно считать/записать существенный блок информации.
При открытии файла для двоичного доступа, вторым параметром функции fopen() является строка «rb» или «wb».
Тема о работе с двоичными файлами достаточно сложная, для ее изучения требуется отдельный урок. Здесь будут отмечены только особенности функций чтения-записи в файл, который рассматривается как поток байтов.
Функции fread() и fwrite() принимают в качестве параметров:
- адрес области памяти, куда данные записываются или откуда считываются,
- размер одного данного какого-либо типа,
- количество считываемых данных указанного размера,
- файловый указатель.
Эти функции возвращают количество успешно прочитанных или записанных данных. Т.е. можно «заказать» считывание 50 элементов данных, а получить только 10. Ошибки при этом не возникнет.
Пример использования функций fread() и fwrite() :
Здесь осуществляется попытка чтения из первого файла 50-ти символов. В n сохраняется количество реально считанных символов. Значение n может быть равно 50 или меньше. Данные помещаются в строку. То же самое происходит со вторым файлом. Далее первая строка присоединяется ко второй, и данные сбрасываются в третий файл.
Источник
Вывести строку файла утилита
Основная часть работы командной строки ведется с файлами. В этом разделе мы рассмотрим, как просматривать и фильтровать содержимое файлов, извлекать из файлов нужную информацию при помощи одной команды и сортировать содержимое файла.
1.1. cat, tail, head, tee: Команды для вывода содержимого файлов
Эти команды имеют почти один и тот же синтаксис: имя_команды[опции] [файл(ы)] , и могут быть использованы в каналах. Все они используются для вывода части файла согласно определенным критериям.
Утилита cat объединяет файлы и выводит результат на стандартный вывод, которым обычно является экран вашего компьютера. Это одна из наиболее часто используемых команд. Например, вы можете использовать:
для вывода содержимого файла журнала почтового демона на стандартный вывод [47] . Команда cat имеет очень полезную опцию ( -n ), которая позволяет вам выводить номера строк.
Некоторые файлы, типа журналов демонов (если они запущены) обычно имеют довольно большой размер [48] и полный их вывод на экран будет не очень полезным. Вообще говоря, вам нужны только несколько строк из файла. Для этого вы можете воспользоваться командой tail . Следующая команда выведет (по умолчанию) последние 10 строк из файла /var/log/mail/info :
Файлы типа журналов обычно динамически изменяются, т.к. демоны постоянно добавляют в них отчеты о совершенных действиях или событиях. Для наблюдения за изменениями в лог-файле в режиме реального времени вы можете воспользоваться преимуществами опции -f :
В этом случае все изменения в файле /var/log/mail/info будут немедленно выводиться на экран. Использование команды tail с опцией -f весьма полезно, когда вам нужно знать, как работает ваша система. Например, наблюдая за файлом журнала /var/log/messages , вы сможете всегда получать обновленную информацию о системных сообщениях и различных демонах.
Если вы используете tail для нескольких файлов, она будет выводить в отдельной строке имена этих файлов перед выводом их содержимого. Работа с опцией -f при этом также возможна, что является ценным дополнением для наблюдения за взаимодействием различных частей системы.
Вы можете использовать опцию -n для вывода последних n строк файла. Например, для вывода последних 2-х строк наберите:
Как и для других команд, вы можете одновременно использовать разные опции. Например, при одновременном использовании опций -n2 и -f вы начнете с двух последних строк файла и будете продолжать наблюдать появление новых строк по мере добавления их в файл журнала.
Команда head похожа на tail , но она выводит первые строки файла. Следующая команда выведет (по умолчанию) первые 10 строк файла /var/log/mail/info :
Как и в случае с tail вы можете указать опцию -n для указания числа выводимых строк. Например, для вывода первых 2-х наберите:
Также вы можете использовать эти две команды совместно. Например, если вы хотите увидеть только строки 9 и 10, вы можете воспользоваться командой, в которой head выберет первые 10 строк из файла и передаст их по каналу в команду tail .
При этом последняя команда возьмет последние 2 строки и выведет их на экран. Таким же способом вы можете выбрать 20-ю от конца файла строку:
В этом примере мы говорим команде tail взять последние 20 строк и передать их по каналу в head . Затем команда head выводит на экран первую строку из полученных данных.
Допустим, что нам нужно вывести на экран результат последнего примера и сохранить его в файл results.txt . Нам может помочь утилита tee . Её синтаксис:
Теперь мы можем изменить предыдущую команду следующим образом:
Давайте рассмотрим еще один пример. Нам нужно выбрать последние 20 строк, сохранить их в файл results.txt , а на экран вывести только первую из них. Тогда мы должны ввести следующее:
У команды tee есть полезная опция ( -a ), которая позволяет вам дописать данные в конец существующего файла.
В следующем разделе мы увидим, как можно использовать команду grep в качестве фильтра для отделения сообщений Postfix от сообщений других служб.
1.2. grep: Поиск строк в файлах
Ни имя команды, ни её аббревиатура (« General Regular Expression Parser » — синтаксический анализатор общих регулярных выражений) не являются интуитивными, однако её действие и использование довольно просты: grep ищет в одном или нескольких файлах шаблон, заданный в качестве аргумента. Её синтаксис:
Если указано несколько файлов, в отображаемом результате их имена будут выводиться перед каждой найденной строкой. Вы можете использовать опцию -h для предотвращения вывода этих имен или вы можете использовать опцию -l для вывода только имен файлов с найденными совпадениями. Шаблон — это регулярное выражение, хотя в большинстве случаев он состоит из одного единственного слова. Наиболее часто используемые опции:
-i : поиск без учета регистра (т.е. игнорирование разницы между верхним и нижним регистром);
-v : обратный поиск. Вывод строк, которые не соответствуют шаблону;
-n : вывод номера строки для каждой из найденных строк;
-w : сообщает grep ‘у, что шаблон должен совпадать со всем словом.
Итак, давайте теперь вернёмся к анализу лог-файла почтового демона. Нам необходимо найти все строки в файле /var/log/mail/info , содержащие шаблон « postfix ». Для этого мы вводим такую команду:
Если нам нужно найти все строки, НЕ содержащие шаблона postfix , нам необходимо воспользоваться опцией -v :
Команду grep можно использовать в каналах.
Допустим, что нам нужно найти все сообщения об успешно отправленных письмах. В этом случае мы должны отфильтровать все строки, добавленные почтовым демоном в файл журнала (содержащие шаблон postfix ), и они должны содержать сообщение об успешной отправке ( status=sent ) [49] :
В этом случае команда grep использована дважды. Это разрешается, но выглядит не совсем красиво. Тот же результат может быть получен при помощи утилиты fgrep . По сути fgrep — это более простой способ для вызова grep -F . Сначала нам нужно создать файл, содержащий шаблоны, записанные в отдельной строке каждый. Такой файл может быть создан следующим образом (мы используем patterns.txt в качестве имени файла):
Проверьте результат командой cat . \n — это специальный шаблон, означающий « новую строку ».
Затем мы вызываем следующую команду, в которой мы используем файл patterns.txt и утилиту fgrep вместо « двойного вызова » команды grep :
Файл ./patterns.txt может содержать сколько угодно шаблонов. Например, для выборки сообщений о письмах, успешно отправленных на адрес peter@mandriva.com , достаточно будет добавить этот электронный адрес в наш файл ./patterns.txt , выполнив следующую команду:
Понятное дело, что вы можете комбинировать команду grep с tail и head . Если нам нужно найти сообщения о предпоследнем электронном письме, отправленном на адрес peter@mandriva.com , мы используем:
Здесь мы применили описанный выше фильтр и отправили результат через канал в команды tail и head . Они выбрали из данных предпоследнее значение.
1.3. egrep: Регулярные выражения и фильтрование
С помощью grep мы ограничены шаблонами и фиксированными данными. Как нам найти все электронные письма, отправленные каждому работнику « ABC Company »? Перечисление всех их электронных адресов будет не такой уж и простой задачей, т.к. мы можем пропустить кого-либо, или нам придется вручную копаться в файле журнала.
Как и в случае с fgrep , grep имеет сокращенный вызов для команды grep -E : egrep . egrep использует регулярные выражения вместо шаблонов, предоставляя нам более мощный интерфейс для « grep’анья » текста.
Вдобавок к тому, что мы упоминали в разделе Раздел 3, «Шаблоны подстановки в командном процессоре» при рассмотрении шаблонов подстановки, вот еще несколько дополнительных регулярных выражений:
[:alnum:] , [:alpha:] и [:digit:] могут быть использованы вместо определения классов самих символов и представляют, соответственно: все буквы плюс все цифры, все буквы (верхний и нижний регистры) и все цифры. У них есть дополнительное преимущество — они включают в себя международные символы и учитывают региональные настройки системы.
[:print:] представляет все символы, которые могут быть выведены на экран.
[:lower:] и [:upper:] представляют все буквы верхнего и нижнего регистров соответственно.
Существует много других доступных классов и вы можете просмотреть их в egrep (1) . Перечисленные выше классы являются наиболее часто используемыми.
После регулярных выражений могут следовать один или несколько различных повторяющихся операторов:
Предшествующий элемент является необязательным, т.е. соответствует ни одному или одному вхождению, но не более одного.
Предшествующий элемент будет соответствовать 0 или более вхождениям.
Предшествующий элемент будет соответствовать одному или более вхождениям.
Предшествующий элемент соответствует ровно n вхождениям.
Предшествующий элемент соответствует n или более вхождениям.
Предшествующий элемент соответствует как минимум n вхождениям, но не более m раз.
Если вы заключите регулярное выражение в квадратные скобки, позже вы сможете восстановить его. Допустим, что вы указали выражение [:alpha:]+ . Оно может представлять слово. Если вы хотите определить дважды повторяющиеся слова, вы можете поместить это выражение в скобки и повторно использовать его с помощью \1 , если это первая группа. У вас может быть до 9 таких « записей ».
Замечание | |
---|---|