Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Функции для сброса буферов

Функции позицирования в файлах

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

Функция для установки указателя текущей позиции в заданное положение:

int fseek(FILE * stream, long offset, int fromwhere);

параметры: stream – указатель на структуру FILE, offset – смещение в байтах указателя текущей позиции от позиции, заданной следующим параметром, fromwhere – возможные значения заданы константами: SEEK_SET – начало файла, SEEK_CUR – текущее положение указателя, SEEK_END – конец файла. Возвращаемое значение: 0, если функция нормально завершает свою работу, не 0 – в случае ошибки.

Функция для установки указателя текущей позиции в начало файла:

void rewind(FILE * stream);

параметр stream – указатель на структуру FILE.

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

long ftell(FILE * stream);

параметр stream – указатель на структуру FILE, функция возвращает текущее положение указателя.

 

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

Функция сброса заданного буфера ввода- вывода:

int fflush(FILE * stream);

параметр stream – указатель на структуру FILE, функция возвращает 0 – в случае нормального завершения и EOF – в случае ошибки.

Функция сброса всех буферов ввода- вывода:

int flushall();

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

 

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

 

Пример 1.

#include <stdio.h>

#include <stdlib.h>

void main()

{

// Программа создает двухмерный массив (матрицу) и

// записывает массив в файл

double **pM; // Указатель на массив указателей

int n, m; // Размерность массива

int i, j; // Индексные переменные

FILE *pF; // Указатель на "файл"

// Вводим размерность матрицы (двухмерного массива)

printf("n="); scanf("%d", &n); // Число строк

printf("m="); scanf("%d", &m); // Число столбцов

// Создаем массив динамически и заполняем его случайными числами

pM=malloc(n*sizeof(double *));

for(i=0; i<n; i++)

{

pM[i]=malloc(m*sizeof(double));

for(j=0; j<m; j++)

pM[i][j]=(rand() % 10000) / 100.; // В числе есть

// дробная часть

}

// Открываем файл для записи

pF=fopen("MyFile.txt", "w");

if (pF==0) // Ошибка открытия файла

{

printf("Error!!!");

return;

}

fprintf(pF, "%d %d\n", n, m); // Записываем размерности матрицы

// Записываем в файл массив (матрицу) по строчно через пробелы

for(i=0; i<n; i++)

{

for(j=0; j<m; j++)

fprintf(pF, "%f ", pM[i][j]);

fprintf(pF, "\n"); // Переход на новую строчку

}

fclose(pF); // Закрываем файл

}

 

Пример 2.

#include <stdio.h>

#include <stdlib.h>

void main()

{

// Программа читает двухмерный массив (матрицу) из файла и печатает его

// Файл с массивом должен быть в текущем рабочем каталоге!!!

double **pM; // Указатель на массив указателей

int n, m; // Размерность массива

int i, j; // Индексные переменные

FILE *pF; // Указатель на "файл"

// Открываем файл для чтения

pF=fopen("MyFile.txt", "r");

if (pF==0) // Ошибка открытия файла

{

printf("Error!!! File not found!");

return;

}

// Читаем размерность матрицы из файла

fscanf(pF, "%d %d", &n, &m);

// Создаем массив динамически

pM=malloc(n*sizeof(double *));

for(i=0; i<n; i++) pM[i]=malloc(m*sizeof(double));

// Читаем элементы массива из файла

for(i=0; i<n; i++)

for(j=0; j<m; j++)

fscanf(pF, "%lf", &pM[i][j]);

fclose(pF); // Закрываем файл

// Вывод массива на печать

for(i=0; i<n; i++)

{

for(j=0; j<m; j++) printf("%f ", pM[i][j]);

printf("\n");

}

}

Пример 3.

#include <stdio.h>

struct BOOK // Структура книга

{

char Title[64]; // Заголовок книги

char Author[64]; // Имя автора

char Firm[64]; // Издательство

int year; // Год издания

int page; // Число страниц

};

 

void main()

{

// Программа сохраняет массив структур в файле в двоичном режиме

int n=3; // Число элементов массива (может быть любым)

// Задаем массив структур

struct BOOK B[3]={{"Язык Си++: Учебное пособие", "Подбельский В.В.",

"М.: Финансы и статистика", 2008, 560},

{"Программирование на языке Си", "Подбельский В.В., Фомин С.С.",

"М.: Финансы и статистика", 2009, 600},

{"C++: базовый курс", "Шилдт Г.", "М.: Издательский дом «Вильямс»",

2010, 624}};

FILE *pF; // Указатель на "файл"

// Открываем файл для записи в двоичном режиме

pF=fopen("MyFile.dat", "wb");

if (pF==0) // Ошибка открытия файла

{

printf("Error!!!");

return;

}

// Записываем в файл число элементов массива

fwrite(&n, sizeof(int), 1, pF);

// Записываем данные в файл сразу весь массив

fwrite(B, sizeof(struct BOOK), n, pF);

fclose(pF); // Закрываем файл

}

 

Пример 4.

#include <stdio.h>

#include <stdlib.h>

struct BOOK // Структура книга

{

char Title[64]; // Заголовок книги

char Author[64]; // Имя автора

char Firm[64]; // Издательство

int year; // Год издания

int page; // Число страниц

};

 

void main()

{

// Программа читает массив структур из файла в двоичном режиме

// Файл MyFile.dat должен быть в текущем рабочем каталоге!!!

int n; // Число элементов массива

int i; // Индексная переменная

// Задаем массив структур

struct BOOK * pB; // Указатель на массив структур

FILE *pF; // Указатель на "файл"

// Открываем файл для чтения в двоичном режиме

pF=fopen("MyFile.dat", "rb");

if (pF==0) // Ошибка открытия файла

{

printf("Error!!!");

return;

}

// Читаем из файла число элементов массива

fread(&n, sizeof(int), 1, pF);

// Выделяем память под массив струтур динамически

pB=malloc(n*sizeof(struct BOOK));

// Читаем данные из файла сразу весь массив

fread(pB, sizeof(struct BOOK), n, pF);

fclose(pF); // Закрываем файл

// Печатаем массив струтур

for(i=0; i<n; i++)

printf("\n%s %s %s - %d. %d", pB[i].Author, pB[i].Title, pB[i].Firm, pB[i].year, pB[i].page);

}

 

<== предыдущая лекция | следующая лекция ==>
Функции чтения из файла | Замены в тексте
Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 271; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.026 сек.