
- •Введення інформації
- •Функції файлового вводу-виводу. Текстові файли з буферизацією
- •Закриття файлу: fclose(in ) ;
- •Ввод/вивід файлу: getc( ) і putc( ) (stdio.H)
- •Ввід/вивід файлу: fprintf(), fscanf(), fgets() и fputs()
- •Функція fgets()
- •Функція fputs( )
- •Неформатований ввід/вивід.
- •Довільний доступ: fseek( )
Функція fputs( )
Ця функція дуже схожа на puts( ). Її синтаксис
status = fputs (вказівник рядка, вказівник файлу);
де status є цілим числом, яке встановлюється в EOF, якщо fputs( ) зустрічає EOF або помилку.
fputs (" Ви були праві.”, fileptr);
передає рядок " Ви були праві." у файл, на який посилається вказівник flleptr типу FILE. Звичайно, спочатку потрібно відкрити файл за допомогою функції fopen(
Подібно puts( ) ця функція не ставить завершальний символ ' \0' у кінець скопійованого рядка. На відміну від puts( ) функція fputs( ) не додає символ нового рядка в файл.
Неформатований ввід/вивід.
fread(<рядок куди>,<по скільки байт>,<скільки блоків>,<вказівник на файл звідки>); повертає число прочитаних блоків або 0 у випадку помилки або кінця файлу.
fwrite(<рядок звідки>,<по скільки байт>,<скільки блоків>,<вказівник на файл звідки>); повертає число записаних блоків або 0 у випадку помилки.
Увага!!! При відкритті не забути вказати, що файл двійковий (b).
Довільний доступ: fseek( )
Функція fseek( ) дозволяє нам обробляти файл подібно масиву й безпосередньо досягати будь-якого певного байта у файлі, відкритому функцією fopen(). Помітимо, що fseek() має три аргументи й повертає значення типу int.
/' використання fseek( ) для друку вмісту файлу */
#include <stdio.h>
main()
int number;
char names[80];
{
FILE *fp;
cin>>names;
long offset = 0L; /* зверніть увагу, що це тип long */
if ((fp = fopen (names, "r")) = = 0)
printf (“ Я не можу відкрити %s.\n", names);
else
{
while ( fseek (fp, offset++, 0) = = 0)
putchar (getc (fp) );
fclose (fp);
}
}
Перший із трьох аргументів функції fseek() є вказівником типу FILE на файл, у якім ведеться пошук. Файл слід відкрити, використовуючи функцію fopen( ).
Другий аргумент названий “offset” (от чому ми вибрали дане ім'я для змінної). Цей аргумент повідомляє, як далеко слід пересунутися від початкової крапки (див. нижче); він повинен мати значення типу long, яке може бути позитивним (рух уперед) або негативним (рух назад).
Третій аргумент є кодом, що визначають початкову крапку:
Код Положення у файлі
-
початок файлу
-
поточна позиція
-
кінець файл ( у деяких системах може не передбачатися)
Функція fseek() повертає 0, якщо всі добре, і -1, якщо є помилка, наприклад спроба переміщатися за межі файлу. Тепер ми можемо роз'яснити наш маленький цикл:
while ( fseek (fp, offset+ +, 0) = = 0) putchar(getc(fp) );
Оскільки змінна offset ініціалізована нулем, при першім проходженні через цикл ми маємо вираз
fseek (fp, 0L, 0)
означаюче, що ми йдемо у файл, на який посилається вказівник fp, і знаходимо байт, що відстоїть на 0 байт від початку, тобто перший байт. Потім функція putchar( ) друкує вміст цього байта. При наступнім проходженні через цикл змінна offset збільшується до 1L, і друкується наступний байт. По суті, змінна offset діє подібно індексу для елементів файлу. Процес триває доти, поки offset не спробує потрапити в fseek( ) після кінця файлу. У цьому випадку fseek( ) повертає значення -1 і цикл припиняється.
Цей останній приклад чисто навчальний. Немає необхідності використовувати fseek( ), тому що getc() так чи інакше проходить через файл байт за байтом; fseek() наказала getc() «подивитися» туди, куди вона сама вже збиралася подивитися.
/* друк в прямому й зворотному напрямках */
#include <stdio.h>
main(number, names)
char *names [ ];
{
FILE *fp;
long offset = 0L;
if ( fp = fopen(names[l], "r")) = = 0)
printf (“Я не можу відкрити %s.\n", names[l]);
else
{
while ( fseek(fp, offset++, 0) = = 0)
{
putchar(getc(fp));
if ( fseek(fp, -(offset + 3), 2) = = 0) putchar(getc(fp));
}
fclose(fp);
}
Застосування цієї програми до файлу, що містить ім'я «Мальволио», дає такий приємний результат: Моаилльоввоьллиаом
Наша програма друкує перший символ файлу, потім останній, потім друг, що потім передує останньому і т.д. Ми тільки додали от ці рядки в останню програму:
if (fseek(fp, - (offset + 3), 2) = = 0) putchar(getc(fp));
Код 2 в операторові припускає, що ми будемо рахувать позиції від кінця файлу. Знак мінус означає рахунок у зворотному напрямку. +3 стоїть тут тому, що ми починаємо з останнього регулярного символу файлу й пропускаємо кілька символів «новий рядок» і EOF у самому кінці файлу. (Точне значення цього коректування залежить від типу системи. Наші файли мають наприкінці по два символи нового рядка, за якими ідуть два EOF, тому ми саме їх і обходимо.)
Таким чином, ця частина програми чергує друк у зворотному напрямку й друк в прямому напрямку.