Операции для создания cpp файла. Работа с текстовыми файлами в C

По мере усложнения ваших программ они будут сохранять и получать информацию, используя файлы. Если вы знакомы с файловыми манипуляциями в языке С, вы сможете использовать подобные методы и в C++. Кроме того, как вы узнаете из этого урока, C++ предоставляет набор классов файловых потоков, с помощью которых можно очень легко выполнять операции ввода и вывода (В/В) с файлами. К концу данного урока вы освоите следующие основные концепции:

  • Используя выходной файловый поток, вы можете писать информацию в файл с помощью оператора вставки (<<).
  • Используя входной файловый поток, вы можете читать хранимую в файле информацию с помощью оператора извлечения (>>).
  • Для открытия и закрытия файла вы используете методы файловых классов.
  • Для чтения и записи файловых данных вы можете использовать операторы вставки и извлечения, а также некоторые методы файловых классов.

Многие программы, которые вы создадите в будущем, будут интенсивно использовать файлы. Выберите время для экспериментов с программами, представленными в данном уроке. И вы обнаружите, что в C++ выполнять файловые операции очень просто.

ВЫВОД В ФАЙЛОВЫЙ ПОТОК

Из урока 33 вы узнали, что cout представляет собой объект типа ostream(выходной поток). Используя класс ostream, ваши программы могут выполнять вывод в cout с использованием оператора вставки или различных методов класса, например cout.put. Заголовочный файлiostream.h определяет выходной поток cout. Аналогично, заголовочный файл f stream.h определяет класс выходного файлового потока с именемofstream. Используя объекты класса ofstream, ваши программы могут выполнять вывод в файл. Для начала вы должны объявить объект типаofstream, указав имя требуемого выходного файла как символьную строку, что показано ниже:

ofstream file_object(«FILENAME.EXT»);

Если вы указываете имя файла при объявлении объекта типа ofstream, C++ создаст новый файл на вашем диске, используя указанное имя, или перезапишет файл с таким же именем, если он уже существует на вашем диске Следующая программа OUT_FILE.CPP создает объект типа ofstreamи затем использует оператор вставки для вывода нескольких строк текста в файл BOOKINFO.DAT:

#include

{
ofstream book_file(«BOOKINFO.DAT»);
book_file << «Учимся программировать на языке C++, » << «Вторая редакция» << endl;
book_file << «Jamsa Press» << endl;
book_file << «22.95» << endl;
}

В данном случае программа открывает файл BOOKINFO.DAT и затем записывает три строки в файл, используя оператор вставки. Откомпилируйте и запустите эту программу. Если вы работаете в среде MS-DOS, можете использовать команду TYPE для вывода содержимого этого файла на экран:

С:\> TYPE BOOKINFO.DAT

Учимся программировать на языке C++, Вторая редакция

Как видите, в C++ достаточно просто выполнить операцию вывода в файл.

ЧТЕНИЕ ИЗ ВХОДНОГО ФАЙЛОВОГО ПОТОКА

Только что вы узнали, что, используя класс ofstream, ваши программы могут быстро выполнить операции вывода в файл. Подобным образом ваши программы могут выполнить операции ввода из файла, используя объекты типа ifstream. Опять же, вы просто создаете объект, передавая ему в качестве параметра требуемое имя файла:

ifstream input_file(«filename.EXT»);

Следующая программа FILE_IN.CPP открывает файл BOOKINFO.DAT, который вы создали с помощью предыдущей программы, и читает, а затем отображает первые три элемента файла:

#include

#include

{

char one, two, three;
input_file >> one;
input_file >> two;
input_file >> three;
cout << one << endl;
cout << two << endl;
cout << three << endl;
}

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

С:\> FILE_IN

программировать

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

Из урока 33 вы узнали, что ваши программы могут использовать cin.getlineдля чтения целой строки с клавиатуры. Подобным образом объекты типаifstream могут использовать getline для чтения строки файлового ввода. Следующая программа FILELINE.CPP использует функцию getline для чтения всех трех строк файла BOOKINFO.DAT:

#include

#include

{

char one, two, three ;
input_file.getline(one, sizeof(one)) ;
input_file.get line(two, sizeof(two));
input_file.getline(three, sizeof(three)) ;
cout << one << endl;
cout << two << endl;
cout << three << endl;
}

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

ОПРЕДЕЛЕНИЕ КОНЦА ФАЙЛА

