Решение задач на обработку файлов
Пример 1. Входной файл содержит следующую информацию: в первой строке натуральное число указывает количество чисел, далее следуют вещественные числа. Выведите в выходной файл только положительные числа из входного файла и их сумму.
#include "stdafx.h" #include <iostream> using namespace std; #include <fstream> int _tmain(int argc, _TCHAR* argv[]){ int n,i=1; float s, sum=0.0; // Открываем входной файл для ввода данных ifstream infile("in.txt"); // Открываем выходной файл для вывода данных ofstream outfile("out.txt"); // Проверка корректности открытия входного файла if (!infile) {cout << "Файл не открыт.\n";} else { infile >> n; //Считываем количество чисел while (i++<=n){ infile >> s; //Считываем вещественные числа if (s>0) { sum+=s; outfile << s <<"\n"; //Выводим положительные числа } } outfile << sum; //Выводим сумму в выходной файл // Закрываем файлы infile.close(); outfile.close(); cout << "Запись в файл завершена"; } system("pause"); return 0; }
Пример 2. Дан текстовый файл. Выведите в выходной файл длину наибольшей строки и все строки такой длины.
#include "stdafx.h" #include <iostream> using namespace std; #include <fstream> #include <string.h> int _tmain(int argc, _TCHAR* argv[]){ int maxlen=0, len; char st[200],delim; //Связываем переменные с потоками ifstream infile; ofstream outfile; // Открываем входной файл для ввода данных infile.open("in.txt"); // Проверка корректности открытия входного файла if (!infile) {cout << "Файл не открыт.\n";} else { //Поиск максимальной длины строк while (!infile.eof()) { infile.getline(st,200,delim='\n'); len=strlen(st); if (len>maxlen) maxlen=len; } // Закрываем входной файл infile.close(); } //Открываем входной файл для ввода данных infile.open("in.txt"); // Открываем выходной файл для вывода данных outfile.open("out.txt"); // Проверка корректности открытия входного файла if (!infile) {cout << "Файл не открыт.\n";} else { outfile<<"Длина наибольшей строки равна "<<maxlen<<"\n"; //Поиск и вывод строк максимальной длины while (!infile.eof()) { infile.getline(st,200,delim='\n'); len=strlen(st); if (len==maxlen) outfile <<st<<"\n"; } // Закрываем файлы infile.close(); outfile.close(); cout << "Запись в файл завершена"; } system("pause"); return 0; }
Ключевые термины
Извлечение из потока – это процесс чтения данных из потока.
Класс fstream – это поток для чтения и для записи данных (двунаправленный обмен).
Класс ifstream – это поток для ввода (чтения) данных из файла
Класс ios – родительский класс для файловых потоков.
Класс ofstream – это поток для вывода (записи) данных в файл.
Помещение или включение в поток – это процесс вывода данных в поток.
Поток – это абстрактное понятие, относящееся к любому переносу данных от источника к приемнику.
Флаги форматирования – двоичные коды, управляющие форматом выводимых значений.
Краткие итоги
- Файловые потоки ofstream, ifstream, fstream наследуются из базового класса ios.
- Класс ios контролирует работу буфера обмена.
- Создание файлового потока связывает имя потока с выделяемым для него буфером и инициализирует переменные состояния потока.
- Флаги форматирования управляют форматом выводимых значений.
- Файловые потоки используются для обмена данными при решении задач.