Работа с текстовыми файлами в C. Закрытие файла, если он больше не нужен


Большинство компьютерных программ работают с файлами, и поэтому возникает необходимость создавать, удалять, записывать читать, открывать файлы. Что же такое файл? Файл – именованный набор байтов, который может быть сохранен на некотором накопителе. Ну, теперь ясно, что под файлом понимается некоторая последовательность байтов, которая имеет своё, уникальное имя, например файл.txt . В одной директории не могут находиться файлы с одинаковыми именами. Под именем файла понимается не только его название, но и расширение, например: file.txt и file.dat разные файлы, хоть и имеют одинаковые названия. Существует такое понятие, как полное имя файлов – это полный адрес к директории файла с указанием имени файла, например: D:\docs\file.txt . Важно понимать эти базовые понятия, иначе сложно будет работать с файлами.

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

Файловый ввод/вывод аналогичен стандартному вводу/выводу, единственное отличие – это то, что ввод/вывод выполнятся не на экран, а в файл. Если ввод/вывод на стандартные устройства выполняется с помощью объектов cin и cout , то для организации файлового ввода/вывода достаточно создать собственные объекты, которые можно использовать аналогично операторам cin и cout .

Например, необходимо создать текстовый файл и записать в него строку Работа с файлами в С++ . Для этого необходимо проделать следующие шаги:

  1. создать объект класса ofstream ;
  2. связать объект класса с файлом, в который будет производиться запись;
  3. записать строку в файл;
  4. закрыть файл.

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

// создаём объект для записи в файл ofstream /*имя объекта*/; // объект класса ofstream

Назовём объект – fout , Вот что получится:

Ofstream fout;

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

Fout.open("cppstudio.txt"); // связываем объект с файлом

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

Fout << "Работа с файлами в С++"; // запись строки в файл

Используя операцию передачи в поток совместно с объектом fout строка Работа с файлами в С++ записывается в файл. Так как больше нет необходимости изменять содержимое файла, его нужно закрыть, то есть отделить объект от файла.

Fout.close(); // закрываем файл

Итог – создан файл со строкой Работа с файлами в С++ .

Шаги 1 и 2 можно объединить, то есть в одной строке создать объект и связать его с файлом. Делается это так:

Ofstream fout("cppstudio.txt"); // создаём объект класса ofstream и связываем его с файлом cppstudio.txt

Объединим весь код и получим следующую программу.

// file.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include using namespace std; int main(int argc, char* argv) { ofstream fout("cppstudio.txt"); // создаём объект класса ofstream для записи и связываем его с файлом cppstudio.txt fout << "Работа с файлами в С++"; // запись строки в файл fout.close(); // закрываем файл system("pause"); return 0; }

Осталось проверить правильность работы программы, а для этого открываем файл cppstudio.txt и смотрим его содержимое, должно быть — Работа с файлами в С++ .

  1. создать объект класса ifstream и связать его с файлом, из которого будет производиться считывание;
  2. прочитать файл;
  3. закрыть файл.
// file_read.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include #include using namespace std; int main(int argc, char* argv) { setlocale(LC_ALL, "rus"); // корректное отображение Кириллицы char buff; // буфер промежуточного хранения считываемого из файла текста ifstream fin("cppstudio.txt"); // открыли файл для чтения fin >> << buff << endl; // напечатали это слово fin.getline(buff, 50); // считали строку из файла fin.close(); // закрываем файл cout << buff << endl; // напечатали эту строку system("pause"); return 0; }

В программе показаны два способа чтения из файла, первый – используя операцию передачи в поток, второй – используя функцию getline() . В первом случае считывается только первое слово, а во втором случае считывается строка, длинной 50 символов. Но так как в файле осталось меньше 50 символов, то считываются символы включительно до последнего. Обратите внимание на то, что считывание во второй раз (строка 17 ) продолжилось, после первого слова, а не с начала, так как первое слово было прочитано в строке 14 . Результат работы программы показан на рисунке 1.

Работа с файлами в С++ Для продолжения нажмите любую клавишу. . .

Рисунок 1 — Работа с файлами в С++

