Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Функції для роботи з файлами

Читайте также:
  1. IV. Порядок зберігання документів з роботи із сім'ями або особами, яким надається соціальна допомога в ході соціального супроводу
  2. Аналіз роботи очісувального апарату
  3. Будова і принцип роботи
  4. В результаті виконання даної роботи студент повинен
  5. В результаті виконання даної роботи студент повинен
  6. В результаті виконання даної роботи студент повинен
  7. В результаті виконання даної роботи студент повинен

Після того, як файл відкритий, то для читання або запису даних використовують спеціальні функції. Наведемо перелік функцій для роботи з файлами.

Функція fputc()

Формат функції:

fputc(<символ,_що_виводиться_у_файл>, вказівник_на_файл);

Функція виводить символ в файл: вказівник_на_файл, наприклад fp.

/* KTOD: програма по символьного введення з клавіатури та посимвольного виведення на диск. */

# include <stdlib.h>

# include <stdio.h>

# include <windows.h>

# include <locale.h>

 

int main()

{

setlocale(LC_CTYPE, "Russian");

FILE *fp;

char ch;

if((fp=fopen("test", "w"))==NULL)

{

printf("Помилка при вiдкриттi файлу.\n");

system ("pause");

exit(1);

}

printf("Введiть рядок символiв. Ознакою кiнця операцii перемiщення символiв у файл буде символ $ і [Enter] \n");

do

{

ch = getchar();

fputc(ch, fp);

} while (ch!= '$');

fclose(fp);

system ("pause");

return 0;

}

 

Функция fgetc()

Формат функції:

char c = fgetc(fp);

Читає один символ з файлу з вказівником fp. У випадку помилки або досягнення кінця файлу повертає EOF.

/* DTOS: програма, яка читає посимвольно файл і виводить його вміст на екран. */

# include <stdlib.h>

# include <stdio.h>

# include <windows.h>

# include <locale.h>

 

int main()

{

setlocale(LC_CTYPE, "Russian");

FILE *fp;

char ch;

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

{

printf("Помилка при вiдкриттi файлу.\n");

system ("pause");

exit(1);

}

printf("Зчитаний з файлу рядок \n");

ch = fgetc (fp); /* читання одного символу */

while (ch!= EOF)

{

putchar (ch); /* виведення на екран */

ch = fgetc (fp);

}

printf("\n");

fclose(fp);

system ("pause");

return 0;

}

 

Функция feof()

Формат функції:

feof(fp);

Як вже говорилося, якщо досягнуто кінець файлу, то fgetc () повертає EOF. Однак перевірка значення, повернутого fgetc (), можливо, не є найкращим способом дізнатися, чи досягнутий кінець файлу. По-перше, файлова система мови С може працювати як з текстовими, так і з двійковими файлами. Коли файл відкривається для двійкового введення, то може бути прочитане ціле значення, яке, як з'ясується при перевірці, дорівнює EOF. У такому випадку програма введення повідомить про те, що досягнуто кінець файлу, чого насправді може і не бути. По-друге, функція fgetc () повертає EOF і в разі відмови, а не тільки тоді, коли досягнуто кінець файлу. Якщо використовувати тільки повернене значення fgetc (), то неможливо визначити, що ж насправді сталося. Для вирішення цієї проблеми в С є функція feof (), яка визначає, чи досягнутий кінець файлу. Прототип функції feof () такий:

int feof(FILE <вказівник файлу>);

Якщо досягнуто кінець файлу, то feof () повертає true (істина), в іншому ж випадку ця функція повертає хибність. Тому наступний код буде читати двійковий файл до тих пір, поки не буде досягнутий кінець файлу:

while(!feof(<вказівник файлу>)) ch = fgetc(<вказівник файлу>);

Ясно, що цей метод можна застосовувати як до двійковим, так і до текстових файлів.

У наступній програмі, яка копіює текстові або двійкові файли, наведено приклад застосування feof (). Файли відкриваються в двійковому режимі, а потім feof () перевіряє, чи не досягнуть кінець файлу.

/* Копіювання файлу. */

# include <stdlib.h>

# include <stdio.h>

# include <windows.h>

# include <locale.h>

 

int main()

{

setlocale(LC_CTYPE, "Russian");

FILE *in, *out;

char ch;

if((in=fopen("testr", "rb"))==NULL)

{

printf("Не можна вiдкрити вхiдний файл.\n");

system ("pause");

exit(1);

}

if((out=fopen("testw", "wb"))==NULL)

{

printf("Не можна вiдкрити файл результатiв.\n");

system ("pause");

exit(1);

}

/* Саме цей код копіює файл. */

while (! feof (in))

{

ch = getc (in);

if (!feof (in)) fputc (ch, out);

}

fclose (in);

fclose (out);

system ("pause");

return 0;

}

 

Виявляє кінець файлу з вказівником fp: тестує потік на виникнення індикатора кінця файлу (який настає після прочитання останнього запису). Як тільки індикатор встановлений, операції читання файлу повертають індикатор до тих пір, поки не виконана функція rewind () - "перемотування" в початок файлу, або поки файл не буде закритий. Індикатор кінця файлу перевстановлюється з кожною операцією введення. Функція повертає ненульову величину, якщо індикатор кінця файлу був виявлений при останній операції читання, в іншому випадку - нуль.

Функція fputs()

Формат функції:

fputs(<виведений рядок >, <вказівник_на_файл>);

Функція виводить рядок у файл.

# include <stdlib.h>

# include <stdio.h>

# include <windows.h>

# include <locale.h>

# include <string.h>

 

int main()

