85781

Работа с текстовыми файлами в ОС Windows на языке С++

Лабораторная работа

Информатика, кибернетика и программирование

Текстовые файлы Почти вся информация в ЭВМ хранится в файлах поименованных участках электронной памяти. Файловой системой называют порядок определяющий способ организации хранения и именования данных на носителях информации в компьютерах и других устройствах использующих электронную память.

Русский

2015-03-30

59.2 KB

7 чел.

Лабораторная работа 1. Работа с текстовыми файлами в ОС Windows на языке С++

Цель работы: изучение методов работы с текстовыми файлами в ОС Windows на языке С++

1.1.Файлы и файловая система. Текстовые файлы

Почти вся информация в ЭВМ хранится в файлах – поименованных участках электронной памяти. Файловой системой называют порядок, определяющий способ организации, хранения и именования данных на носителях информации в компьютерах и других устройствах, использующих электронную память. Файловая система как система соглашений задает формат содержимого и способ физического хранения информации в файлах и каталогах.

Практически функции работы с файлами реализует отдельная подсистема (также называемая файловой системой), входящая в состав операционной системы. Такими функциями являются:

- создание файлов и присвоение им имен;

- создание каталогов (папок) и присвоение им имен;

- переименование файлов и каталогов (папок);

- копирование и перемещение файлов между дисками компьютера и между каталогами (папками) одного диска;

- удаление файлов и каталогов (папок);

- навигация по файловой структуре с целью доступа к заданному файлу, каталогу (папке);

- управление атрибутами файлов.

Рассмотрим работу с файлами в ОС Windows. Основными типами файлов являются: текстовые и двоичные. В двоичных файлах информация считывается и записывается в виде блоков определенного размера, в которых могут храниться данные любого вида и структуры.

Текстовыми называют файлы, в которых записана символьная информация. Как правило, она организованна в виде строк (англ. lines, rows).. В современных системах в конце строк стоят разделители строк. Обычно (в частности, в ОС Windows ) – это признак окончания строки “/0”.

Если нет дополнительных управляющих символов, то новая строка начинается сразу же после окончания текущей.

Если использован управляющий символ “/n”, то новая строка начинается с физической новой строки.

Если задан символ табуляции “/t”, то новая строка начинается с заданной позиции в  текущей строке.

Для хранения одиночных символов используются элементы типа char. Поэтому для формирования строки необходимо использовать массив таких элементов. Для обозначения окончания данного массива необходимо применять специальный управляющий символ  '\0’.

В конце текстового файла стоит маркер конца файла. Текстовый файл может содержать как форматированный, так и неформатированный текст.

В DOS и ОС Windows для файлов с неформатированным текстом обычно используется расширение .txt.

Для ручной записи, редактирования и просмотра символьной информации в текстовых файлах, а также их создания, переименования и закрытия, удобнее всего использовать текстовый редактор Notepad.

Также текстовыми могут являться файлы с любым другим расширением или без него. Например, исходные коды программ обычно хранятся в файлах с расширениями, соответствующими языку программирования, на котором написаны программы (.bas, .pas, .c).

Форматированный текст (текст с разметкой) обычно хранится в файлах с расширением, соответствующим формату или языку разметки.rtf, .htm, .html.

1.2.Функции работы с текстовыми файлами в ОС Windows. Запись информации в файл

Для работы с файлами используются специальные типы данных, называемые потокамиПоток ifstream служит для работы с файлами в режиме чтения, а ofstream в режиме записи. Для работы с файлами в режиме как записи, так и чтения служит поток fstream.

В программах на C++ при работе с текстовыми файлами необходимо подключать библиотеки iostream и fstream.

Для записи данных в текстовый файл необходимо:

1) описать переменную типа ofstream,

2) открыть файл с помощью функции open,

3) вывести информацию в файл,

4) обязательно закрыть файл.

Для считывания данных из текстового файла необходимо:

1) описать переменную типа ifstream,

2) открыть файл с помощью функции open,

3) считать информацию из файла, при считывании каждой порции данных необходимо проверять, достигнут ли конец файла,

4) закрыть файл.

Запись информации в текстовый файл