Программа сработала правильно, но не всегда так бывает, даже в том случае, если с кодом всё впорядке. Например, в программу передано имя несуществующего файла или в имени допущена ошибка. Что тогда? В этом случае ничего не произойдёт вообще. Файл не будет найден, а значит и прочитать его не возможно. Поэтому компилятор проигнорирует строки, где выполняется работа с файлом. В результате корректно завершится работа программы, но ничего, на экране показано не будет. Казалось бы это вполне нормальная реакции на такую ситуацию. Но простому пользователю не будет понятно, в чём дело и почему на экране не появилась строка из файла. Так вот, чтобы всё было предельно понятно в С++ предусмотрена такая функция — is_open() , которая возвращает целые значения: 1 — если файл был успешно открыт, 0 — если файл открыт не был. Доработаем программу с открытием файла, таким образом, что если файл не открыт выводилось соответствующее сообщение.

// file_read.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include #include using namespace std; int main(int argc, char* argv) { setlocale(LC_ALL, "rus"); // корректное отображение Кириллицы char buff; // буфер промежуточного хранения считываемого из файла текста ifstream fin("cppstudio.doc"); // (ВВЕЛИ НЕ КОРРЕКТНОЕ ИМЯ ФАЙЛА) if (!fin.is_open()) // если файл не открыт cout << "Файл не может быть открыт!\n"; // сообщить об этом else { fin >> buff; // считали первое слово из файла cout << buff << endl; // напечатали это слово fin.getline(buff, 50); // считали строку из файла fin.close(); // закрываем файл cout << buff << endl; // напечатали эту строку } system("pause"); return 0; }

Результат работы программы показан на рисунке 2.

Файл не может быть открыт! Для продолжения нажмите любую клавишу. . .

Рисунок 2 — Работа с файлами в С++

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

Режимы открытия файлов

Режимы открытия файлов устанавливают характер использования файлов. Для установки режима в классе ios_base предусмотрены константы, которые определяют режим открытия файлов (см. Таблица 1).

Режимы открытия файлов можно устанавливать непосредственно при создании объекта или при вызове функции open() .

Ofstream fout("cppstudio.txt", ios_base::app); // открываем файл для добавления информации к концу файла fout.open("cppstudio.txt", ios_base::app); // открываем файл для добавления информации к концу файла

Режимы открытия файлов можно комбинировать с помощью поразрядной логической операции или | , например: ios_base::out | ios_base::trunc — открытие файла для записи, предварительно очистив его.

Объекты класса ofstream , при связке с файлами по умолчанию содержат режимы открытия файлов ios_base::out | ios_base::trunc . То есть файл будет создан, если не существует. Если же файл существует, то его содержимое будет удалено, а сам файл будет готов к записи. Объекты класса ifstream связываясь с файлом, имеют по умолчанию режим открытия файла ios_base::in — файл открыт только для чтения. Режим открытия файла ещё называют — флаг, для удобочитаемости в дальнейшем будем использовать именно этот термин. В таблице 1 перечислены далеко не все флаги, но для начала этих должно хватить.

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

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

  1. число байт, отводимое под тип данных
  2. максимальное значение, которое может хранить определённый тип данных.

Запись в файл должна выполняться в таком формате:

/* data type byte max value bool = 1 255.00 char = 1 255.00 short int = 2 32767.00 unsigned short int = 2 65535.00 int = 4 2147483647.00 unsigned int = 4 4294967295.00 long int = 4 2147483647.00 unsigned long int = 4 4294967295.00 float = 4 2147483647.00 long float = 8 9223372036854775800.00 double = 8 9223372036854775800.00 */

Такая программа уже разрабатывалась ранее в разделе , но там вся информация о типах данных выводилась на стандартное устройство вывода, а нам необходимо программу переделать так, чтобы информация записывалась в файл. Для этого необходимо открыть файл в режиме записи, с предварительным усечением текущей информации файла (строка 14 ). Как только файл создан и успешно открыт (строки 16 — 20), вместо оператора cout , в строке 22 используем объект fout . таким образом, вместо экрана информация о типах данных запишется в файл.

