Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lec_11_Pres.doc
Скачиваний:
4
Добавлен:
05.12.2018
Размер:
377.86 Кб
Скачать

5.4. Форматне введення/виведення даних

Функція fscanf (). Файлове введення даних згідно зі заданим списком форматних специфікацій здійснює функція

int fscanf (FILE* fp, char* format, ...);

Перший параметр функції - fp вказує на текстовий потік введення, другий обов'яз­ковий параметр - format задає символьний рядок, в якому записано послідовність специфікацій форматних перетворень. Наступні параметри задають адреси змінних і/або ділянок пам'яті, куди будуть записуватись введені значення. Ці параметри не обов'язкові, їх кількість і типи визначаються специфікаціями рядка format.

Якщо вказівником потоку в fscanf () є стандартний потік stdin, то така функція цілком відповідає функції форматного введення scanf ().

Функція fscanf () повертає кількість успішно введених даних. Перевірка значення, яке повертає функція, дає змогу встановити, як пройшов процес введення: успішно, а чи виявлено помилку.

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

/* Приклад неправильної організації форматного введення даних */

FILE * fin;

int numb;

. . . /* операції відкриття файла */

while (! feof(fin)) { /* поки не досягнуто кінця файла */

fscanf (fin, "%d", &numb);

printf ( "%d" , numb) ;

Якщо вміст файла введення є таким:

1_2_3_4_5 ,

де символом підкреслення позначено один або декілька символів-роздільників (пробіл, горизонтальна табуляція чи новий рядок ), то на екран у процесі виконання оператора циклу буде виведено: 1 2 3 4 5.

Якщо ж у файлі після останнього числа буде записано ще хоча б один символ-роздільник: 1_2_3_4_5_ , то результат читання та виведення на екран буде іншим:

1 2 3 4 5 5

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

Наступний виклик fscanf () зчитує ці символи але не знаходить більше чисел, тому фіксується кінець файла, а значення numb не змінюється.

Якби в кінці файлу були записані якісь символи, що не є цифрами і роздільниками, наприклад:

1_2_3_4_5_КІНЕЦЬ

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

Щоб зробити форматне введення незалежним від прикінцевих символів файлу цикл читання даних слід записати, наприклад, так:

/* Приклад правильної організації введення даних */

. . . /* початкова частина програми */

while (fscanf(fin, "%d", &numb) == l) /* поки є числа */

printf("%3d", numb);

if (feof(fin))

puts("Зчитано всі числа файла");

else

puts("Помилка в числових даних");

Для читання символьних даних у функціях fscanf () і scanf () використовують специфікатор "%s". Нагадаємо, що при цьому зчитується послідовність символів до першого роздільника.

В разі звертання до текстового файлу: fscanf(f, "%s", str); у рядок str буде зчитане тільки одне поточне слово із заданого файлу. Необхідно забезпечити, щоб обсяг ділянки, на яку вказує str, був достатнім для запису найдовшого слова файлу.

Функція fprinf (). Форматне виведення даних здійснює функція

int fprintf (FILE* fp, char* format, ..);

Функція має два обов'язкові параметри: перший - вказівник потоку виведення fp, a другий - текстовий рядок format, що містить специфікації форматних перетворень. Далі записуються вирази, значення яких мають бути виведені в потік у формі, що задається відповідною специфікацією рядка формату.

Правила формування рядка format і взаємоузгодження його зі списком виведення такі ж, як і в функції printf. Так само fprintf () повертає кількість символів, виведених у потік fp.

Наведена далі програма використовує функцію fprintf () для запису в файл з іменем fun_tab.res результатів табулювання заданої функції однієї змінної.

/********************************************************************************/

/* Створення файла з результатами табулювання заданої функції */

/*********************************************************************************/

#include <stdio.h>

double fun (double); /* прототип функції, що табулюється */

int main (void)

FILE *fout;

double x0, xk, x, dx;

printf("\n Межі та крок табулювання: ");

scanf("%lf %lf %lf", &x0, &xk, &dx);

fout = fopen ("fun_tab.res", "wt"); /* створення текстового файла */

for (x = x0; x < xk; x += dx) /* цикл заповнення файла */

fprintf(fout, "%10.21f %15.31f \n", x, fun(x));

fclose (fout);

printf("\n Файл результатів табулювання створено. \n");

return 0;

double fun (double x)

{

/* тіло функції, яка табулюється */

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]