Как было сказано ранее, для того чтобы начать работать с текстовым файлом, необходимо описать переменную типа ofstream. Например, переменная с именем F для записи информации в файл будет создана следующей командой:

ofstream F;

В общем случае оператор открытия потока будет иметь вид:

F.open(«file»mode);

где F — переменная, описанная как ofstreamfile — полное имя файла на диске, mode — режим работы с открываемым файлом. При указании полного имени файла нужно ставить двойной слеш. Для обращения, например к файлу accounts.txt,находящемуся в папке sites на диске D, в программе необходимо указать:D:\\sites\\accounts.txt.

Файл может быть открыт в одном из следующих режимов:

  1.  ios::in — открыть файл в режиме чтения данных; данный режим является режимом по умолчанию для потоков ifstream;
  2.  ios::out — открыть файл в режиме записи данных (при этом информация о существующем файле уничтожается); режим является режимом по умолчанию для потоков ofstream;
  3.  ios::app — открыть файл в режиме записи данных в конец файла;
  4.  ios::ate — передвинуться в конец уже открытого файла;
  5.  ios::trunc — очистить файл, это же происходит в режиме ios::out;
  6.  ios::nocreate — не выполнять операцию открытия файла, если он не существует;
  7.  ios::noreplace — не открывать существующий файл.

Параметр mode может отсутствовать, в этом случае файл открывается в режиме по умолчанию для данного потока.

После удачного открытия файла (в любом режиме) в переменной F будет храниться true, в противном случае false. Это позволит проверить корректность операции открытия файла.

Открыть файл (в качестве примера возьмем файл D:\\text.txt) в режиме записи можно одним из следующих способов.

1.После открытия файла в режиме записи будет создан пустой файл, в который можно будет записывать информацию.

2.Если вы хотите открыть существующий файл в режиме дозаписи, то в качестве режима следует использовать значение ios::app.

3. После открытия файла в режиме записи, в него можно писать точно так же, как и на экран, только вместо стандартного устройства вывода cout необходимо указать имя открытого файла.

Например, для записи в поток переменной a, оператор вывода будет иметь вид:

F<<a;

Для последовательного вывода в поток G переменных bcd оператор вывода станет таким:

G<<b<<c<<d;

Закрытие потока осуществляется с помощью оператора:

F.close();

Пример 1. Создать текстовый файл D:\\text1.txt и записать в него при помощи ввода с клавиатуры n вещественных чисел. Число n также вводится по запросу с клавиатуры. Каждое введенное число должно отображаться в режиме табуляции.

Решение

 #include "stdafx.h"
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
void main() {setlocale (LC_ALL, "RUS");
  
int i, n;
 
double a;
 
ofstream f; //описание потока для записи данных в файл
 
f.open("D:\\text1.txt", ios::out);  //открытие файла в режиме записи,
 
cout<<"n="; cin>>n; //ввод количества вещественных чисел
 
for (i=0; i<n; i++){ //цикл для ввода вещественных чисел и записи их в файл
     
cout<<"a="; //приглашение на ввод числа с клавиатуры
     
cin>>a; //ввод числа
     
f<<a; //запись числа в файл

     f<<"\t"; //запись в файл разделителя
 }

 f.close();//закрытие потока
 
system("pause");
}

Задания. 1. Изменить текст программы таким образом, чтобы каждое вводимое  в файл  D:\\text1.txt  число отображалось с новой строки.

2. Изменить текст программы таким образом, чтобы все вводимые  в файл  D:\\text1.txt  числа отображались слитно без разрывов.

3. Изменить текст программы таким образом, чтобы каждый вводимый с клавиатуры символ записывался  в файл  D:\\text1.txt  дважды.

4. Изменить текст программы таким образом, чтобы а) символы в файл D:\\text1.txt  записывались бы слитно и б) между всеми вводимыми символами дополнительно записывался бы разделяющий символ “-” (минус).

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

Для того чтобы прочитать информацию из текстового файла, необходимо описать переменную типа ifstream. После этого нужно открыть файл для чтения с помощью оператора open. Например, если переменную назвать F, то первые два оператора будут такими:

ifstream F;
F.open("D:\\sites\\accounts.txt", ios::in);

