85781

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

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

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

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

Русский

2015-03-30

59.2 KB

8 чел.

Лабораторная работа 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. Задано два текстовых файла, в которых строки упорядочены по возрастанию их длин. Строки в файлах могут совпадать Надо сформировать новый текстовый файл, в который входят строки из исходных таким образом, чтобы были исключены повторяющиеся строки.


 

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

67249. Феномен культурной глобализации 38 KB
  20 век характеризуется как эпоха глобализации так как страны и государства перестали развиваться изолированно друг от друга события произошедшие в одной стране тут же получают отклик во всем мире. Некоторые ученые говорят о том что современный этап глобализации является отнюдь не первым.
67250. ЮРИДИЧЕСКИЙ ПРОЦЕСС 123 KB
  Например обращение гражданина в суд для защиты нарушенного или оспоренного субъективного права без соблюдения установленного гражданским процессуальным законом Гражданским процессуальным кодексом порядка не приведет к желаемому результату: судья либо откажет в принятии заявления либо оставит поданное заявление...
67251. НЕЙРОННЫЕ ОСНОВЫ ПАМЯТИ И НАУЧЕНИЯ 168.5 KB
  Память можно определить как способность мозга приобретать и использовать опыт сохранять полученную информацию. Поскольку научение основывается на механизмах памяти два этих понятия неразрывно связаны. Такая перестройка должна обеспечивать адаптивное изменение поведения благодаря сохранению...
67252. ПОЛІТИКА ТА ЕТНОНАЦІОНАЛЬНІ ВІДНОСИНИ 161.5 KB
  Якщо народи існували з давніхдавен то нації викристалізувалися лише в XVII XVIII ст. Народність це історично сформована мовна територіальна економічна і культурна спільність людей яка передує нації. На відміну від нації у народності немає промисловості і відповідно...
67254. Передача параметрів конструкторам базового класу 75.5 KB
  Демонстрація механізму передачі параметрів конструкторам декількох базових класів Демонстрація механізму передачі аргументів конструкторам базового класу через конструктори похідного класу Дотепер жоден з попередніх прикладів не містив конструкторів для яких потрібно було...
67255. Документирование программных средств 149.5 KB
  Тексты и объектный код программ для ЭВМ могут стать программным продуктом только в совокупности с комплексом документов полностью соответствующих их содержанию и достаточных для его освоения применения и изменения. Посредством документов электронных или бумажных специалисты взаимодействуют...
67256. Статичне і відносне позиціонування CSS 260.5 KB
  Властивість position в CSS має чотири законних значення (на додаток до всюдисущому inherit): static, relative, absolute і fixed. Ці значення мають суттєвий вплив на те, як змальовується елемент. Два значення, static і relative, тісно пов’язані, й ми докладно розглянемо їх у цій темі.
67257. Законодательные органы 14.74 KB
  Ценности парламента: 1. Сегодня многие говорят о кризисе парламентаризма. Основные направления реформирования парламента: 1 Четко определить место парламента в системе распределения властей. Члены парламента осуществляют свою функцию профессионально все время на которое их избрали.