// write_file.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include #include // работа с файлами #include // манипуляторы ввода/вывода using namespace std; int main(int argc, char* argv) { setlocale(LC_ALL, "rus"); // связываем объект с файлом, при этом файл открываем в режиме записи, предварительно удаляя все данные из него ofstream fout("data_types.txt", ios_base::out | ios_base::trunc); if (!fout.is_open()) // если файл небыл открыт { cout << "Файл не может быть открыт или создан\n"; // напечатать соответствующее сообщение return 1; // выполнить выход из программы } fout << " data type " << "byte" << " " << " max value " << endl // заголовки столбцов << "bool = " << sizeof(bool) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных bool*/ << (pow(2,sizeof(bool) * 8.0) - 1) << endl << "char = " << sizeof(char) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных char*/ << (pow(2,sizeof(char) * 8.0) - 1) << endl << "short int = " << sizeof(short int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных short int*/ << (pow(2,sizeof(short int) * 8.0 - 1) - 1) << endl << "unsigned short int = " << sizeof(unsigned short int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных unsigned short int*/ << (pow(2,sizeof(unsigned short int) * 8.0) - 1) << endl << "int = " << sizeof(int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных int*/ << (pow(2,sizeof(int) * 8.0 - 1) - 1) << endl << "unsigned int = " << sizeof(unsigned int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных unsigned int*/ << (pow(2,sizeof(unsigned int) * 8.0) - 1) << endl << "long int = " << sizeof(long int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных long int*/ << (pow(2,sizeof(long int) * 8.0 - 1) - 1) << endl << "unsigned long int = " << sizeof(unsigned long int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных undigned long int*/ << (pow(2,sizeof(unsigned long int) * 8.0) - 1) << endl << "float = " << sizeof(float) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных float*/ << (pow(2,sizeof(float) * 8.0 - 1) - 1) << endl << "long float = " << sizeof(long float) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных long float*/ << (pow(2,sizeof(long float) * 8.0 - 1) - 1) << endl << "double = " << sizeof(double) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных double*/ << (pow(2,sizeof(double) * 8.0 - 1) - 1) << endl; fout.close(); // программа больше не использует файл, поэтому его нужно закрыть cout << "Данные успешно записаны в файл data_types.txt\n"; system("pause"); return 0; }

Нельзя не заметить, что изменения в программе минимальны, а всё благодаря тому, что стандартный ввод/вывод и файловый ввод/вывод используются абсолютно аналогично. В конце программы, в строке 45 мы явно закрыли файл, хотя это и не обязательно, но считается хорошим тоном программирования. Стоит отметить, что все функции и манипуляторы используемые для форматирования стандартного ввода/вывода актуальны и для файлового ввода/вывода. Поэтому не возникло никаких ошибок, когда оператор cout был заменён объектом fout .

По мере усложнения ваших программ они будут сохранять и получать информацию, используя файлы. Если вы знакомы с файловыми манипуляциями в языке С, вы сможете использовать подобные методы и в 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!="?");
}







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

Учебник С++

Содержание частей учебника

Часть 1. Изучение основ.

Урок 1. Создание вашей первой программы.
Урок 2. Более внимательный взгляд на С++.
Урок 3. Вывод сообщений на экран.
Урок 4. Программы хранят информацию в переменных.
Урок 5. Выполнение простых операций.
Урок 6. Чтение ввода с клавиатуры.

Урок 8. Повторение одного или нескольких операторов

Часть 2. Создание программ с помощью функций.

Урок 9. Знакомство с функциями.
Урок 10. Изменение значений параметров.
Урок 11. Преимущества использования библиотеки этапа выполнения.
Урок 12. Локальные переменные и область видимости.
Урок 13. Перегрузка функций.
Урок 14. Использование ссылок в С++.
Урок 15. Значения параметров по умолчанию.

Часть 3. Хранение информации с помощью массивов и структур.

Урок 16. Хранение значений в массивах.
Урок 17. Символьные строки.
Урок 18. Хранение связанной информации в структурах.
Урок 19. Объединения.
Урок 20. Указатели.

Часть 4. Использование классов в С++.

Урок 21. Знакомство с классами в С++.
Урок 22. Частные и общие данные.
Урок 23. Конструктор и деструктор.
Урок 24. Перегрузка операторов.
Урок 25. Статические функции и элементы данных.

Часть 5. Наследование и шаблоны.

Урок 26. Наследование.
Урок 27. Множественное наследование.
Урок 28. Частные элементы и друзья.
Урок 29. Использование шаблонов функций.
Урок 30. Использование шаблонов классов.

Часть 6. Расширенные возможности С++.