После открытия файла в режиме чтения из него можно считывать информацию точно так же, как и с клавиатуры, только вместо cin нужно указать имя потока, из которого будет происходить чтение данных.

Например, для чтения данных из потока F в переменную a, оператор ввода будет выглядеть так:

F>>a;

Два числа в текстовом редакторе считаются разделенными, если между ними есть хотя бы один из символов: пробел, табуляция, символ конца строки. Хорошо, когда программисту заранее известно, сколько и какие значения хранятся в текстовом файле. Однако часто известен лишь тип значений, хранящихся в файле, при этом их количество может быть различным. Для решения данной проблемы необходимо считывать значения из файла поочередно, а перед каждым считыванием проверять, достигнут ли конец файла. А поможет сделать это функция F.eof(). Здесь - имя потока функция возвращает логическое значение: 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++;//увеличение количества считанных чисел
    } //
end of   while (!F.eof()){
 F.close();
//закрытие потока
 cout<<"n="<<n<<endl;
//вывод на экран количества считанных чисел
 } //
end of if(F)
 //если открытие файла прошло некорректно, то вывод
 //сообщения об отсутствии такого файла
 else cout<<" Файл не существует"<<endl;
 system("pause");
}

Задания. 1. Изменить текст программы таким образом, чтобы перед каждым выдаваемым символом дополнительно выдавалось сообщение вида “S№=”, где  № - номер символа в файле, содержащий необходимое число знаков.

2. Изменить текст программы таким образом, чтобы все символы файла выводились на экран слитно без разрывов.

3. Изменить текст программы таким образом, чтобы все символы файла выводились на экран по два в строке.

  1.  Преобразование символов в числовую форму и обратно.
    Построчное чтение текстовых файлов

Обработка символьной информации при помощи цифровых вычислительных систем возможна только благодаря ее кодовому представлению в тех или иных форматах, например, в ANSI. В процессе обработки необходимо выполнять переходы от символьного типа величин к цифровому типу и обратно.  Наиболее просто такие переходы осуществляется с помощью операций приведения типов.

Например, в программе описаны целочисленные переменные in1 и in2, а также символьные переменные ch1 и ch2:

int in1, in2;

char  ch1, 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;

    char ch;

    char sch[100];

    string a,av;

    fstream F;

    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 = new char [L+1];//описание динамического массива cha

for (int i = 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";

 bool result = fputs(cha, file); //запись изменен. строки в кодовый файл         if (!result) // если запись произошла успешно

  cout <<"Строка в файл успешно записана!"<<endl;//выводим сообщение

  result = fputs("\n", file); // запись символа окончания строки в файл

  delete [] cha; // очистка памяти - динамического массива cha 

}

 F.close(); fclose(file);

 cout<<" \n n="<<n<<endl; //вывод на экран количества считанных чисел

 }

// вывод сообщения об отсутствии файла,  если его открытие прошло некорректно,  

 else cout<<" Файл не существует"<<endl;

 system("pause");

}

Задания. 1. Изменить текст программы таким образом, чтобы в строках файла  D:\\text.txt, содержащих пробелы, запятые и точки, данные символы не подвергались кодированию и записывались в кодовый файл в исходном виде.

2. Разработать с использованием текста программы декодер, который декодирует файл D:\\cod.txt таким образом, чтобы новый файл D:\\decod.txt совпадал с начальным файлом  D:\\text.txt.

3. Изменить текст программы таким образом, чтобы в начале каждой строки кодового файла дополнительно вставлялся бы символ “*” (звездочка).

  1.  Задания для самостоятельного выполнения

1. Ввести с клавиатуры в  текстовый файл заданное число строк произвольного текста. Создать новый текстовый файл удвоенной длины,  в котором  каждая строка  исходного файла входит дважды подряд.

2. По заданному текстовому файлу, строки  которого  содержат арабские цифры от 0 до 9, создать новый текстовый  файл, у которого выполнена замена 0 на А, 1 на В, 2 на С, 3 на D, 4 на E, 5 на F.

3. Ввести с клавиатуры в  текстовый файл заданное число строк произвольного текста. Создать новый текстовый файл, у которого содержимое каждой строки переписано в обратном порядке.

