МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах
РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ" ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах Гендерна антидискримінаційна експертиза може зробити нас моральними рабами ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів
Контакти
Тлумачний словник Авто Автоматизація Архітектура Астрономія Аудит Біологія Будівництво Бухгалтерія Винахідництво Виробництво Військова справа Генетика Географія Геологія Господарство Держава Дім Екологія Економетрика Економіка Електроніка Журналістика та ЗМІ Зв'язок Іноземні мови Інформатика Історія Комп'ютери Креслення Кулінарія Культура Лексикологія Література Логіка Маркетинг Математика Машинобудування Медицина Менеджмент Метали і Зварювання Механіка Мистецтво Музика Населення Освіта Охорона безпеки життя Охорона Праці Педагогіка Політика Право Програмування Промисловість Психологія Радіо Регилия Соціологія Спорт Стандартизація Технології Торгівля Туризм Фізика Фізіологія Філософія Фінанси Хімія Юриспунденкция |
|
|||||||
Форматне введення/виведення даних
Функція 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) { /* тіло функції, яка табулюється */ } Читайте також:
|
||||||||
|