{

setlocale(LC_CTYPE, "Russian");

char str [80];

FILE *fp;

if ((fp = fopen ("TEST", "w")) == NULL)

{

printf ("Помилка при вiдкриттi файлу. \ n");

system ("pause");

exit(1);

}

do

{

printf ("Введiть рядок (порожнiй рядок - для виходу): \n");

gets (str);

strcat (str, "\n"); // додавання роздільника рядків

fputs (str, fp);

} while (strcmp("\n", str)); // strcmp() - порівняння рядків

fclose (fp);

system ("pause");

return 0;

 

Функция fgets()

Формат функції:

fgets(s, maxline, fp);

Читає рядок в s, де s - масив символів або вказівник типу char (попередньо повинна бути виділена пам'ять для читання з використанням вказівника), maxline - максимальне число символів, яке потрібно читати з файлу з вказівником fp. У випадку помилки або досягнення кінця файлу повертає NULL.

Функція fgets () читає з певного потоку рядок, і робить це до тих пір, поки не буде прочитаний символ нового рядка або кількість прочитаних символів не стане рівним maxline. Якщо був прочитаний роздільник рядків, він заноситься в рядок.

 

# include <stdlib.h>

# include <stdio.h>

# include <windows.h>

# include <locale.h>

# include <string.h>

 

int main()

{

setlocale(LC_CTYPE, "Russian");

char str [80];

int i=0;

FILE *fp;

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

{

printf ("Помилка при вiдкриттi файлу. \n");

system ("pause");

exit(1);

}

while (! feof (fp))

{

i++;

printf ("Буде прочитано i виведено %d-й рядок ", i);

fgets (str, 79, fp);

printf (str);

}

printf ("\n");

fclose (fp);

system ("pause");

return 0;

}

 

Функция fread()

Формат функції:

fread(buf, m, n, fp);

Ця функція читає з файлу з вказівником fp перші n елементів даних, кожен з яких має довжину m байт. Читання відбувається в буфер, на який вказує вказівник buf, наприклад, char buf [50] або char * buf (але в останньому випадку попередньо треба виділити пам'ять для буфера). Загальна кількість байт читання складе (n * m). Функція повертає кількість прочитаних елементів, а по досягненні кінця файлу або виникненні помилки читання повертає NULL.

Функция fwrite()

Формат функції:

fwrite(ptr, m, n, fp);

Функція додає n елементів у файл з вказівником fp, кожен елемент довжиною в m байт. Дані записуються з буфера, на який вказує вказівник ptr (цей вказівник вказує на деякий об'єкт, наприклад, на структуру). Загальна кількість записаних байтів дорівнює (n * m). У випадку помилки запису функція повертає нуль, в іншому випадку - кількість записаних елементів.

Як тільки файл відкритий для роботи з двійковими даними, fread () і fwrite () відповідно можуть читати і записувати інформацію будь-якого типу. Наприклад, наступна програма записує в дисковий файл дані типів double, int і long, a потім читає ці дані з того ж файлу. Зверніть увагу, як в цій програмі при визначенні довжини кожного типу даних використовується функція sizeof ().

/* Запис несімвольних даних в дисковий файл

і подальше їх читання. */

# include <stdlib.h>

# include <stdio.h>

# include <windows.h>

# include <locale.h>

# include <ctype.h>

 

int main()

{

setlocale(LC_CTYPE, "Russian");

FILE * fp;

float d = 12.23;

int i = 101;

long l = 123023L;

if ((fp = fopen ("test", "wb+")) == NULL)

{

printf ("Помилка при відкритті файлу. \n");

system ("pause");

exit (1);

}

fwrite (&d, sizeof (double), 1, fp);

fwrite (&i, sizeof (int), 1, fp);

fwrite (&l, sizeof (long), 1, fp);

rewind (fp);

fread (&d, sizeof (double), 1, fp);

fread (&i, sizeof (int), 1, fp);

fread (&l, sizeof (long), 1, fp);

printf ("%4.2f %d %ld", d, i, l);

printf ("\n");

fclose (fp);

system ("pause");

return 0;

}

Як видно з цієї програми, в якості буфера можна використовувати (і часто саме так і роблять) просто пам'ять, в якій розміщена змінна. У цій простій програмі значення, що повертаються функціями fread () і fwrite (), ігноруються. Однак на практиці ці значення необхідно перевіряти, щоб виявити помилки.

Одним з найбільш корисних застосувань функцій fread () і fwrite () є читання і запис даних користувача типів, особливо структур. Наприклад, якщо визначена структура

struct struct_type

{

float balance;

char name [80];

} Cust;

то наступний оператор записує вміст cust в файл, на який вказує fp:

fwrite (& cust, sizeof (struct struct_type), 1, fp);


Дата добавления: 2015-07-10; просмотров: 455 | Нарушение авторских прав


Читайте в этой же книге: Типология агрессивного поведения современных подростков | Причины и специфика проявления агрессивности детей на разных стадиях подросткового возраста | Половозрастные особенности проявления агрессивности в поведении детей подросткового возраста | Профилактика и коррекция агрессивного поведения | МЕТОДИКА КОРРЕКЦИИ АГРЕССИВНОГО ПОВЕДЕНИЯ В ПОДРОСТКОВОМ ВОЗРАСТЕ | Мероприятия по коррекции агрессии в подростковом возрасте | Анализ проявлений различных форм агрессивности у подростков 10-15 лет | Анализ проявлений различных форм агрессивности у подростков из семей учителей, врачей, инженеров | Опросник уровня агрессивности Басса - Дарки | Опросник |
<== предыдущая страница | следующая страница ==>
Введення/виведення файлів| Приклад зі списком роззсилки

mybiblioteka.su - 2015-2024 год. (0.02 сек.)