4. Написать декодер к кодеру из примера 3, восстанавливающий исходное содержание текстового файла по кодированному “D:\\cod.txt”. Каждый декодируемый символ должен быть записан два раза подряд.

5. По заданному текстовому файлу, строки  которого  содержат заглавные латинские буквы и арабские цифры от 0 до 3, создать новый текстовый  файл, у которого выполнена замена 0 на a, 1 на b, 2 на c, 3 на D.

6. Строки текстового файла с именем  “D:\\text1.txt” сохранены в кодировке ANSI. Написать кодирующую программу, которая каждый символ в строке, кроме пробела, точек и запятых, заменяет по следующему правилу: к численному коду символа прибавляется 1, а затем полученное число снова переводится в символьный вид. Получившийся кодовый файл записывается под именем “D:\\cod1.txt”. Вставить в текст программы поясняющие печати.

7. По заданному текстовому файлу  создать новый текстовый  файл, который содержит три раза повторенное содержание исходного файла.

8. Ввести с клавиатуры в  текстовый файл заданное число строк произвольной длины, превышающей 5.  Создать новый текстовый файл,  в котором  в каждой строке исходного файла оставлено только 5 первых символов.

9. Ввести с клавиатуры в  текстовый файл заданное число строк , которые представляют собой слова из  двоичных значений 0 и1.  Создать новый текстовый файл,  в котором  в каждой строке исходного файла все пары подряд стоящих символов перекодированы в систему счисления с основанием 4.

10. По заданному текстовому файлу  создать два  новых текстовых  файла, первый из которых содержит нечетные строки исходного, а второй – четные строки исходного.

11. Ввести с клавиатуры в  текстовый файл заданное число строк, которые представляют собой слова из  двоичных значений 0 и 1. Создать новый текстовый файл, в котором в каждой строке исходного файла выполнено инвертирование значений 0 и 1 (замена: 0  1 и 10 ).

12. Ввести с клавиатуры значения параметров арифметической прогрессии и необходимое их число n. Создать текстовый файл, в котором n строк представляют собой последовательность из первых n членов арифметической прогрессии.

13. Ввести с клавиатуры в  текстовый файл заданное число n строк.  Создать новый текстовый файл,  в котором:

а) строки, содержащие не более 6 символов, вставлены полностью,

б) в более длинных строках оставлены только  нечетные символы.

14. Ввести с клавиатуры в текстовый файл заданное число n строк. Создать новый текстовый файл,  в котором:

а) в каждой строке порядок символов изменен на обратный,

б) каждая строка начинается с позиции, задаваемой табуляцией.

15. Для заданного текстового файла определить:

а) количество строк четной длины,

б) количество строк нечетной длины,

в) общее количество вхождений в строки файла букв “a” и “b”.

Результаты подсчетов выдать на экран.

16. Ввести с клавиатуры в  текстовый файл заданное число символов. Обеспечить запись в строки файла возрастающего числа символов: 1,2,3, и т.д.

17. Ввести с клавиатуры в текстовый файл заданное число строк. По нему сформировать новый текстовый файл, который содержит только те строки, в которые входит символ “a”. Подсчитать общее число символов в новом файле.

18. Задано два текстовых файла, в которых строки упорядочены по возрастанию их длин. Строки в файлах могут совпадать Надо сформировать новый текстовый файл, в который входят строки из исходных таким образом, чтобы были исключены повторяющиеся строки.


 

А также другие работы, которые могут Вас заинтересовать

37949. Определение коэффициента Пуассона воздуха акустическим методом 128 KB
  Обратимся к молярным теплоемкостям идеального газа при постоянном объеме и при постоянном давлении. Внутренняя энергия идеального газа – это энергия теплового движения молекул и атомов в молекулах. Следовательно средняя энергия теплового движения молекулы идеального газа равна 2. Внутренняя энергия  молей газа равна 2.
37950. Определение коэффициента вязкости воздуха и кинематических характеристик теплового движения его молекул 888 KB
  1 Определение коэффициента вязкости воздуха и кинематических характеристик теплового движения его молекул: Методические указания к лабораторной работе №23 по курсу общей физики Уфимск. В работе на основе исследования одного из явления переноса внутреннего трения определяютcя коэффициент вязкости воздуха а также средняя длина свободного пробега и эффективный диаметр его молекул. Осипов ЛАБОРАТОРНАЯ РАБОТА № 23 ОПРЕДЕЛЕНИЕ КОЭФФИЦИЕНТА ВЯЗКОСТИ ВОЗДУХА И КИНЕМАТИЧЕСКИХ ХАРАКТЕРИСТИК ТЕПЛОВОГО ДВИЖЕНИЯ ЕГО МОЛЕКУЛ 1.2 Определение средней длины...
37951. ИЗУЧЕНИЕ ГАЗОВЫХ ЗАКОНОВ И ОПРЕДЕЛЕНИЕ КОЭФФИЦИЕНТА ПУАССОНА ГАЗА МЕТОДОМ КЛЕМАНА – ДЕЗОРМА 157.5 KB
  Теплоемкость и коэффициент Пуассона газа.14 лабораторная работа № 24 ИЗУЧЕНИЕ ГАЗОВЫХ ЗАКОНОВ И ОПРЕДЕЛЕНИЕ КОЭФФИЦИЕНТА ПУАССОНА ГАЗА МЕТОДОМ КЛЕМАНА – ДЕЗОРМА Цель работы Изучение различных процессов изменения состояния газа и определение коэффициента Пуассона воздуха. Теплоемкость и коэффициент Пуассона газа Удельной теплоемкостью вещества называется величина равная количеству теплоты которую надо передать единице массы этого вещества для увеличения его температуры на 1К а молярной теплоемкостью – количество теплоты которое...
37952. ОПРЕДЕЛЕНИЕ КОЭФФИЦИЕНТОВ ТЕПЛОПРОВОДНОСТИ МЕТАЛЛОВ 2.23 MB
  13 ЛАБОРАТОРНАЯ РАБОТА № 25 ОПРЕДЕЛЕНИЕ КОЭФФИЦИЕНТОВ ТЕПЛОПРОВОДНОСТИ МЕТАЛЛОВ Цель работы Изучение явления теплопроводности и определение коэффициентов теплопроводности чистых металлов и сплавов. Если в неравномерно нагретых жидкостях и газах тепловая энергия передается преимущественно за счет конвекции при которой происходит перемещение вещества между областями с различной температурой то в твердых телах тепло переносится только за счет теплопроводности. Распространение тепловой энергии путем теплопроводности обусловлено хаотическим...
37953. ИЗУЧЕНИЕ ВЗИМОСВЯЗИ ПАРМЕТРОВ СОСТОЯНИЯ ИДЕАЛЬНОГО ГАЗА И ГАЗОВЫХ ЗАКОНОВ 150.5 KB
  Экспериментальная проверка уравнения состояния идеального газа.13 лабораторная работа № 29 ИЗУЧЕНИЕ ВЗИМОСВЯЗИ ПАРМЕТРОВ СОСТОЯНИЯ ИДЕАЛЬНОГО ГАЗА И ГАЗОВЫХ ЗАКОНОВ Цель работы 1. Изучение взаимосвязи макропараметров определяющих состояние идеального газа. Экспериментальная проверка уравнения состояния идеального газа.
37954. Исследование электростатического поля и изображение его при помощи силовых линий и поверхностей равного потенциала 867.5 KB
  Исследование электростатического поля Цель работы Экспериментальное исследование электростатического поля и изображение его при помощи силовых линий и поверхностей равного потенциала. Напряженностью электрического поля называют силу действующую на единичный положительный пробный заряд. Если электрическое поле создается системой зарядов то напряженность поля в данной точке определяется по принципу суперпозиции...
37955. ИЗУЧЕНИЕ ЗАКОНОВ ПОСТОЯННОГО ТОКА 1.19 MB
  Электрическим током называют упорядоченное движение зарядов. Эти заряды называют носителями тока. Линия тока есть математическая линия, направление касательной которой в каждой точке совпадает с направлением скорости носителей тока. За положительное направление тока принято считать направление скорости положительно заряженных частиц.
37956. Девиантное поведение. Концепции девиантного поведения 17.59 KB
  Девиантное поведение – поведение, отклоняющееся от нормы; когда человек ведет себя не в соответствии с нормами и стандартами поведения, принятыми в данном обществе.