Примеры программ в си с файлами

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

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

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

Объект типа FILE в памяти размещается автоматически, эта задача лежит на функциях fopen или tmpfile . Задача высвобождения памяти выполняется функцией fclose .

При подключении заголовочного файла в проект, автоматически создаются три объекта типа FILE* , потоки ввода/вывода и стандартный поток ошибок. К этим потокам можно обратиться через указатели stdin , stdout и stderr .

Программирование на Си урок 37: Работа с файлами в языке Си

Пример: исходный код программы

//пример использования FILE #include int main() < char buffer[100]; FILE * ptrFile = fopen(«file.txt» , «r»); if (ptrFile == NULL) perror («Ошибка открытия файла»); else < while ( !feof(ptrFile) ) // пока не конец файла < if ( fgets(buffer , 100 , ptrFile) != NULL ) // считать символы из файла fputs(buffer, stdout); // вывод на экран >fclose (ptrFile); // закрыть файл > return 0; >

Эта программа считывает данные из текстового файла file.txt и отправляет считанные данные в стандартный поток вывода.

CppStudio.com

Цитата из фантастического фильма «Хроники Риддика»:
«Нет будущего, пока мы не разберемся в нашем прошлом.»

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

Источник: cppstudio.com

18. Файлы в языке Си

Файл – это набор данных, размещенный на внешнем носителе и рассматриваемый в процессе обработки как единое целое. В файлах размещаются данные, предназначенные для длительного хранения. Различают два вида файлов: текстовые и бинарные. Текстовые файлы представляют собой последовательность ASCII символов и могут быть просмотрены и отредактированы с помощью любого текстового редактора. Бинарные (двоичные) файлы представляют собой последовательность данных, структура которых определяется программно. В языке Си имеется большой набор функций для работы с файлами, большинство которых находятся в библиотеках stdio.h и io.h .

18.1. Открытие файла

Каждому файлу присваивается внутреннее логическое имя, используемое в дальнейшем при обращении к нему. Логическое имя (идентификатор файла) – это

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

Язык Си для начинающих / #9 — Работа с файлами

FILE * указатель на файл ;
FILE – идентификатор структурного типа, описанный в стандартной библиотеке
stdio.h и содержащий следующую информацию:
type struct
short level; – число оставшихся в буфере непрочитанных байт;
обычный размер буфера – 512 байт; как только level=0,
в буфер из файла читается следующий блок данных;
unsigned flags; – флаг статуса файла – чтение, запись, дополнение;
char fd; – дескриптор файла, т.е. число, определяющее его но-
мер;
unsigned char hold; – непереданный символ, т.е. ungetc-символ;
short bsize; – размер внутреннего промежуточного буфера;
unsigned char buffer; – значение указателя для доступа внутри буфера, т.е.
задает начало буфера, начало строки или текущее зна-
чение указателя внутри буфера в зависимости от режи-
ма буферизации;
unsigned char *curp; – текущее значение указателя для доступа внутри бу-
фера, т.е. задает текущую позицию в буфере для обме-
на с программой;
unsigned istemp; – флаг временного файла;
short token; – флаг при работе с файлом;
> FILE ;

Прежде чем начать работать с файлом, т.е. получить возможность чтения или записи информации в файл, его нужно открыть для доступа. Для этого обычно используется функция FILE* fopen ( char * имя _ файла , char * режим ); она берет внешнее представление – физическое имя файла на носителе (дискета, винчестер) и ставит ему в соответствие логическое имя.

Физическое имя, т.е. имя файла и путь к нему задается первым параметром – строкой, например, “a:Mas_dat.dat” – файл с именем Mas_dat.dat, находящийся на дискете, “d:\work\Sved.txt” – файл с именем Sved.txt, находящийся на винчестере в каталоге work. Внимание! Обратный слеш (), как специальный символ, в строке записывается дважды.

При успешном открытии функция fopen возвращает указатель на файл (в дальнейшем – указатель файла). При ошибке возвращается NULL . Данная ситуация обычно возникает, когда неверно указывается путь к открываемому файлу. Например, если в дисплейном классе нашего университета указать путь, запрещенный для записи (обычно разрешенным является d:work). Второй параметр – строка, в которой задается режим доступа к файлу:

Читайте также:
Программа опытно экспериментальной работы это

w – файл открывается для записи; если файла с заданным именем нет, то он будет создан; если такой файл существует, то перед открытием прежняя информация уничтожается; r – файл открывается только для чтения; если такого файла нет, то возникает ошибка; a – файл открывается для добавления в конец новой информации; r+ – файл открывается для редактирования данных – возможны и запись, и чтение информации; w+ – то же, что и для r+; a+ – то же, что и для a, только запись можно выполнять в любое место файла; доступно и чтение файла; t – файл открывается в текстовом режиме; b – файл открывается в двоичном режиме. Текстовый режим отличается от двоичного тем, что при открытии файла как текстового пара символов «перевод строки», «возврат каретки» заменяется на один символ: «перевод строки» для всех функций записи данных в файл, а для всех функций вывода символ «перевод строки» теперь заменяется на два символа: «перевод строки», «возврат каретки». По умолчанию файл открывается в текстовом режиме. Пример: FILE *f; – объявляется указатель на файл f; f = fopen («d:\work\Dat_sp.cpp», «w»); – открывается для записи файл с логическим именем f, имеющим физическое имя Dat_sp.cpp, находящийся на диске d, в каталоге work; или более кратко FILE *f = fopen («d:\work\Dat_sp.cpp», «w»);

18.2. Закрытие файла

После работы с файлом доступ к нему необходимо закрыть. Это выполняет функция int fclose ( указатель файла ). Например, из предыдущего примера файл закрывается так: fclose (f); Для закрытия нескольких файлов введена функция, объявленная следующим образом: void fcloseall ( void ); Если требуется изменить режим доступа к файлу, то для этого сначала необходимо закрыть данный файл, а затем вновь его открыть, но с другими правами доступа. Для этого используют стандартную функцию: FILE* freopen (char* имя_файла , char * режим , FILE * указатель_файла ); Эта функция сначала закрывает файл, объявленный указателем_файла (как это делает функция fopen ), а затем открывает файл с именем_файла и правами доступа « режим ». В языке Си имеется возможность работы с временными файлами, которые нужны только в процессе работы программы. В этом случае используется функция FILE* tmpfile (void);

которая создает на диске временный файл с правами доступа «w+b», после завершения работы программы или после закрытия временного файла он автоматически удаляется.

18.3. Запись – чтение информации

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

int fgetc (FILE *f) – считывает и возвращает символ из файла f;
int fputc ( int ch, FILE *f) – записывает в файл f код ch символа.

Построчный ввод-вывод В функциях построчного ввода-вывода происходит перенос из файла или в

файл строк символов:
int fgets ( char *S, int m, FILE *f) – чтение из файла f в строку S m байт;
int fputs ( char *S, FILE *f) – запись в файл f строки S до тех пор, пока
не встретится ‘’, который в файл не перено-
сится и на символ ‘n’ не заменяется.

Блоковый ввод-вывод В функциях блокового ввода-вывода работа происходит с целыми блоками

информации:
int fread ( void *p, int size, – считывает n блоков по size байт каждый из фай-
int n, FILE *f) ла f в область памяти с указателем p (необходимо
int fwrite ( void *p, int size, заранее отвести память под считываемый блок);
– записывает n блоков по size байт каждый из об-
int n, FILE *f) ласти памяти с указателем p в файл f.

Форматированный ввод-вывод производится функциями:

int fscanf (FILE *f, char * формат , – считывает из файла f информацию для
список адресов объектов ) объектов в соответствии с указанными
int fprintf (FILE *f, char * формат , форматами;
– записывает в файл f объекты, указан-
список объектов ) ные в списке в соответствии с формата-
ми.

Источник: studfile.net

Лекция 5. Файлы в Си

Программирование на языке Python (§ 54 - § 61)