Урок 31. Использование свободной памяти в С++.
Урок 32. Управление свободной памятью.
Урок 33. Дополнительные возможности cin и cout.
Урок 34. Файловые операции В/В в С++.
Урок 35. Встроенные функции и ассемблерные коды.
Урок 36. Использование аргументов командной строки.
Урок 37. Использование констант и макрокоманд.
Урок 38. Полиморфизм.
Урок 39. Использование исключительных ситуаций С++ для обработки ошибок.


Урок 1. Создание вашей первой программы.

Для начала надо определиться с некоторыми ключевыми понятиями. Итак.

Программное обеспечение - это файлы, содержащие инструкции (команды), которые указывают компьютеру, что следует делать. Это файлы с расширением EXE.

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

Язык программирования - это язык инструкций для компьютера, например С++.

Исходный файл - это текстовый файл, хранящий инструкции (команды).

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

Создание простой программы

Сегодня большинство программистов на С++ программируют в среде для Windows, таких как Visual C++ или Borland C++. Для примеров в учебнике будет использоваться интегрированная среда фирмы Borland.
После запуска программы выберите File > New > TextEdit. Появится окно текстового редактора в которое вы будете вводить текст программы.



Создайте на диске папку в которой вы будете сохранять ваши программы, например C:\MyProgs. По умолчанию файл в Borland C++ имеет название NONAME00.CPP . Расширение СРР указывает на то, что этот файл содержит программу на С++. Наша первая программа будет называться FIRST.CPP , для изменения названия выберите File > Save as.. В диалоговом окне введите название файла FIRST (расширение можно не вводить) и нажмите "Сохранить".

В окно редактора введите следующие операторы программы С++:

#include
void main(void)
{
cout << "Учимся программировать на языке С++!";
}

Примечание. Если вместо русских букв у вас появляются непонятные символы, выберите Options > Environment..


В появившемся диалоговом окне, в левой части дважды щелкните на пункте Edit и выберите подпункт Display и в правой части окна в разделе Font выберите другой шрифт.

Компиляция вашей программы

Компьютер работает с комбинациями единиц и нулей (машинным языком). Он не понимает операторы программы на С++, которые понятны вам. Чтобы перевести операторы С++ в машинный язык используется компилятор . Компилятор создает файл с расширением EXE, который вы можете запустить.

Итак, чтобы откомпилировать программу выберите Project > Make All или нажмите F9, программа произведет компиляцию и если вы не допустили ошибок в исходном тексте выведет сообщение об успешной компиляции.

Теперь можно запустить вашу программу. Для этого в сеансе MS-DOS в командной строке введите имя программы, т.е. FIRST. Так, если ваша программа находится в каталоге C:\MyProgs , то вам в ответ на командную подсказку C:\> надо ввести MyProgs\FIRST.

Создание второй программы

Для создания новой программы выберите File > New > TextEdit, а затем сохраните её под именем EASY.CPP. Введите следующие операторы:

#include
void main(void)
{
cout << "Программировать на С++ просто!";
}

Как и ранее сохраните свои операторы программы в исходном файле и откомпилируйте программу (F9) Компилятор создаст программу с именем EASY.EXE. Когда вы её запустите, на вашем экране появится следующее сообщение:



Cout <<"Программировать на C++ очень просто!";

Сохраните ваше изменение в исходном файле и откомпилируйте программу. После этого запустите программу.

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

Изучение синтаксических ошибок.

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

Если вы допускаете ошибку при написании программы, компилятор С++ выводит на экран сообщение об ошибке, которое описывает ошибку и соответствующий ей номер строки в исходном файле.

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

#include

Void main(void)
{
cout << "Заключайте сообщения в кавычки;
}

При компиляции программы компилятор выведет сообщение о синтаксических ошибках.


Отредактируйте файл, заключив предложение в кавычки.

Cout << "Заключайте сообщения в кавычки";

Теперь можете успешно откомпилировать программу и запустить файл.

Урок 2. Более внимательный взгляд на С++.

В уроке 1 вы создали программу FIRST.CPP, которая содержала следующие операторы:

#include

Void main(void)
{
cout << "Учимся программировать на языке С++!";
}

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

Представление об операторе #include

