КАТЕГОРИИ: Архитектура-(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; Просмотров: 292; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |