Файлові операції у С++ Максименко Марина Миколаївна вчитель інформатики вищої категорії, вчитель- методист Конотопської гімназії Конотопської міської ради Сумської області 2008 р.
Зміст Основні поняття Зчитування даних із файлу Визначення кінця файлу. Закриття файлу Виведення даних у файл Ознаки Приклади Обробка помилок при виконанні файлових операцій Обробка помилок Завдання Приклади використання файлових операцій Приклади Завдання Література
Основні поняття Файл - це сукупність даних, які розміщені на зовнішніх носіях. Дані у файлах називаються елементами Кількість даних під час опрацювання файлів не зазначають. Файли можуть містить як текстову, так і числову інформацію. Функцції опрацювання файлів описані в бібліотеці fstream.h Для опрацювання файлу його необхідно відкрити, виконати потрібні дії та закрити.
Зчитування даних із файлу Оголошення файлової змінної та відкриття файлу для читання: ifstream f_in(filename.txt, ознака1|ознака2|…|ознакаN); f_in – назва файлової змінної filename.txt – зовнішня назва файлу Ознаки слугують для визначення прав доступу до файлу. Ознаки зазначать необов'язково. Введення даних: f_in>>a>>b; //числова змінна, рядкова змінна без пропусків f_in.getline(str); //рядкова змінна
Визначення кінця файлу. Закриття файлу Для успішного читання довільних файлів потрібно знати, коли зустрінеться кінець файлу: while (!f_in.eof()) {//оператори} Функція name.eof() повертає нульове значення, якщо досягнуто кінця файлу. Коли для продовження роботи файл більше не потрібен, його слід закрити: f_in.close();
Виведення даних у файл Оголошення файлової змінної та відкриття файлу для запису: ofstream f_out(filename.txt, ознака1|ознака2|…|ознакаN); f_out – назва файлової змінної filename.txt – зовнішня назва файлу Ознаки слугують для визначення прав доступу до файлу. Ознаки зазначать необов'язково. Виведення даних: f_out>>a>>b; //числова змінна, рядкова змінна Увага! Якщо не використовувати ознаки, на диску буде створений новий файл із зазначеним ім'ям, або перезаписаний файл із таким же ім'ям, якщо він уже існує
Ознаки ОзнакаПризначення ios::in Відкриває файл для читання. Вміст файлу зберігається ios::out Відкриває файл для записування. Якщо файл не існує, то буде створений ios::app Відкриває файл для дописування. Дані будуть записані у кінець файлу ios::trunk Якщо файл, який відкривають для записування вже існує, то його вміст буде вилучено. ios::nocreate Забороняє створювати файл, який відкривають ios::inoreplace Забороняє перезаписувати існуючий файл
Ознаки (приклади) ofstream flags(text1.dat, ios::app); - можна дописати до кінця вже існуючого файлу потрібну інформацію ofstream flags(text1.dat, ios::noreplace); - якщо файл існує і спробувати щось записати у нього, то жодних дій не відбудеться; якщо ж цю ознаку застосувати до нового файлу, то файл буде створено і дані можна буде записувати ofstream flags(text1.dat, ios::nocreate); - якщо файл вже існує, то він може бути відкритий для записування; якщо ж раніше такого файлу на диску не було, то в кращому випадку у файл нічого не запишеться, а в гіршому – програма зависне.
Приклади Записати у файл три рядки тексту #include #include int main() {ofstream fout(output.txt); fout<<Prog na C++ <<klas 309<< endl; fout<<konotop<<endl; fout<<2008 year<<endl; fout.close(); return 0;} Зчитати з нього текст #include #include #include int main() {ifstream fin(output.txt); char one[64],two[64],three[64]; fin.getline(one,sizeof(one)); fin.getline(two,sizeof(two)); fin.getline(three,sizeof(three)); fin.close(); cout<<one<<endl; cout<<two<<endl; cout<<three<<endl; getch(); return 0;}
Приклади (продовження) Читати вміст файлу поки не буде досягнутий кінець файлу: #include #include #include int main() {ifstream fin(output.txt); char line[64]; while (!fin.eof()) { fin.getline(line,sizeof(line)); cout<<line<<endl; } fin.close(); getch(); return 0;} Читати вміст файлу по одному слову за один раз, поки не буде досягнутий кінець файлу: #include #include #include int main() {ifstream fin(output.txt); char text[64]; while (!fin.eof()) { fin>>text; cout<<text<<endl; } fin.close(); getch(); return 0;}
Обробка помилок при виконанні файлових операцій Щоб допомогти програмам стежити за помилками, використовується функція name.fail(). Якщо у процесі файлової операції помилок не було, функція поверне false (0). Однак, якщо трапилася помилка, функція поверне true. Наприклад: #include #include int main() {char line[64]; ifstream fin(output.txt); if(fin.fail()) cout<<error; else { while (!fin.eof() && (!fin.fail())) { fin.getline(line,sizeof(line)); if (!fin.fail()) cout<<line<<endl; } fin.close(); getch(); return 0;}
Завдання 1. У текстовому редакторі створіть файл, й який занесіть прізвища п'яти ваших друзів. Складіть програму, яка б додавала інформацію ще про трьох осіб. Вміст файлу виведіть на екран. 2. У текстовому редакторі створіть файл, у який занесіть координати вершин трикутника. Обчисліть його периметр.
Приклади використання файлових операцій Зчитати масив. Обчислити суму його додатних елементів #include int main() { ifstream fin(input.txt); if (fin.fail()) {cout<<error; getch(); return 1;} else { ofstream fout(output.txt, ios::out); int r, s; fin>>r>>s; // кількість рядків та стовпчиків int i, j; // виділення пам'яті під масив int **a=new int *[r]; for (i=0; i<r; i++) a[i]= new int [s]; for (i=0; i<r; i++) // уведення масиву for (j=0; j<s;j++) fin>>a[i][j]; fin.close(); for (i=0; i<r; i++) // виведення масиву { for (j=0; j<s;j++) cout<<a[i][j]<< ; cout<<endl; } int k=0; // обчислення for (i=0; i<r; i++) for (j=0; j<s;j++) if (a[i][j]>0) k++; fout<<k; // виведення результату в файл fout.close(); getch(); return 0;}
Приклади використання файлових операцій Написати програму, яка визначає, чи зустрічається у заданому файлі послідовність символів. Довжина рядку тексту не перевищує 80 символів, текст не містить переносів, послідовність не містить пропусків. #include int main() { const int len=81; char word[len], line[len]; cout >word; ifstream fin(text.txt, ios::nocreate); if (fine.fail()) {cout<<error<<endl; getch(); return 1;} while (!fin.eof()) { fin. getline(line); if (strstr(line,word) { cout<<yes<<endl; getch(); return 0;} } cout<<no<<endl; getch(); return 0;}
Завдання 1. Створити текстовий файл, що складається з одного рядка та містить слова, розділені символом пробілу. Написати програму для підрахунку кількості слів у файлі. 2. Створити програму для записування у текстовий файл додатних цілих чисел, що вказуються користувачем з клавіатури. Критерієм припинення введення має бути введення від'ємного числа. Відкрити створений файл, прочитати з нього числа та знайти їх суму. 3. Кожен рядок текстового файлу складається з однакової кількості символів. У записі рядка використовуються лише два символи – + та *. Написати програму для виведення на екран номера рядка та номера стовпця кожного символу +. Вважати, що нумерація рядків та стовпців починається з нуля.
Література Лєхан С.Ф. Інформатика С++. Спецкурс класи. – Шепетівка; Аспект, Глинський Я.М., Анохін В.Є., Ряжська В.А. С++ і С++ Builder. Навчальний посібник. – Львів: СПД Глинський, Глушаков С.В., Смирнов С.В., Коваль А.В. Практикум по С++. – Харьков: Фолио, Павловская Т.А. С/С++. Программирование на языке высокого уровня. – СПб.: Питер, 2003 Лисенко Т.І. Поглиблене вивчення програмування в школі. – К.:ТОВ Редакція Комп'ютер, 2007.