Файл — это упорядоченная последовательность однотипных
компонентов, расположенных на внешнем носителе.
Файлы предназначены только для хранения информации, а
обработка этой информации осуществляется программами.
Использование файлов целесообразно в случае:
долговременного хранения данных;
доступа различных программ к одним и тем же данным;
обработки больших массивов данных, которые невозможно целиком разместить
в оперативной памяти компьютера.
Файл, не содержащий ни одного элемента, называется пустым.
Создается файл путем добавления новых записей в конец
первоначально пустого файла.
Длина файла, т.е. количество элементов, не задается при
определении файла.
В языке Си отсутствуют операторы для работы с файлами. Все
необходимые действия выполняются с помощью функций,
включенных в стандартную библиотеку ввода-вывода языка Си
(stdio.h — standart input output).

Читайте также:
Сколько строк напечатает программа var k l integer begin for k 1 to 10 do

3. Буферизация ввода-вывода

Считываемая и записываемая информация представляет собой
последовательность байтов — «поток» (stream).
Поток – это логическое устройство, являющееся источником или
получателем данных.
В зависимости от того, откуда поступает считываемая информация или куда
направляется записываемая информация, поток связывается с соответствующим
устройством ввода вывода (клавиатура, дисплей, принтер и т.п.) или с
именованной областью внешней памяти – файлом, если требуется
долговременно хранить информацию либо получить доступ к хранимой
информации.
При организации ввода-вывода в С используется буферизация, то есть обмен
информацией между программой и внешним устройством происходит не
непосредственно, а через буфер – специально выделяемую системой область
оперативной памяти.
Буферизация ускоряет работу программы из-за уменьшения количества
обращений к внешним устройствам.
В библиотеке описана константа BUFSIZE, величина которой 512:
#define BUFSIZE
512
Для изменения размера буфера предназначены функции setbuf() или setvbuf().

4. Текстовый и бинарный режим работы с файлами

Библиотека stdio.h поддерживает текстовые и бинарные (двоичные)
потоки.
Текстовый поток – это последовательность строк, каждая из которых
заканчивается символом ‘n’. Операционная среда может потребовать
коррекции текстового потока. Например, при вводе текстового потока
система преобразует символы возврат каретки 0x13 и перевод строки
0x10 в одиночный символ ‘n’. При обнаружении в текстовом файле
символа с кодом 26 (0x26), т.е. признака конца файла, чтение файла в
текстовом режиме заканчивается, хотя файл может иметь
продолжение. При выводе текстового потока в среду операционной
системы происходит обратное преобразование.
Бинарный поток – это последовательность не преобразуемых байтов,
представляющих собой некоторые промежуточные данные, которые
обладают тем свойством, что если их записать, а затем прочесть той
же системой ввода-вывода, то будет получена информация,
совпадающая с исходной.

5. Функция fopen

Прежде чем читать или записывать информацию в файл, он должен быть открыт функцией
fopen и тем самым связан с потоком ввода-вывода. Функция открытия потока
возвращает указатель fp на предопределенную в библиотеке stdio.h структуру типа FILE
(содержащую всю необходимую для работы с потоком информацию) при успешном
открытии потока, или NULL в противном случае.
В stdio.h заданы 3 предопределенных потока :
stdin (стандартный поток ввода), stdout (стандартный поток
вывода), stderr (стандартный поток ошибок)
• Вывод данных через stdout и stderr по умолчанию осуществляется на консоль. Ввод
данных через stdin по умолчнию осуществляется через клавиатуру.
• Предопределенные потоки всегда открыты.
При открытии файла указатель на файл связывается с конкретным файлом на диске
(Если файл не может быть открыт по какой-либо причине, функция возвращает NULL. ) :
FILE *fp;
fp = fopen(“спецификация файла”, «способ использования файла»);
“Спецификация файла” (т.е. имя файла и путь к нему) может, например, иметь вид:
«c:\my_prog.txt» — для файла my_prog.txt на диске с: .
“Способ использования файла” — определяет режим открытия файла.

6. Режимы открытия файла.