При компиляции программы оператор #include заставляет компилятор включать содержимое заданного файла в начало вашей программы. В примерах из первого урока это файл iostream.h

Файлы с расширением h, которые вы включаете в начало (или заголовок ) вашей программы, называются заголовочными файлами. Если вы посмотрите в котолог, содержащий файлы вашего компилятора, то найдете подкаталог с именем INCLUDE, в котором находятся заголовочные файлы. Содержимое этих файлов можно вывести на экран или принтер.

Примечание: Никогда не изменяйте содержимое заголовочных файлов. Это может привести к ошибкам компиляции в каждой создаваемой вами программе.

Что такое void main(void)

Каждая программа на С++ имеет один вход, с которого начинается выполнение программы, - главную программу. В программах на С++ оператор void main(void) указывает стартовую точку вашей программы.

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

Использование void

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

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

Программы используют слово void для указания того, что функция не возвращает значения или не имеет значений, передаваемых в нее. Большинство простых программ на С++, которые будут созданы вами в процессе изучения учебника, не возвращают выходное значение статуса операционной системе. Поэтому вы должны размещать слово void перед main.

Если программа не использует информацию командной строки, вы должны разместить слово void внутри круглых скобок после main, как показано ниже:

Void main(void)

Представление о группирующих операторах { }.

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

Использование cout для отображения вывода на экран.

Чтобы вывести сообщение, программы используют cout и двойной знак меньше (<<), как показано ниже:

Cout << "Привет, С++!";

Слово cout представляет собой выходной поток , который С++ назначает на стандартное устройство вывода операционной системы (по умолчанию - монитор).

Урок 3. Вывод сообщений на экран.

До сих пор созданные вами программы использовали cout для вывода символьных строк (букв и чисел, взятых в кавычки). Но cout также можно использовать для вывода чисел (без кавычек). Следующая программа 1001.CPP выводит число 1001 на ваш экран:

#include

Void main(void)
{
cout << 1001;
}

Откомпилируйте и запустите эту программу. На вашем экране будет отображено число 1001, как показано ниже:

Кроме отображения целых чисел , cout также позволяет отображать числа с плавающей точкой , например 1.2345. Следующая программа FLOATING.CPP использует cout для вывода числа 0.12345 на экран:

#include

Void main(void)
{
cout << 0.12345;
}

Вывод нескольких значений одновременно

Как вы уже знаете двойной знак "меньше" является операцией вставки . С помощью оператора cout вы можете использовать несколько операций вставки в пределах одного оператора. Например, следующая программа 1001TOO.CPP использует эту операцию четыре раза для отображения числа 1001 на вашем экране:

#include

Void main(void)
{
cout << 1 << 0 << 0 << 1;
}

Каждый раз, когда в С++ встречается операция вставки, число или символы просто добавляются к тем, что находятся в настоящее время в выходном потоке. Следующая программа SHOW1001.CPP с помощью cout выводит символьную строку и число:

#include

Void main(void)
{
cout << "Мое любимое число равно " << 1001;
}

Обратите внимаение, что пробел, следующий за словом равно , служит для отделения числа 1001 от этого слова. Без пробела число сливается со следующим словом (равно1001).

Использование специальных символов вывода

Все программы, созданные вами до сих пор, отображали свой вывод в одну строку. Если необходимо переместить курсор в начало следующей строки, можно поместить символ новой строки (\n) в выходной поток. В С++ имеется два разных способа создания новой строки. Первый - это помещение символа \n внутри символьной строки. Например, следующая программа TWOLINES.CPP отображает свой вывод в виде двух строк, используя символ новой строки:

#include

Void main(void)
{
cout << "Это строка один\nЭто строка два";
}

Если вы не выводите символьную строку, можете поместить символ новой строки внутри одинарных кавычек. Например, следующая программа NEWLINES.CPP выводит числа 1, 0, 0 и 1, каждое на своей собственной строке:

#include

Void main(void)
{
cout << 1 << "\n" << 0 << "n" << 0 << "n" << 1;
}

Кроме символа новой строки для продвижения в начало следующей строки вы можете использовать символ endl (конец строки). Следующая программа ENDL.CPP иллюстрирует использование endl для продвижения курсора в начало новой строки:

#include

Void main(void)
{
cout << "А теперь..." << endl
<< "Учимся программировать на языке С++";
}

