Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Проверка достижения конца файла




Если заранее неизвестно количество значений в файле, то для считывания организовывается цикл до достижения конца файла.

Способ 1. Проверка достижений конца файла с использованием функции feof()

int feof(FILE *file_ptr);

 

· Функция feof() не проверяет положение указателя в файле, она проверяет значение .системного индикатора «конец-файла».

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

i = 0;

while (!feof(fp))

{

fgets(buf, sizeof(buf), fp);

printf ("Line %4d: %s", i, buf);

i++;

} //последняя строка будет напечатана дважды

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

#include <stdio.h>

#include <stdlib.h>

#define MYFILE «junk1.txt»

int main(void)

{

FILE *fp;

char buf[BUFSIZ] = "Garbage";

int i;

if ((fp = fopen(MYFILE, "r")) == NULL)

{

return (EXIT_FAILURE);

}

i = 0;

while (fgets(buf, sizeof(buf), fp) != NULL)

{

printf ("Line %4d: %s", i, buf);

i++;

}

fclose(fp);

return(0);

}

Перемещениепофайлу

Прототип функции Назначение
int ftell ( FILE * stream ); Возвращает смещение указателя потока от начала файла в байтах. Если происходит ошибка – возвращаемое значение -1L. Не рекомендуется использовать для текстовых файлов.
int fseek( FILE *stream,int offset,int origin ); Перемещает указатель позиции в потоке на offset байтов относительно позиции, определяемой константой ORIGIN: SEEK_SET – начало файла; SEEK_END – конец файла; SEEK_CUR – текущее положение в файле. Не рекомендуется использовать для текстовых файлов. В случае успеха возвращает "0", иначе – ненулевое значение.
void rewind (FILE * stream); Устанавливает внутренний указатель положения файла в начальное положение (начало файла). Если файл открыт для модификации, позволяет переключаться между операциями чтения и записи. Эквивалент: fseek(stream, 0L, SEEK_SET);
int fflush( FILE *stream ); Если поток был открыт для записи или если он был открыт для модицикации и последняя операция была запись, то любые незаписанныеданные во входном буфере записываются в файл.  

Получение размера файла.

...

intmain()

{

FILE * ptrFile = fopen("file.txt","rb");

if (ptrFile == NULL)

exit(1);

else

{

fseek(ptrFile, 0, SEEK_END); // указательвконецфайла

long size = ftell(ptrFile); // вернуть положение указателя

fclose (ptrFile); // закрытьфайл

}

return 0;

}

 

 

Текстовые файлы, принципы работы. Процедуры и функции, ориентированные на работу с текстовыми файлами, ввод-вывод информации. Примеры.

Ответ:

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

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

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

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

Форматированный ввод/вывод

Прототип функции Назначение
int fprintf(FILE *stream,const char *format [, arg] ...); Отличается от printf() только наличиемдополнительного первого параметра –указателя на поток stream. В случае успеха возвращает общееколичество записанных в файл байтов(символов). Иначе – возвращаетотрицательноечисло.
int fscanf(FILE *stream,const char *format [, arg] ...); Отличается от printf() только наличиемдополнительного первого параметра –указателя на поток stream. Возвращаемое значение – количествоуспешно прочитанных полей ввода. Вслучае ошибки чтения – отрицательноезначение.

 

... int main() { FILE *fp; int n; if ((fp = fopen(“output.txt”, “w”)) == NULL) exit(1); for (n=1; n<=10; n++) fprintf(fp, “%d %d\n”, n, n*n); fclose(fp); return 0; } ... int main() { FILE *fp; int i, n, nn; if ((fp = fopen(“input.txt”, “r”)) == NULL) exit(1); for (i=1; i<=10; i++) { fscanf(fp, “%d %d”, &n, &nn); printf(“%d %d\n”, n, nn); } fclose(fp); return 0; }

Чтение/запись строк

