Чтение информации из текстового файла



Для того чтобы прочитать информацию из текстового файла, необходимо описать переменную типа 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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!