Другие специальные символы

Вывод восьмеричных и шеснадцатеричных значений

В зависимости от назначения ваших программ вам, возможно, потребуется выводить числа в восьмеричном или шеснадцатеричном виде. Для этого необходимо разместить модификаторы dec , oct и hex внутри выходного потока. Следующая программа OCTHEX.CPP использует эти модификаторы для вывода значений в десятичном, весьмеричном и шеснадцатеричном виде:

#include

Void main(void)
{
cout << "Восьмеричный: " << oct << 10 << " " << 20 << endl;
cout << "Шеснадцатеричный: " << hex << 10 << " " << 20 << endl;
cout << "Десятичный: " << dec << 10 << " " << 20 << endl;
}

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

Управление шириной вывода

При выводе на cout ваши программы могут указать ширину вывода каждого числа, используя модификатор setw (установка ширины). С помощью setw программы указывают минимальное число символов, занимаемое числом. Например, следующая программа SETW.CPP использует модификаор setw для выбора ширины 3, 4, 5 и 6 для числа 1001. Чтобы использовать модификатор setw, ваша программа должна включать заголовочный файл iomanip.h:

#include
#include

Void main(void)
{
cout << "Мое любимое число равно" << setw(3) << 1001 << endl;
cout << "Мое любимое число равно" << setw(4) << 1001 << endl;
cout << "Мое любимое число равно" << setw(5) << 1001 << endl;
cout << "Мое любимое число равно" << setw(6) << 1001 << endl;
}

Если вы указываете ширину с помощью setw, вы указываете минимальное количество символьных позиций, занимаемых числом. В предыдущей программе модификатор setw(3) указывал минимум три символа. Однако, так как число 1001 потребовало больше трех символов, cout использовал реально требуемое количество, т.е. четыре.

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

Примечание: Предыдущая программа использует заголовочный файл IOMANIP.H. Вы можете исследовать содержимое этого файла, только ничего не изменяйте. Как и заголовочный файл IOSTREAM.H данный файл находится в подкаталоге INCLUDE.

Урок 4. Программы хранят информацию в переменных.

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

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

Тип
char
int
unsigned
long
float
double
Хранимые значения
Значения в диапазоне от -128 до 127
Значения в диапазоне -32768 до 32767
Значения в диапазоне 0 до 65535
Значения в диапазоне от -2147483648 до 2147483647
Значения в диапазоне от -3.4 x 10^-38 до 3.4 x 10^38
Значения в диапазоне от 1.7 x 10^-308 до 1.7 x 10^308

Прежде чем вы сможете использовать переменную ваша программа должна её объявить, т.е. представить её компилятору С++. Чтобы объявить переменную, вам следует указать тип переменной и её имя, по которому программа будет обращаться к данной переменной. Выбираемое вами имя переменной может быть произвольным, но лучше, если оно будет иметь смысл, который описывает использование переменной. Например могут быть такие имена: name, age.

В С++ объявление перменной считается оператором, поэтому за именем переменной следует ставить точку с запятой.

Фрагмент следующей программы объявляет три переменные, используя типы int, float и long :

#include

Void main(void)
{
int test_score;
float salary;
long distance_to_mars;
}

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

Float salary, income_tax, retirement_fund;

Слова, которые нельзя использовать для имен переменных.

При создании имен переменных нелбходимо знать, что в С++ слова, перечисленные ниже используются в качестве ключевых слов, имеющих специальное значение для компилятора, поэтому вы не имеете права использовать их в качестве имен переменных.

Asm auto break case catch char class const continue default delete do double else enum extern float for friend goto if inline int long new operator private protected public register return short signed sizeof static struct switch template this throw try typedef union unsigned virtual void volatile while

Присваивание значения переменной

После объявления переменной вы используете оператор присваивания С++ (знак равно), чтобы присвоить значение переменной. Следующие операторы присваивают значения нескольким разным переменным:

Age = 32;
salary = 25000.75;
distance_to_the_moon = 238857;

Примечание: Значения, присваиваемые переменным, не должны содержать запятые! Если вы включаете запятые, компилятор С++ будет выводить сообщения о синтаксических ошибках.

Присваивание значения при объявлении

При объявлении переменной часто удобно присваивать её начальное значение как показано ниже:

Int age = 32;
float salary = 25000.75;

