Чтение информации из текстового файла
Для того чтобы прочитать информацию из текстового файла, необходимо описать переменную типа ifstream. После этого нужно открыть файл для чтения с помощью оператора open. Например, если переменную назвать F, то первые два оператора будут такими:
ifstream F;
F.open("D:\\sites\\accounts.txt", ios::in);
После открытия файла в режиме чтения из него можно считывать информацию точно так же, как и с клавиатуры, только вместо cin нужно указать имя потока, из которого будет происходить чтение данных.
Например, для чтения данных из потока F в переменнуюa, оператор ввода будет выглядеть так:
F>>a;
Два числа в текстовом редакторе считаются разделенными, если между ними есть хотя бы один из символов: пробел, табуляция, символ конца строки. Хорошо, когда программисту заранее известно, сколько и какие значения хранятся в текстовом файле. Однако часто известен лишь тип значений, хранящихся в файле, при этом их количество может быть различным. Для решения данной проблемы необходимо считывать значения из файла поочередно, а перед каждым считыванием проверять, достигнут ли конец файла. А поможет сделать это функцияF.eof(). Здесь F- имя потока функция возвращает логическое значение: true или false, в зависимости от того достигнут ли конец файла.
Следовательно, цикл для чтения содержимого всего файла можно создать с использованием типа whileпо условию (F.eof() == false) либо (!F.eof()). Общаяконструкция имеет вид:
|
|
while (!F.eof()){
F>>a;//чтение очередного значения из потока F в переменную a
//далее идет обработка значения переменной a
}
Пример 2.В текстовом файле D:\\IVTD3\\text.txt хранятся вещественные числа, вывести их на экран и вычислить их количество.
Решение
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <iomanip>
#include <stdlib.h>
using namespace std;
void main(){setlocale (LC_ALL, "RUS");
int n=0;
float a;
fstream F;
F.open("D:\\IVTD3\\text.txt");//открываемфайлврежимечтения
if (F){//если открытие файла прошло корректно, то
//цикл для чтения значений из файла; выполнение цикла прервется,
//когда достигнем конца файла, в этом случае F.eof() вернет истину.
while (!F.eof()){
F>>a;//чтение очередного значения из потока F в переменную a
if (!F.eof()) cout<<a<<"\n"; ////вывод значения переменной a на экран
if(!F.eof())n++;//увеличение количества считанных чисел
} //endofwhile (!F.eof()){
F.close();//закрытие потока
cout<<"n="<<n<<endl;//вывод на экран количества считанных чисел
} //endofif(F)
//если открытие файла прошло некорректно, то вывод
//сообщения об отсутствии такого файла
else cout<<" Файл не существует"<<endl;
system("pause");
}
Задания. 1. Изменить текст программы таким образом, чтобы перед каждым выдаваемым символом с новой строки дополнительно выдавалось бы сообщение вида “S№=”, где № - номер символа в файле. Например,в файле с содержимым ”ab” должны быть выданы 2 строки: “S1=a”и“S1=b”.
|
|
2. Изменить текст программы таким образом, чтобы все символы файла выводились на экран слитно без разрывов.
3. Изменить текст программы таким образом, чтобы все символы файла выводились на экран по два в строке.Например,в файле с содержимым ”12,34” должны быть выданы 3 строки: “12”, “,3” и“4”.
1.4. Преобразование символов в числовую форму и обратно.
Построчное чтение текстовых файлов
Обработка символьной информации при помощи цифровых вычислительных систем возможна только благодаря ее кодовому представлению в тех или иных форматах, например, в ANSI. В процессе обработки необходимо выполнять переходы от символьного типа величин к цифровому типу и обратно. Наиболее просто такие переходы осуществляется с помощью операций приведения типов.
Например, в программе описаны целочисленные переменные in1 и in2, а также символьные переменные ch1 и ch2:
int in1,in2;
charch1,ch2;
Переход от символьного типа величины ch1 к ее цифровому значению в переменной in1 осуществляется следующим образом:
in1= (int) ch1;
Обратный переход от цифрового значения в переменной in2 к символьной переменной ch2 осуществляется как:
|
|
ch2 = (char) in2;
Рассмотренные выше команды посимвольного чтения(>>) и записи (<<) из текстовых файлов не дают возможности выявить окончания строк в файле и, соответственно,сохранить структуру файла при его преобразовании. Для построчного чтения и записи информации в файл необходимо использовать функции getline и fputs.
Пример 3. Текстовый файлс именем “D:\\text.txt”содержит строки символов в кодировке ANSI. Написать кодирующую программу, которая каждый символ в строке заменяет по следующему правилу: к численному коду символа прибавляется номер строки, а затем полученное число снова переводится в символьный вид. Получившийся кодовый файл записывается под именем “D:\\cod.txt”. Вставить в текст программы поясняющие печати.
Решение
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <iomanip>
#include <stdlib.h>
#include <string>
#include <conio.h>
#include <stdio.h>
using namespace std;
void main(){
setlocale (LC_ALL, "RUS");
int n=0, ns,L,i,key;
charch;
charsch[100];
stringa,av;
fstreamF;
FILE * file;
F.open("D:\\text.txt");//открываем исходный файл в режиме чтения
char * fileName = "D:\\cod.txt"; // Путь к файлу для записи
fopen_s(&file,fileName, "w");//открываем кодовый файл в режиме записи
if (F) {//проверка существования исходного файла..
|
|
while (getline(F,a)) {//цикл для построчного чтения из файла; пока getline=true
n+=1;
L=a.length();
cout<<"a="<< a <<"\nL="<< L <<"\n" ;
av="";//открытие строки символов av
char *cha = newchar [L+1];//описание динамического массива cha
for (inti = 0; i<L; i++){//проход по всем символам строки
ns=(int)a[i] + n;//кодиров-е очередного символа строки в виде числа
sch[i]=(char) ns; ;//перевод очередн. кода в символьную форму
cout<<"new ch="<<sch[i]<<"\n";
av=av+sch[i];//пополнение строки символов av
cha[i]=(char) ns;//пополнение массива символов cha
}
cha[L]='\0';
for (int i = 0; i < L; i++){cout<<"cha[="<<i<<"]="<<cha[i]<<endl;};
cout<<"new av="<<av<<"\n";
boolresult = fputs(cha, file); //запись изменен. строки в кодовый файл if (!result) // если запись произошла успешно
cout<<"Строка в файл успешно записана!"<<endl;//выводим сообщение
result = fputs("\n", file); // запись символа окончания строки в файл
delete [] cha; // очистка памяти - динамического массива cha
}
F.close(); fclose(file);
cout<<" \nn="<<n<<endl; //вывод на экран количества считанных чисел
}
// вывод сообщения об отсутствии файла, если его открытие прошло некорректно,
elsecout<<" Файл не существует"<<endl;
system("pause");
}
Задания. 1. Изменить текст программы таким образом, чтобы в строкахфайла D:\\text.txt, содержащих пробелы, запятые и точки, данные символы не подвергались кодированию и записывались в кодовый файл в исходном виде.
2. Разработать с использованием текста программы декодер, который декодирует файл D:\\cod.txt таким образом, чтобы новый файл D:\\decod.txt совпадал с начальным файлом D:\\text.txt.
3. Изменить текст программы таким образом, чтобы в начале каждой строки кодового файла дополнительно вставлялся бы символ “*” (звездочка).
Дата добавления: 2018-08-06; просмотров: 282; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!