Решение задач на обработку файлов
Пример 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 контролирует работу буфера обмена.
- Создание файлового потока связывает имя потока с выделяемым для него буфером и инициализирует переменные состояния потока.
- Флаги форматирования управляют форматом выводимых значений.
- Файловые потоки используются для обмена данными при решении задач.