Использование значения переменной

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

#include

Void main(void)
{
int age = 32;
float salary = 25000.75;
long distance_to_the_moon = 238857;

Cout << "Служащему " << age << " года (лет)" << endl;
cout << "Оклад служащего составляет $" << salary << endl;
cout << "От земли до луны " << distance_to_the_moon
<< " миль" << endl;
}

Примечание: Если вам необходимо перенести строку, постарайтесь не делать этого в середине символьной строки (внутри двойных кавычек), используйте дополнительный отступ для перенесенной части строки, как показано выше.

Превышение диапазона значений переменной

Как вы уже знаете, тип переменной определяет набор значений, которая переменная может хранить. Например, переменная типа int может хранить значения в диапазоне от -32768 до 32767. Если вы присваиваете переменной значение, которое находится вне этого диапазона, возникает ошибка переполнения . Например, следующая программа OVERFLOW.CPP иллюстрирует, как превышение диапазона значений переменной приводит к ошибке:

#include

Void main(void)
{
int positive = 40000;
long big_positive = 4000000000;
char little_positive = 210;

Cout << "Сейчас positive содержит " << positive << endl;
cout << "Сейчас big_positive содержит " << big_positive << endl;
cout << "Сейчас little_positive содержит " << little_positive << endl;
}

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

Использование комментариев для улучшения чтения ваших программ

Прот создании программ включайте комментарии, которые объясняют работу программы. Если другим программистам понадобится изменить вашу программу, они смогут воспользоваться комментариями. В программах на С++ комментарии начинаются с двойного слеша:

// Это комментарий С++

Когда компилятор С++ встречает двойной слеш, он игнорирует весь текст оставшийся в текущей строке, который следует за слешем.

Урок 5. Выполнение простых операций.

Основные математические операции

Независимо от назначения большинство ваших программ на С++ будут складывать, вычитать, умножать или делить. Ниже перечислены основные математические операции:

#include

Void main(void)
{
cout << "5 + 7 = " << 5 + 7 << endl;
cout << "12 - 7 = " << 12 - 7 << endl;
cout << "1.2345 * 2 = " << 1.2345 * 2 << endl;
cout << "15 / 3 = " << 15 / 3 << endl;
}

Обратите внимание, что каждое выражение сначала появляется в кавычках, которые обеспечивают вывод символов (например, 5 + 7 =)на экран. Затем программа выводит результат операции и символ новой строки.

Следующая программа MATHVARS.CPP выполняет арифметические операции, используя переменные:

#include

Void main(void)
{
float cost = 15.50;
float sales_tax = 0.06;
float amount_paid = 20.00;
float tax, change, total;

Tax = cost * sales_tax;
total = cost + tax;
change = amount_paid - total;

Cout << "Стоимость покупки: $" << cost <<
"\tНалог: $" << tax << "\tОбщий счет: $" << total << endl;

Cout << "Сдача покупателю: $" << change << endl;
}

Увеличение значения переменной на 1

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

Count = count + 1;

Следующая программа INTCOUNT.CPP использует оператор присваивания для увеличения переменной count (которая первоначально содержит значение 1000) на единицу (присваивая переменной результат 1001):

#include

Void main(void)
{
int count = 1000;

Cout << "начальное значение count равно" << count << endl;
count = count + 1;
cout << "конечное значение count равно" << count << endl;
}

Увеличение значения переменной представляет собой обычную операцию в программах, поэтому в С++ есть операция увеличения - двойной знак плюс (++). Операция увеличения обеспечивает быстрый способ прибавления единицы к значению пременной. Следующая программа INC_OP.CPP использует операцию увеличения для наращивания значения переменной count на 1:

#include

Void main(void)
{
int count = 1000;

Cout << "начальное значение count равно" << count << endl;
count++;
cout << "конечное значение count равно" << count << endl;
}

Представление о префиксной (до) и постфиксной (после) операциях увеличения.

При использовании операций увеличения ваши программы могут размещать оператор увеличения до или после переменной, как показано ниже:

Variable; variable++;

Так как первый оператор появляется до переменной, он называется префиксным оператором увеличения . Аналогично этому, второй оператор появляется после переменной и называется постфиксным оператором увеличения . Например, рассмотрим следующий оператор присваивания:

Current_count = count++;

Этот оператор присваивания указывает С++ присвоить текущее значение count переменной current_count и увеличивает текущее значение count. В данном случае постфиксный оператор увеличение эквивалентен следующим операторам:

Current_count = cont;
count = count + 1;

Рассотрим префиксный оператор увеличения:

Current_count = ++count;

В этом случае оператор присваивания указывает С++ сначала увеличить значение count, а затем присвоить результат переменной current_count. Использование префиксного оператора эквивалентно следующим оператором:

Count = cont + 1;
current_count = count;

Следующая программа PRE_POST.CPP показывает использование префиксной и постфиксной операций увеличения:

#include

Void main(void)
{
int small_count = 0;
int big_count = 1000;

Cout << "small_count равно " << small_count << endl;
cout << "small_count++ производит " << small_count++ << endl;
cout << "конечное значение small_count равно " << small_count << endl;

Cout << "big_count равно " << big_count << endl;
cout << "++big_count производит " << ++big_count << endl;
cout << "конечное значение big_count равно " << big_count << endl;
}

С переменной small_count программа использует постфиксную операцию увеличения. В результате программа выводит текущее значение переменной (0), а затем увеличивает его на 1. С переменной big_count программа использует префиксную операцию увеличения. В результате программа сначала увеличивает значение переменной (1000 + 1), а затем выводит результат (1001).

С++ обеспечивает также операции уменьшения

В С++ двойной знак минус (--) соответствует оператору уменьшения , который уменьшает значение переменной на 1. Как и в случае с операцией увеличения, С++ поддерживает префиксный и постфиксный операторы уменьшения. Следующая программа DECCOUNT.CPP иллюстрирует использование оператора ументшения С++:

#include

Void main(void)
{
int small_count = 0;
int big_count = 1000;

Cout << "small_count равно " << small_count << endl;
cout << "small_count-- производит " << small_count-- << endl;
cout << "конечное значение small_count равно " << small_count << endl;

Cout << "big_count равно " << big_count << endl;
cout << "--big_count производит " << --big_count << endl;
cout << "конечное значение big_count равно " << big_count << endl;
}

Другие операторы С++

Старшинство операций

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

Операция :: .
->
()
sizeof
sizeof
++
++
--
--
&
*
new
delete

Delete
~
!
+
-
()

.*
->
*
% +
-
Имя Разрешение области видимости
Глобальное разрешение
Выбор элемента
Выбор элемента
Индексация
Вызов функции
Построение значения
Размер объекта
Размер типа
Приращение после
Приращение до
Уменьшение после
Уменьшение до
Адрес объекта
Разыменование
Создание (размещение)
Уничтожение (освобождение)
Уничтожение массива
Дополнение
Логическое НЕ
Унарный плюс
Унарный минус
Приведение
Выбор элемента
Выбор элемента
Умножение
Деление
Взятие по модулю
Сложение (плюс)
Вычитание (минус)
Пример class_name::class_member_name

::variable name

object.member_name
pointer->member_name
pointer
expression(parameters)
type(parameters)
sizeof expression
sizeof(type)
variable++
++variable
variable--
--variable
&variable
*pointer
new type
delete pointer

Delete pointer
~expression
!expression
+1
-1
(type)expression

object.*pointer
object->*pointer
expression*expression
expression/expression
expression%expression
expression+expression
expression-expression

Управление порядком, в котором С++ выполняет операции

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

Cost = price_a + price _b * 1.06;

В этом случае С++ сначала выполнит умножение, а затем прибавит значение price_a.

Если ваши программы должны выполнять арифметические операции в определенном порядке, вы можете заключить выражение в круглые скобки. С++ оценивает выражение и сначала выполняет операции, заключенные в скобки:

Result = (2 + 3) * (3 + 4);


Урок 7. Программа принимает решение.

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

Сравнение двух значений

Когда ваши программы принимают решение, они выполняют определенный вид проверки. Например, одна программа может проверять, равны ли тестовые очки студента 100, в другая программа - составляет ли стоимость покупки больше $50.00. Для выполнения подобных проверок ваши программы будуть использовать операции сравнения С++, перечисленные ниже:

Результат сравнения может быть истиной (TRUE) или ложью (FALSE), т.е. два значения или равны(истина), или нет (ложь).