Прототип функции Назначение
int fputs(const char *s, FILE *stream); Записывает строку (до ‘\0’) в файл (поток), которомусоответствует указатель stream. Символ ‘\0’ незаписывается, символ конца строки вместо ‘\0’ такжене записывается. В случае успеха функция fputs() возвращаетпоследний записанный символ, а в случае неудачи –константуEOF.
char *fgets(char *s, int n, FILE *stream); Читает из файла (потока) stream строку. Чтениеостанавливается при встрече ‘\n’ или при чтении (n-1)символов. Символ ‘\n’ переносится в массив s (вотличие от gets(), которая отбрасывает ‘\n’). Дополнительно в конец строки записывается ‘\0’. В случае успешного завершения возвращаетуказатель на строку s. При ошибке или достижении конца файла (если непрочитан ни один символ) возвращает NULL – в этомслучае содержимое строки s остается без изменения.

Чтение/запись символов

Прототип функции Назначение
int fgetc(FILE *stream); В случае успеха возвращает очередной символ из потокаstream. В противном случае возвращает EOF.
int fputc(int c,FILE *stream); Вывод символа в поток stream. Перед выводом символавтоматически конвертируется в int. В случае успешного завершения возвращает записанныйсимвол, в случае ошибки – возвращает EOF. чтение/запись символов.

«Ловушка» EOF.

Распространенной ошибкой является использование fgetc()для присваивания введенного символа переменной типа charперед сравнением с EOF.

EOF – отрицательное целое (int) число (обычно «-1»). Припреобразовании в char отбрасываются старшие биты,значение остается в диапазоне (0..255), т.е. сравнениепеременной c с EOF (слева) никогда не сработает и цикл будетпродолжаться вечно.

FILE *fp; char c; ... while ((c = fgetc(fp)) != EOF) { putchar(c); } FILE *fp; int ic; char c; ... while ((ic = fgetc(fp)) != EOF) { putchar(ic); c = (char)ic; }

Двоичные файлы и процедуры ввода-вывода. Примеры использования.

Ответ:

Бинарный (двоичный) поток:

· Последовательность произвольных байтов

· Не рассчитан на интерпретацию в качестве последовательности текстовых символов;

· Для ввода/вывода данных следует применять функции чтения/записи блоков памяти

Текстовый поток:

· Частный случай бинарного потока (файла);

· Рассматривается как последовательность символов;

· Некоторые служебные символы могут присутствовать в потоке, но не выводиться на экран;

· Для чтения/записи данных необходимо применять функции, аналогичные функциям консольного ввода / вывода (fprintf / fscanf, fputs / fgets, fputc / fgetc)

Двоичный ввод/вывод

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

Как результат:

· Потеря точности для вещественных чисел;

· Увеличение размера файла (каждая десятичная цифра в записи числа – отдельный ASCII-код, 8 битов);

· Замедление ввода/вывода

double num = 1./3.;

fprintf(fp, “%f”, num);

// вфайл - строка: “0.333333”

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

Удобны для ввода/выводабольших объемов данных(массивов, структур и т.п.)известного размера.

Для работы с файлом, открытым в двоичном режиме,рекомендуется применятьтолько функции двоичноговвода/вывода, для работы сфайлом, открытом в текстовомрежиме – функции текстовоговвода/вывода.

 

 

Прототип функции Назначение
int fwrite ( const char * array,size_t size,size_t          count, FILE * stream ); Записывает блок данных в поток. Таким образомзапишется массив элементов array в текущую позицию впотоке. Для каждого элемента запишется size байт. Индикатор позиции в потоке изменится на число байт,записанных успешно. Возвращаемое значение будет равно count в случаеуспешного завершения записи. В случае ошибкивозвращаемое значение будет меньше count.
int fread(void *ptr,size_t size,size_t count,FILE *stream);   Читает блок данных из потока. Будет прочитано countэлементов размером size каждый. Все они будут записаны впамять, начиная с адреса ptr. Индикатор позиции в потокеизменится на число байт, прочитанных успешно. Возвращаемое значение будет равно count в случаеуспешного завершения записи. В случае ошибкивозвращаемое значение будет меньше count.

do

{

act_read = fread(buffer, sizeof(char), BUF_NUM, fin);

fwrite(buffer, sizeof(char), BUF_NUM, fout);

}

while (act_read == BSIZE);

 










Последнее изменение этой страницы: 2018-04-12; просмотров: 449.

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