Обычной файловой операцией в ваших программах является чтение содержимого файла, пока не встретится конец файла. Чтобы определить конец файла, ваши программы могут использовать функцию еоf потокового объекта. Эта функция возвращает значение 0, если конец файла еще не встретился, и 1, если встретился конец файла. Используя цикл while, ваши программы могут непрерывно читать содержимое файла, пока не найдут конец файла, как показано ниже:

while (! input_file.eof())

{
// Операторы
}

В данном случае программа будет продолжать выполнять цикл, пока функция eof возвращает ложь (0). Следующая программа TEST_EOF.CPP использует функцию eof для чтения содержимого файла BOOKINFO.DAT, пока не достигнет конца файла:

#include

#include

void main (void)

{
ifstream input_file(«BOOKINFO.DAT»);
char line;
while (! input_file.eof())

{
input_file.getline(line, sizeof(line));
cout << line << endl;
}
}

Аналогично, следующая программа WORD_EOF.CPP читает содержимое файла по одному слову за один раз, пока не встретится конец файла:

#include

#include

{
ifstream input_file(«BOOKINFO.DAT»);
char word ;
while (! input_file.eof())

{
input_file >> word;
cout << word << endl;
}
}

И наконец, следующая программа CHAR_EOF.CPP читает содержимое файла по одному символу за один раз, используя функцию get, пока не встретит конец файла:

#include

#include

{
ifstream input_file(«BOOKINFO.DAT»);
char letter;
while (! input_file.eof())

{
letter = input_file.get();
cout << letter;
}
}

ПРОВЕРКА ОШИБОК ПРИ ВЫПОЛНЕНИИ ФАЙЛОВЫХ ОПЕРАЦИЙ

Программы, представленные до настоящего момента, предполагали, что во время файловых операций В/В не происходят ошибки. К сожалению, это сбывается не всегда. Например, если вы открываете файл для ввода, ваши программы должны проверить, что файл существует. Аналогично, если ваша программа пишет данные в файл, вам необходимо убедиться, что операция прошла успешно (к примеру, отсутствие места на диске, скорее всего, помешает записи данных). Чтобы помочь вашим программам следить за ошибками, вы можете использовать функцию fail файлового объекта. Если в процессе файловой операции ошибок не было, функция возвратит ложь (0). Однако, если встретилась ошибка, функция fail возвратит истину. Например, если программа открывает файл, ей следует использовать функцию fail, чтобы определить, произошла ли ошибка, как это показано ниже:

ifstream input_file(«FILENAME.DAT»);
if (input_file.fail())

{
cerr << «Ошибка открытия FILENAME.EXT» << endl;
exit(1);
}

Таким образом, программы должны убедиться, что операции чтения и записи прошли успешно. Следующая программа TEST_ALL.CPP использует функцию fail для проверки различных ошибочных ситуаций:

#include

#include

{
char line ;
ifstream input_file(«BOOKINFO.DAT») ;
if (input_file.fail()) cerr << «Ошибка открытия BOOKINFO.DAT» << endl;
else

{
while ((! input_file.eof()) && (! input_file.fail()))

{
input_file.getline(line, sizeof(line)) ;
if (! input_file.fail()) cout << line << endl;
}
}
}

ЗАКРЫТИЕ ФАЙЛА, ЕСЛИ ОН БОЛЬШЕ НЕ НУЖЕН

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

Когда вы закрываете файл, все данные, которые ваша программа писала в этот файл, сбрасываются на диск, и обновляется запись каталога для этого файла.

УПРАВЛЕНИЕ ОТКРЫТИЕМ ФАЙЛА

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

ifstream output_file(«FILENAME.EXT», ios::app);

В данном случае параметр ios::app указывает режим открытия файла. По мере усложнения ваших программ они будут использовать сочетание значений для режима открытия файла, которые перечислены в табл. 34.

Таблица 34. Значения режимов открытия.

Режим открытия Назначение
ios::app Открывает файл в режиме добавления, располагая файловый указатель в конце файла.
ios::ate Располагает файловый указатель в конце файла.
ios::in Указывает открыть файл для ввода.
ios::nocreate Если указанный файл не существует, не создавать файл и возвратить ошибку.
ios::noreplace Если файл существует, операция открытия должна быть прервана и должна возвратить ошибку.
ios::out Указывает открыть файл для вывода.
ios::trunc Сбрасывает (перезаписывает) содержим, з существующего файла.

Следующая операция открытия файла открывает файл для вывода, используя режим ios::noreplace, чтобы предотвратить перезапись существующего файла:

ifstream output_file(«FIlename.EXT», ios::out | ios::noreplace);

ВЫПОЛНЕНИЕ ОПЕРАЦИЙ ЧТЕНИЯ И ЗАПИСИ

Все программы, представленные в данном уроке, выполняли файловые операции над символьными строками. По мере усложнения ваших программ, возможно, вам понадобится читать и писать массивы и структуры. Для этого ваши программы могут использовать функции readи write. При использовании функций read и write вы должны указать буфер данных, в который данные будут читаться или из которого они будут записываться, а также длину буфера в байтах, как показано ниже:

input_file.read(buffer, sizeof(buffer)) ;
output_file.write(buffer, sizeof(buffer));

Например, следующая программа STRU_OUT.CPP использует функциюwrite для вывода содержимого структуры в файл EMPLOYEE.DAT:

#include

#include

{
struct employee

{
char name;
int age;
float salary;

ofstream emp_file(«EMPLOYEE.DAT») ;
emp_file.write((char *) &worker, sizeof(employee));
}

Функция write обычно получает указатель на символьную строку. Символы (char *) представляют собой оператор приведения типов, который информирует компилятор, что вы передаете указатель на другой тип. Подобным образом следующая программа STRU_IN.CPP использует метод read для чтения из файла информации о служащем:

#include

#include

{
struct employee

{
char name ;
int age;
float salary;
} worker = { «Джон Дой», 33, 25000.0 };

ifstream emp_file(«EMPLOYEE.DAT»);
emp_file.read((char *) &worker, sizeof(employee));
cout << worker.name << endl;
cout << worker.age << endl;
cout << worker.salary << endl;
}

ЧТО ВАМ НЕОБХОДИМО ЗНАТЬ

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

  1. Заголовочный файл fstream.h определяет классы ifstream иofstream, с помощью которых ваша программа может выполнять операции файлового ввода и вывода.
  2. Для открытия файла на ввод или вывод вы должны объявить объект типа ifstream или ofstream, передавая конструктору этого объекта имя требуемого файла.
  3. После того как ваша программа открыла файл для ввода или вывода, она может читать или писать данные, используя операторы извлечения (>>) и вставки (<<).
  4. Ваши программы могут выполнять ввод или вывод символов в файл или из файла, используя функции get и put.
  5. Ваши программы могут читать из файла целую строку, используя функцию getline.
  6. Большинство программ читают содержимое файла, пока не встретится конец файла. Ваши программы могут определить конец файла с помощью функции eof.
  7. Когда ваши программы выполняют файловые операции, они должны проверять состояние всех операций, чтобы убедиться, что операции выполнены успешно. Для проверки ошибок ваши программы могут использовать функцию fail.
  8. Если вашим программам необходимо вводить или выводить такие данные, как структуры или массивы, они могут использовать методы read и write.
  9. Если ваша программа завершила работу с файлом, его следует закрыть с помощью функции close.

Работаем с потоками на C++ ofstream и ifstream . В пример показана программка генерирующая HTML файл, с данными в таблице, которые мы введем в программу. Используем потоковый ввод/вывод.

Потоки для работы с файлами создаются как объекты следующих классов:

  • ofstream - для вывода (записи) данных в файл;
  • ifstream - для ввода (чтения) данных из файла;
  • fstream - для чтения и для записи данных (двунаправленный обмен).

Чтобы использовать эти классы, в текст программы необходимо включить дополнительный заголовочный файл fstream.h . После этого в программе можно определять конкретные файловые потоки, соответствующих типов (объекты классов ofstream, ifstream, fstream ), например, таким образом:

  • ofstream outFile; // Выходной файловый поток.
  • ifstream inFile; // Входной файловый поток.
  • fstream ioFile; // Файловый поток для ввода и вывода.

Создание файлового потока (объекта соответствующего класса) связывает имя потока с выделяемым для него буфером и инициализирует переменные состояния потока. Так как перечисленные классы файловых потоков наследуют свойства класса ios , то и переменные состояния каждого файлового потока наследуются из этого базового класса. Так как файловые классы являются производными от классов ostream (класс ofstream ), istream (класс ifstream ), stream (класс fstream ), то они поддерживают описанный в предыдущих шагах форматированный и бесформатный обмен с файлами. Однако прежде чем выполнить обмен, необходимо открыть соответствующий файл и связать его с файловым потоком .

Открытие файла в самом общем смысле означает процедуру, информирующую систему о тех действиях, которые предполагается выполнять с файлом. Существуют функции стандартной библиотеки языка С для открытия файлов fopen() , open() . Но работая с файловыми потоками библиотеки ввода-вывода языка С++ , удобнее пользоваться компонентными функциями соответствующих классов.

Создав файловый поток, можно "присоединить" его к конкретному файлу с помощью компонентной функции open() . Функция open() унаследована каждым из файловых классов ofstream, ifsream, fstream от класса fstreambase . С ее помощью можно не только открыть файл, но и связать его с уже определенным потоком. Формат функции:

#include
#include
#include
#include
#include

char k;
char name;
char opisanie;
char god;
char kolvo;
main()
{
if ((access("index.html",2))==-1)
{

bat<<""< bat<<"[Каталог Компьютерных дисков]"< bat<<"

"< bat<<"
Каталог Компьютерных дисков.

"< bat<<""< bat<<""< bat<<""< bat<<""< bat<<""< bat.close();
}

do
{
clrscr();
cout<<" !!! Вместо пробелов используйте \"_\" !!! "< cout<<" Disk_List 1.0 - Програма для составлени списка дисков."< cout<<" Вводите все по очереди, и в текущей папке создастся файл HTML."< cout<<" Он и будет вашим списком. Его можно дописать запустив прогу."< cout<<"\nИмя диска: ";
cin>>name;
cout<<"\nОписане диска: ";
cin>>opisanie;
cout<<"\nКоличество томов: ";
cin>>kolvo;
cout<<"\nГод выпуска: ";
cin>>god;
ofstream bat("index.html",ios::app);
bat<<"

"< bat<<""< bat<<""< bat<<""< bat.close();
cout<<"\n\tВыход (для выхода Y)? ";
cin>>k;
}
while (k!="y" || k!="Y" || k!="ф" || k!="?");
}

Работа с текстовыми файлами в C++.

Существуют два основных типа файлов: текстовые и двоичные. Файлы позволяют пользователю считывать большие объемы данных непосредственно с диска, не вводя их с клавиатуры.

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

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

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

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

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

    описать переменную типа ofstream.

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

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

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

    описать переменную типа ifstream.

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

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

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

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

    Будет создана переменная F для записи информации в файл.

    На следующим этапе файл необходимо открыть для записи. В общем случае оператор открытия потока будет иметь вид:

F.open(«file», mode);

Здесь F - переменная, описанная как ofstream,

file - полное имя файла на диске,

mode - режим работы с открываемым файлом.

Обратите внимание на то, что при указании полного имени файла нужно ставить двойной слеш. Например, полное имя файла noobs.txt, находящегося в папке game на диске D:, нужно будет записать так:

D:\\game\\noobs.txt.

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

ios::in - открыть файл в режиме чтения данных, этот режим является режимом по умолчанию для потоков ifstream;

ios::out - открыть файл в режиме записи данных (при этом информация о существующем файле уничтожается), этот режим является режимом по умолчанию для потоков ofstream;

ios::app - открыть файл в режиме записи данных в конец файла;

ios::ate - передвинуться в конец уже открытого файла;

ios::trunc - очистить файл, это же происходит в режиме ios::out;

ios::nocreate - не выполнять операцию открытия файла, если он не существует;

ios::noreplace - не открывать существующий файл.

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

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

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

// первый способ

ofstream F;

F.open("D:\\game\\noobs.txt", ios::out);

//второй способ, режим ios::out является режимом по умолчанию

// для потока ofstream

ofstream F;

//третий способ объединяет описание переменной и типа поток

//и открытие файла в одном операторе

ofstream F ("D:\\game\\noobs.txt", ios::out);

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

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

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

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

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

G<

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

ПРИМЕР:

Создать текстовый файл D:\\game\\noobs.txt и записать в него n вещественных чисел.

#include "stdafx.h"

#include

#include

#include

using namespace std;

int main()

setlocale (LC_ALL, "RUS");

int i, n;

double a;

//описывает поток для записи данных в файл

ofstream f ;

//открываем файл в режиме записи,

//режим ios :: out устанавливается по умолчанию

f.open("D:\\game\\noobs.txt", ios::out);

//вводим количество вещественных чисел

cout <<" n ="; cin >> n ;

//цикл для ввода вещественных чисел

//и записи их в файл

for (i=0; i

cout<<"a=";

//ввод числа

cin>>a;

f<

//закрытие потока

f.close();

system("pause");

return 0;

_______________________________________________________________

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

F.open("D:\\game\\noobs.txt", ios::in);

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

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

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

Здесь F - имя потока функция возвращает логическое значение: true или false, в зависимости от того достигнут ли конец файла. Следовательно, цикл для чтения содержимого всего файла можно записать так:

//организуем для чтения значений из файла, выполнение

//цикла прервется, когда достигнем конец файла,

//в этом случае F.eof() вернет истину

while (!F.eof())

ПРИМЕР:

В текстовом файле D:\\game\\noobs.txt хранятся вещественные числа, вывести их на экран и вычислить их количество.

#include "stdafx.h"

#include

#include

#include

#include

using namespace std;

int main()

setlocale (LC_ALL, "RUS");

int n=0;

float a;

fstream F;

//открываем файл в режиме чтения

F.open("D:\\game\\noobs.txt");

//если открытие файла прошло корректно, то

//цикл для чтения значений из файла; выполнение цикла прервется,

//когда достигнем конца файла, в этом случае F.eof() вернет истину.

while (!F.eof())

//чтение очередного значения из потока F в переменную a

F>>a;

//вывод значения переменной a на экран

cout<

//увеличение количества считанных чисел

//закрытие потока

F.close();

//вовод на экран количества считанных чисел

cout<<"n="<

//если открытие файла прошло некорректно, то вывод

//сообщения об отсутствии такого файла

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

system("pause");

return 0;

C++. Обработка двоичных файлов

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

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

    описать файловую переменную типа FAIL * с помощью оператора FILE *filename;. Здесь filename - имя переменной, где будет храниться указатель на файл.

    записать информацию в файл с помощью функции fwrite

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

    описать переменную типа FILE *

    открыть файл с помощью функции fopen

    закрыть файл с помощью функции fclose

Основные функции, необходимые для работы с двоичными файлами.

Для открытия файла предназначена функция fopen.

FILE *fopen(const *filename, const char *mode)

Здесь filename - строка, в которой хранится полное имя открываемого файла, mode - строка, определяющая режим работы с файлом; возможны следующие значения:

«rb» - открываем двоичный файл в режиме чтения;

«wb» - создаем двоичный файл для записи; если он существует, то его содержимое очищается;

«ab» - создаем или открываем двоичный файл для дозаписи в конец файла;

«rb+» - открываем существующий двоичный файл в режиме чтения и записи;

«wb+» - открываем двоичный файл в режиме чтения и записи, существующий файл очищается;

«ab+» - двоичный файл открывается или создается для исправления существующий информации и добавления новой в конец файла.

Функция возвращает в файловой переменной f значение NULL в случае неудачного открытия файла. После открытия файла доступен 0-й его байт, указатель файла равен 0, значение которого по мере чтения или записи смещается на считанное (записанное) количество байт. Текущие значение указателя файла - номер байта, начиная с которого будет происходить операция чтения или записи.

Для закрытия файла предназначена функция fclose

int fclose(FILE *filename);

Возвращает 0 при успешном закрытие файла и NULL в противном случае.

Функция remove предназначена для удаления файлов.

int remove(const char *filename);

Эта функция удаляет с диска файл с именем filenema. Удаляемый файл должен быть закрыт. Функция возвращает ненулевое значение, если файл не удалось удалить.

Для переименования файлов предназначена функция rename:

int rename(const char *oldfilename, const char *newfilename);

Первый параметр - старое имя файла, второй - новое. Возвращает 0 при удачном завершении программы.

Чтение из двоичного файла осуществляется с помощью функции fread:

fread(void *ptr, size, n, FILE *filename);

Функция fread считывает из файла filename в массив ptr n элементов размера size. Функция возвращает количество считанных элементов. После чтения из файла его указатель смещается на n*size байт.

Запись в двоичный файл осуществляется с помощью функции fwrite:

fwrite(const void *ptr, size, n, FILE *filename);

Функция fwrite записывает в файл filename из массива ptr n элементов размера size. Функция возвращает количество записанных элементов. После записи информации в файл указатель смещается на n*size байт.

Для контроля достижения конца файла есть функция feof:

int feof(FILE *filename);

Она возвращает ненулевое значение если достигнут конец файла.

ПРИМЕР:

Создать двоичный файл D:\\game\\noobs.dat и записать в него целое число n и n вещественных чисел.

#include "stdafx.h"

#include

using namespace std;

int main()

setlocale (LC_ALL, "RUS");

int n, i;

double a;

//создаем двоичный файл в режиме записи

f=fopen("D:\\game\\noobs.dat", "wb");

// ввод числа n

cout<<"n="; cin>>n;

fwrite(&n, sizeof(int), 1, f);

//цикл для ввода n вещественных чисел

for (i=0; i

//ввод очередного вещественного числа

cout<<"a=";

cin>>a;

//запись вешественного числа в двоичный файл

fwrite(&a, sizeof(double), 1, f);

// закрываем файл

fclose(f);

system("pause");

return 0;

ПРИМЕР:

Вывести на экран содержимого созданного в прошлой задаче двоичного файла D:\\game\\noobs.dat

#include "stdafx.h"

#include

using namespace std;

int main()

setlocale (LC_ALL, "RUS");

int n, i;

double *a;

FILE *f; //описываем файловую переменную

//открываем существующий двоичный файл в режиме чтения

//считываем из файла одно целое число в переменную n

//вывод n на экран

cout<<"n="<

//выделение памяти для массива из n чисел

a=new double[n];

//чтение n вещественных чисел из файла в массив a

//вывод массива на экран

for (i=0; i

cout<

cout<

// закрываем файл

fclose(f);

system("pause");

return 0;

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

int n, i;

double a;

FILE *f;

f=fopen("D:\\game\\noobs.dat", "rb");

for (i=0; i<15; i++)

fclose(f);

f=fopen("D:\\game\\noobs.dat", "rb");

fread(&a, sizeof(double), 1, f);

fclose(f);

Как видно, такое чтение чисел из файла, а затем повторное открытие файла - не самый удобный способ. Гораздо удобнее будет использовать функцию fseek перемещения указателя файла к заданному байту.

int fseek(FILE *filename, long int offset, int origin);

Функция устанавливает указатель текущий позиции файла F в соответствии со значением начала отсчета origin и смещения offset. Параметр offset равен количеству байтов, на которые будет смещен указатель файла относительно начала отсчета, заданного параметром origin. В качестве значения для параметра origin должно быть взято одно из следующих значений отсчета смещения offset, определенных в заголовке stdio.h:

SEEK_SET - с начала файла;

SEEK_CUR - с текущей позиции;

SEEK_END - с конца файла.

Функция возвращает нулевое значение при успешном выполнение операции, ненулевое - при возникновении сбоя при выполнении смещения

Функция fseek фактически реализует прямой доступ к любому значению в файле. Необходимо только знать месторасположение (номер байта) значения в файле. Рассмотрим использование прямого доступа в двоичных файлах на примере решения следующей задачи.

ПРИМЕР

В созданном раннее двоичном файле D:\\game\\noobs.dat, поменять местами наибольшее и наименьшее из вещественных чисел.

Алгоритм решения задачи состоит из следующих этапов:

    чтение вещественных из файла в массив a.

    поиск в массиве а максимального (max) и минимального (min) значения и их номеров (imax, imin).

    перемещения указателя файла к максимальному значению и запись min.

    перемещения указателя файла к минимальному значению и запись max.

Ниже приведен текст программы решения задачи с комментариями.

#include "stdafx.h"

#include

using namespace std;

int main()

setlocale (LC_ALL, "RUS");

int n, i, imax, imin;

double *a, max, min;

FILE *f;

//открытие файла в режиме чтения и записи

f=fopen("D:\\game\\noobs.dat", "rb+");

//считываем из файла в переменную n количество

//вещественных чисел в файле

fread(&n, sizeof(int), 1, f);

cout<<"n="<

//выделяем память для хранения вещественных чисел,

//которые будут храниться в массиве a

a=new double[n];

//считываем из файла в массив а вещественные числа

fread(a, sizeof(double), n, f);

//поиск максимального и минимального элементов

//в массиве а и их индексов

for (imax=imin=0, max=min=a, i=1; i

if (a[i]>max)

max=a[i];

if (a[i]

min=a[i];

// перемещение указателя к максимальному элементу

fseek(f, sizeof(int)+imax*sizeof(double), SEEK_SET);

//запись min вместо максимального элемента файла

fwrite(&min, sizeof(double), 1, f);

// перемещение указателя к минимальному элементу

fseek(f, sizeof(int)+imin*sizeof(double), SEEK_SET);

//запись max вместо минимального элемента файла

fwrite(&max, sizeof(double), 1, f);

//закрытие файла

fclose(f);

//освобождение памяти

delete [ ]a;

system("pause");

В термине оператор сравнения слово «сравнение» относится к значениям операндов. В термине логический оператор слово «логический» относится к способу, которым устанавливаются эти отношения. Поскольку операторы сравнения и логические операторы тесно связаны друг с другом, мы рассмотрим их вместе. Операторы сравнения и логические операторы представлены в таблице 4. В основе операторов сравнения, и логических операторов лежат понятия «истина» и «ложь». В языке С истинным считается любое значение, не равное нулю. Ложное значение всегда равно 0. если результат ложен, и 1, если результат истинен.

В языке С++ истинные и ложные значения различаются точно так же, но, помимо этого, предусмотрен особый тип данных bool и булевые константы true и false .

Таблица 4.

Операторы сравнения и логические операторы

Операторы сравнения и логические операторы имеют более низкий приоритет, чем арифметические операторы. Таким образом, выражение 10 > 1+12 будет вычислено так, будто оно записано следующим образом: 10 > (1+12).

Побитовые операторы

В отличие от многих языков программирования, язык С/С++ содержит полный набор побитовых операторов. Поскольку С был разработан в качестве замены языка ассемблера, он предусматривает многие операции низкого уровня, в частности, побитовые операции, предназначенные для проверки, установки и сдвига битов, из которых состоят байты и машинные слова, образующие переменные типа char или int. Побитовые операторы представлены в таблице 5.

Таблица 5.

Побитовые операторы

Контрольные вопросы

1. Объясните, что понимают под программированием.

2. Приведите этапы жизненного цикла ПО?

3. Какие вы знаете методы проектирования ПО.

4. Перечислите операции для создания *.cpp файла?

5. Состав языка в С++.

6. Какова общая структура программы на языке С++?

7. какие вы знаете типы данных в С++?

8. Переменные. Объявление переменных в С++.

9. Есть ли с точки зрения языка С++ разница между числами:

11. Приведите основные операторы в С++?


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

Разработка программы с применением

базовых операторов С++

Цель работы:

1. Изучение основных операторов языка С++;

2. Приобретение навыков работы в ИСП Microsoft Visual C++ 5.0.

Используемое оборудование:

Персональная ЭВМ, совместимая с IBM PC.

Используемое программное обеспечение:

Операционная система Windows;

Интегрированная среда программирования Microsoft Visual C++ 5.0.

Задание по работе

1.1. Загрузить ИСП Microsoft Visual C++ 5.0;

1.2. Изучить основные типы данных, ИСП Microsoft Visual C++ 5.0;

1.3. Выполнить задание преподавателя;

1.4. Записать протокол работы с интегрированной средой.

Порядок выполнения работы

2.1. Составить схему алгоритма (по заданию преподавателя);

2.2. Запустить Microsoft Visual C++ 5.0;

2.3. Создать *.cpp файл в рабочем каталоге;

2.5. Записать схему алгоритма и текст программы в протокол работы с интегрированной средой;

2.6. Закончить работу с Microsoft Visual C++ 5.0 и запустить программу.

3.1. Наименование лабораторной работы.

3.2. Цель работы.

3.3. Теоретическую часть.

3.4. Алгоритм программы.

3.5. Текст программы.

3.6. Вывод.

Краткое описание

Оператор – это часть программы, которую можно выполнить отдельно, иными словами, оператор определяет некое действие. Операторы языка С и С++ разделяются на следующие категории:

Ø условные операторы (оператор условия if и оператор выбора switch);

Ø операторы цикла (for, while, do while);

Ø операторы перехода (break, continue, return, goto);

Ø другие операторы (оператор "выражение ", пустой оператор).

Операторы в программе могут объединяться в составные операторы с помощью фигурных скобок. Любой оператор в программе может быть помечен меткой, состоящей из имени и следующего за ним двоеточия. Все операторы языка C/C++, кроме составных операторов, заканчиваются точкой с запятой ";".

Оператор выражение

Любое выражение, которое заканчивается точкой с запятой, является оператором. Выполнение оператора выражение заключается в вычислении выражения.

Примеры:

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

a=cos(b*5);

Этот оператор представляет выражение, включающее в себя операции присваивания, умножения и вызова функции.

Fun(x,y);

Этот оператор представляет выражение, состоящее из вызова функции.

Пустой оператор

Пустой оператор состоит только из точки с запятой ";". При выполнении этого оператора ничего не происходит.

Составной оператор

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

Условные операторы

Оператор if

Формат оператора:

if (выражение) оператор1;

else оператор 2;

Выполнение оператора if начинается с вычисления выражения. Далее выполнение осуществляется по следующей схеме:

Если выражение истинно (т.е. отлично от 0), то выполняется оператор1;

Если выражение ложно (т.е. равно 0),то выполняется оператор2;

Если выражение ложно и отсутствует оператор2 (в квадратные скобки заключена необязательная конструкция), то выполняется следующий за if оператор.

Следующий фрагмент иллюстрирует вложенные операторы if :

Char sign;

Int x,y,z;

if (sign == ’-’)

x = y - z;

else if (sign == ’+’)

x = y + z;

else if (sign == ’*’)

x = y * z;

else if (ZNAC == ’/’)

x = y / z;

Вложенным называетсяоператорif, который находится внутри другого оператора if или else . Вложенные операторы if встречаются довольно часто. во вложенном условном операторе раздел else всегда связан с ближайшим оператором if, находящимся с ним в одном блоке и не связан с другим оператором else .

if(j) оператор 1;

if(k) оператор2; /* данный if */

else оператор3; /* связан с данным оператором else */

else оператор4; /* связан с оператором if (i) */

Последний раздел else связан не с оператором if(j) , который находится в другом блоке, а с оператором if (i). Внутренний раздел else связан с операторомif(k) , потому что этот оператор if является ближайшим.

Оператор switch

Оператор switch предназначен для организации выбора из множества различных вариантов.

Формат оператора следующий:

Switch (выражение)

{ [объявление]

[ case константное-выражение1]: [список-операторов1]

[ case константное-выражение2]: [список-операторов2]

[ default: [список операторов]]

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

Все константные выражения в операторе switch должны быть уникальны. Кроме операторов, помеченных ключевым словом case , может быть, но обязательно один, фрагмент, помеченный ключевым словом default. Список операторов может быть пустым, либо содержать один или более операторов. Причем в операторе switch не требуется заключать последовательность операторов в фигурные скобки.

Схема выполнения оператора switch следующая:

Вычисляется выражение в круглых скобках;

Вычисленные значения последовательно сравниваются с константными выражениями, следующими за ключевыми словами case ;

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

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

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

Пример:

int i=2;

Switch (i)

case 1: i += 2;

case 2: i *= 3;

case 0: i /= 2;

case 4: i -= 5;

default: ;

Операторы switch могут быть вложены друг в друга, даже если константы разделов case внешнего и внутреннего операторов switch совпадают, проблемы не возникают.

Операторы перехода

Оператор break

Оператор break обеспечивает прекращение выполнения самого внутреннего из объединяющих его операторов switch , do , for , while . После выполнения оператора break управление передается оператору, следующему за прерванным.

Функция exit () не относится к управляющим операторам, настало время ее изучить. Вызов стандартной библиотечной функции exit () приводит к прекращению работы программы и передаче управления операционной системе.

Функция exit () выглядит следующим образом.

void exit (int код_возврата );

Значение переменной код_возврата передается вызывающему процессу, в роли которого чаще всего выступает операционная система.

Оператор continue

Оператор continue , как и оператор break , используется только внутри операторов цикла, но в отличие от него выполнение программы продолжается не с оператора, следующего за прерванным оператором, а с начала прерванного оператора.

Пример:

Int main()

Int a,b;

for (a=1,b=0; a<100; b+=a,a++)

if (b%2) continue;

... /* обработка четных сумм */

Return 0;

Когда сумма чисел от 1 до а становится нечетной, оператор continue передает управление на очередную итерацию цикла for , не выполняя операторы обработки четных сумм. Оператор continue, как и оператор break , прерывает самый внутренний из объемлющих его циклов.

Оператор return

Оператор return завершает выполнение функции, в которой он задан, и возвращает управление в вызывающую функцию, в точку, непосредственно следующую за вызовом. Функция main передает управление операционной системе.

Формат оператора:

return [выражение];

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

Если в какой-либо функции отсутствует оператор return , то передача управления в вызывающую функцию происходит после выполнения последнего оператора вызываемой функции. При этом возвращаемое значение не определено. Если функция не должна иметь возвращаемого значения, то ее нужно объявлять с типом void. Таким образом, использование оператора return необходимо либо для немедленного выхода из функции, либо для передачи возвращаемого значения.

Пример:

Int sum (int a, int b)

return (a+b);

Функция sum имеет два формальных параметра a и b типа int, и возвращает значение типа int, о чем говорит описатель, стоящий перед именем функции. Возвращаемое оператором return значение равно сумме фактических параметров.

Пример:


Похожая информация.




Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам:

ИмяОписаниеКол-во томовГод
"<"<"<" <