Files - Програмування мовою C
Даний листочок присвячений основам читання даних із файлів та виведення даних у файл.
Насправді, файлове введення-виведення нічим не відрізняється від консольного. За єдиним винятком – якщо дані читаються з файлу, то будь-якої миті можна повернутися до початку файлу і рахувати все заново.
Для того, щоб у C++ працювати з файлами необхідно підключити заголовний файл fstream :
Після цього можна оголошувати об'єкти, прив'язані до файлів: для читання даних з файлу використовуються об'єкти типу ifstream (абревіатура відinputfілеstream, для запису даних у файл використовуються об'єкти типу ofstream (outputfilestream).
Щоб прив'язати той чи інший потік до файлу (відкрити файл для читання або для запису) використовується метод open , якому необхідно передати параметр - текстовий рядок, що містить ім'я файлу.
Після відкриття файлів та прив'язки їх до файлових потоків, працювати з файлами можна так само, як зі стандартними потоками введення-виведення cin та cout . Наприклад, щоб вивести значення змінної x в потік out використовуються наступні операції
А щоб вважати значення змінної із потоку in
Для закриття раніше відкритого файлу використовується метод close() без аргументів:
Закритий файловий потік можна повторно відкрити за допомогою методу open , прив'язавши його до того ж чи іншого файлу.
При зчитуванні даних із файлу може статися ситуація досягнення кінця файлу (end of file, скороченоEOF). Після досягнення кінця файлу жодне читання з файлу неможливе. Щоб перевірити стан файлу, необхідно викликати метод eof() . Даний метод повертає true , якщо досягнуто кінець файлу або false , якщо не досягнуто. Крім того, стан файловогопотоку можна перевірити, якщо просто використовувати ідентифікатор потоку як логічну умову:
Також можна використовувати як умову результат, що повертається операцією зчитування. Якщо зчитування було вдалим, результат вважається істиною, і якщо невдалим – брехнею. Наприклад, організувати зчитування послідовності цілих чисел можна так:
А організувати зчитування файлу рядково (вважаючи, що рядок закінчується символом переходу на новий рядок) так:
А ще корисно повторити листок "Рядки".
Вправи
Вхідний файл містить два цілих числа. Запишіть у вихідний файл їхню суму. (B)Видалити зайві прогалини
У файлі записано текст, що складається з рядків. Видаліть із кожного рядка всі зайві прогалини: лідируючі прогалини на початку кожного рядка, кінцевий пробіли в кінці рядка, замініть усі прогалини між словами на один. Результат виведіть у файл.
output.txt(C)Вирівнювання по лівому краю
Перший рядок вхідного файлу містить ціле число N. Далі (починаючи з наступного рядка) йде текст. Необхідно цей текст розбити на рядки, довжина яких вбирається у N і вивести їх у файл. У кожному виведеному рядку не повинно бути прогалин на початку рядка, пробілів наприкінці рядка, слова в рядку повинні розділятися одним пробілом. При цьому кожен рядок повинен бути максимально довгим, тобто рядки формуються за "жадібним" принципом: додаємо слова з вхідного файлу доти, доки довжина отриманого рядка не перевищує N, після цього ставимо розрив рядка. Гарантується, що у вхідному файлі немає слів довших за N символів.
output.txt(D)Вирівнювання по правому краю
Розв'яжіть попереднє завдання за умови, що текст має бути вирівняний праворуч, тобтокожен рядок у виводі повинен мати довжину рівно N символів, інакше її потрібно доповнити на початку рядка пробілами до довжини N. Останній символ кожного рядка має бути непробильним.
output.txt(E)Вирівнювання по ширині
Розв'яжіть попередню задачу за умови, що текст у виведенні програми повинен бути вирівняний за шириною: перший і останній символ рядка повинні бути непробільними, при необхідності між словами повинні бути додані додаткові пробіли, при цьому кількість пробілів між будь-якими двома словами в одному рядку не повинна відрізнятися більш ніж на 1.
Останній рядок у виведенні має бути вирівняний по лівому краю.
output.txt(F)Частотна таблиця - 1
Вхідний файл містить текст. Для кожної літери латинського алфавіту порахуйте скільки разів вона зустрічається в тексті. Великі та малі літери рахуйте разом, інші символи ігноруйте. Програма повинна вивести всі літери латинського алфавіту (заголовні, від A до Z, по одній літері в рядку), після цього на цьому рядку кількість появи цієї літери у вихідному тексті.
output.txt(G)Частотна таблиця - 2
Розв'яжіть попереднє завдання, виводячи результат у порядку зменшення частоти появи літери у вхідному файлі. Якщо якась літера не зустрічається у вхідному файлі, її не потрібно виводити.
output.txt(H)Звернення довгої послідовності
На вхід програма отримує послідовність цілих чисел невідомої довжини. Необхідно вивести ту ж послідовність у зворотному порядку, попередньо зберігши її в масиві.
Головна складність у тому, що довжина послідовності невідома і тому розмір масиву, необхідного для зберігання послідовності, такожневідомий. Тому необхідно діяти так:
1. Використовувати динамічні масиви: покажчики та пам'ять, що перерозподіляється.
2. Програма має створити масив певного розміру.
3. Дані читаються як while (in>>d) , тобто до закінчення вхідного потоку.
4. Після зчитування число записується до масиву.
5. Якщо при цьому не вистачає розміру динамічного масиву, необхідно перерозподілити пам'ять: створити новий масив більшого розміру за допомогою оператора new, скопіювати в нього всі раніше лічені дані, звільнити пам'ять, яку займає старий масив за допомогою оператора delete.