r — открыть существующий файл для чтения;
w — создать новый файл для записи (если файл с указанным именем существует, то он
будет переписан);
а — дополнить файл (открыть существующий файл для записи информации, начиная с
конца файла, или создать файл, если он не существует);
r+ — открыть существующий файл для чтения и записи;
w+ — создать новый файл для чтения и записи;
a+ — дополнить или создать файл с возможностью чтения и записи;
rb — открыть двоичный файл для чтения;
wb — создать двоичный файл для записи;
аb — дополнить двоичный файл;
r+b — открыть двоичный файл для чтения и записи;
w+b — создать двоичный файл для чтения и записи;
а+b — дополнить двоичный файл с предоставлением возможности чтения и записи;
rt — открыть текстовой файл для чтения;
wt — создать текстовый файл для записи;
at — дополнить текстовый файл;
r+t — открыть текстовой файл для чтения и записи;
w+t — создать текстовый файл для чтения и записи;
a+t — дополнить текстовый файл с предоставлением возможности записи и чтения.
Строки вида r+b можно записывать и в другой форме: rb+.

7. Примеры открытия файлов

FILE *f_in, *f_out;
f_in = fopen («My_file1″,»r»);
f_out = fopen («My_file2″,»w»);

8. Функция fclose

После окончания работы с файлом он должен быть
закрыт. Закрытие файла (текстового или бинарного)
выполняется функцией fclose():
fclose(FILE *fp);
При этом разрывается связь указателя на
файл c внешним набором данных. Освободившийся
указатель можно использовать для другого файла.
При успешном завершении операции функция fclose( )
возвращает значение нуль. Любое другое значение
свидетельствует об ошибке.
Пример:
fclose(f_in);

9. Проверка признака конца файла

При каждой операции ввода/вывода происходит
перемещение указателя текущей позиции в файле,
в какой-то момент указатель достигает конца
файла. Структура типа FILE имеет поле – индикатор
конца файла. Функция feof() проверяет состояние
индикатора конца файла и возвращает значение 0,
если конец файла не был достигнут, или значение,
отличное от нуля, если был достигнут конец файла.
Функция имеет единственный аргумент –
указатель на поток типа FILE.
Вызов функции:
if (! feof(f_in))…
проверяет, что конец файла еще не достигнут.

10. Функции ввода/вывода. Функции fgetc() и fputc().

Функции ввода/вывода.
Функции fgetc() и fputc().
Простейший способ выполнить чтение из файла или
запись в файл – использовать функции getc() или putc().
Функция getc() выбирает из файла очередной символ; ей
нужно только знать указатель на файл:
char Symb = getc(f_in);
Если при обработке достигается конец файла, то
функция getc() возвращает значение EOF(end of file).
Функция putc() заносит значение символа Symb в файл, на
который указывает f_out. Формат вызова функции:
putc(Symb,f_out);

Читайте также:
Программа для настройки эирподс на андроиде

11. Функции fgetc() и fputc().

Функции fgetc() и fputc().
Пример 1. Текст из файла my_char.txt выводится на экран. Если файл не найден, на экран выводится
сообщение «File not found!»:
#include
int main(void)
FILE *ptr;
unsigned char ch;
if ((ptr=fopen(«my_char.txt»,»r»))!=NULL)
ch=fgetc(ptr);
while (!feof(ptr))
printf(«%c»,ch);
ch=fgetc(ptr);
>
fclose(ptr);
>
еlse printf(«nFile not found!»);
return 0;
>
В этом примере для чтения из файла используется переменная ptr. При открытии файла производится проверка.
Если переменной ptr присвоено значение NULL, то файл не найден; на экран выводится соответствующее
сообщение, и программа завершается. Если ptr получила ненулевое значение, то файл открыт. Далее
выполняется чтение символов из файла до тех пор, пока не будет достигнут конец файла (!feof(ptr)).
Прочитанные символы помещаются в переменную ch, а затем выводятся на экран.

12. Функции getc() и putc().

Функции getc() и putc().
Пример 2. Записать в файл буквы, вводимые с клавиатуры.
Ввод продолжается до нажатия клавиши F6 или CTRL/z
(ввод символа EOF – конца файла):
#include
int main(void)
char c;
FILE *out;
out=fopen(«Liter»,»w»);
while ((c=getch( ) )!=EOF)
fputc(c,out);
fclose(out);
return 0;
>

13. Функции fscanf() и fprintf()

Функции fscanf() и fprintf()
Функции fscanf() и fprintf() выполняют форматированный ввод/вывод.
Чтение из файла выполняет функция fscanf():
fscanf(f_in,[строка формата],[список адресов переменных]);
Функция возвращает количество введенных значений или EOF.
Запись в файл осуществляет функция fprintf():
fprintf(f_out,[строка формата],[список переменных, констант]);
Функция возвращает количество выведенных байт (символов) или EOF.
Строка формата функций fscanf() и fprintf() формируется так же, как
при консольном вводе/выводе функциями printf() и scanf().
Следует заметить, что вызов функции
fscanf(stdin,[строка формата],[список адресов переменных]);
эквивалентен вызову
scanf([строка формата],[список адресов переменных]);
Аналогично,
fprintf(stdout, [строка формата],[список переменных, констант]);
эквивалентно
printf([строка формата],[список переменных, констант]);

14. Примеры программ, использующих функции fscanf() и fprintf().

Примеры программ, использующих
функции fscanf() и fprintf().
Пример 1. В программе создается массив, состоящий из четырех целых
чисел. Вывести массив в файл:
#include
#define n 4
int main() int i=0;
int array[n]=;
FILE *out;
out=fopen(«num_arr.txt»,»w»);
for(;i
fprintf(out,»%6d»,array[i]);
fclose(out);
return 0; >
В результате выполнения программы в файл num_arr.txt будет помещена
следующая информация:
4
4 4
4 4 6
4 4 6 6

15. Примеры программ, использующих функции fscanf() и fprintf().

Примеры программ, использующих
функции fscanf() и fprintf().
Пример 2. Имеется файл данных,
содержащий целые числа, разделенные
пробелами. Количество чисел в файле
неизвестно. Требуется найти среднее
арифметическое значение этих чисел.
#include
int main() int S=0, count=0, numb;
FILE *in;
if ((in=fopen(«num_arr.txt»,»r»))!=NULL)
while (!feof(in))
fscanf(in,»%d»,
S+=numb;
count++;
printf(«%dn», numb);
>
Чтение чисел из файла выполняется в
переменную numb до тех пор, пока не будет
достигнут конец файла. Одновременно
ведется подсчет количества прочитанных
символов в переменной count и накопление
double aver=(double)S/count;
суммы прочитанных чисел в переменной S.
printf(«Average=%fn», aver);
Переменные S и count целые, поэтому для
fclose(in);
правильного вычисления среднего
>
арифметического, необходимо выполнить
else
преобразование одной из этих переменных
printf(«nФайл не найден!»);
в формат double.
return 0; >

16. Примеры программ, использующих функции fscanf() и fprintf().

Примеры программ, использующих
функции fscanf() и fprintf().
#include
#include
int main() int bal;
char name[15];
FILE *file;
if ((file = fopen(«1.txt»,»w»)) == NULL)
printf(«Файл невозможно
открыть или создатьn»);
else for(;;) scanf («%d%s»,
if (bal == 0)
break;
fprintf(file,»%d %sn», bal,
name);
>
>
fclose(file);
return 0; >
Пример 3. Ввод имени и балла.
FILE *file;
объявляем указатель на структуру File ( дескриптор файла ).
if ((file = fopen(«1.txt»,»w»)) == NULL)
функция fopen принимает два параметра.
Первый — это имя файла,
второй — режим работы с файлом, в котором он будет открыт.
В нашем режиме, если файл не существует, то он создается,
а если файл уже был, то его содержимое полностью стирается.
Эта функция возвращает указатель на структуру FILE ,
т.е. теперь мы сможем управлять созданным файлом при
помощи нашего указателя file.
Оператор if тут используется, так как идет проверка
указателя на NULL, а NULL может быть, только если файл мы не
смогли открыть.
fprintf(file,»%d %sn», bal, name);
оператор записывает данные в файл.
Принцип действия тот же, какой и у оператора printf, только тут
в начале указывается указатель на файл , в который будет
производится запись данных.
fclose(file);
раз данные мы записали и файл нам больше не нужен,
то смело может закрывать его, тем самым освобождая ресурсы.

17. Задание

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

Источник: ppt-online.org

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru