C++ Форматирование, ввод-вывод файлов и пространства имен

C++Beginner
Практиковаться сейчас

Введение

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

Предварительный просмотр содержания

Используйте манипуляторы ввода-вывода <iomanip> для форматирования ввода и вывода.

Заголовочный файл <fstream> предоставляет ifstream (поток ввода из файла) и ofstream (поток вывода в файл) для ввода-вывода файлов.

  • Форматирование ввода и вывода
  • Ввод-вывод файлов
  • Пространство имен

Форматирование ввода/вывода с использованием манипуляторов ввода-вывода (заголовочный файл )

Заголовочный файл <iomanip> предоставляет так называемые манипуляторы ввода-вывода для форматирования ввода и вывода:

  • setw(int field-widht): устанавливает ширину поля для следующей операции ввода-вывода. setw() не является стабильным и должен быть указан перед каждой операцией ввода-вывода. Ширина поля сбрасывается в значение по умолчанию после каждой операции (с достаточной шириной для вмещения поля).
  • setfill(char fill-char): устанавливает символ заполнения для дополнения до ширины поля.
  • left|right|internal: устанавливает выравнивание
  • fixed/scientific (для чисел с плавающей точкой): использует фиксированную нотацию (например, 12.34) или научную нотацию (например, 1.23e+006).
  • setprecision(int numDecimalDigits) (для чисел с плавающей точкой): задает количество цифр после десятичной точки.
  • boolalpha/noboolalpha (для bool): отображает значения bool в виде алфавитной строки (true/false) или 1/0.
/* Test Formatting Output */
#include <iostream>
#include <iomanip>    // Needed to do formatted I/O
using namespace std;

int main() {
   // Floating point numbers
   double pi = 3.14159265;
   cout << fixed << setprecision(4); // fixed format with 4 decimal places
   cout << pi << endl;
   cout << "|" << setw(8) << pi << "|" << setw(10) << pi << "|" << endl;
      // setw() is not sticky, only apply to the next operation.
   cout << setfill('-');
   cout << "|" << setw(8) << pi << "|" << setw(10) << pi << "|" << endl;
   cout << scientific;  // in scientific format with exponent
   cout << pi << endl;

   // booleans
   bool done = false;
   cout << done << endl;  // print 0 (for false) or 1 (for true)
   cout << boolalpha;     // print true or false
   cout << done << endl;
   return 0;
}

Вывод:

3.1416
|  3.1416|    3.1416|
|--3.1416|----3.1416|
3.1416e+00
0
false
image desc
/* Test Formatting Input */
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;

int main() {
   string areaCode, phoneCode;
   string inStr;

   cout << "Enter your phone number in this format (xxx)xxx-xxxx : ";
   cin.ignore();   // skip '('
   cin >> setw(3) >> areaCode;
   cin.ignore();   // skip ')'
   cin >> setw(3) >> phoneCode;
   cin.ignore();   // skip '-'
   cin >> setw(4) >> inStr;
   phoneCode += inStr;

   cout << "Phone number is (" << areaCode << ")"
        << phoneCode.substr(0, 3) << "-"
        << phoneCode.substr(3, 4) << endl;
   return 0;
}

Вывод:

Enter your phone number in this format (xxx)xxx-xxxx :  254 845 9946
Phone number is (254)845-9946
image desc

Ввод-вывод файлов

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

/* Test File I/O
   Read all the integers from an input file and
   write the average to an output file        */
#include <iostream>
#include <fstream>   // file stream
#include <cstdlib>
using namespace std;

int main() {
   ifstream fin;   // Input stream
   ofstream fout;  // Output stream

   // Try opening the input file
   fin.open("in.txt");
   if (!fin.is_open()) {
      cerr << "error: open input file failed" << endl;
      abort();  // Abnormally terminate the program (in <cstdlib>)
   }

   int sum = 0, number, count = 0;
   while (fin >> number) {
      // Use >> to read
      cout << number << " ";
      sum += number;
      ++count;
   }
   double average = double(sum) / count;
   cout << "Count = " << count << " average = " << average << endl;
   fin.close();

   // Try opening the output file
   fout.open("out.txt");
   if (!fout.is_open()) {
      cerr << "error: open output file failed" << endl;
      abort();
   }
   // Write the average to the output file using <<
   fout << average;
   fout.close();
   return 0;
}

Вывод:

12 15 35 26 68 Count = 5 average = 31.2
image desc

Примечания к программе:

  • Как только файл открыт, можно использовать >> и << для ввода и вывода, аналогично cin >> и cout <<. (Дополнительно: ifstream является подклассом istream, к которому относится cin. ofstream является подклассом ostream, к которому относится cout.)
  • Аналогично, манипуляторы ввода-вывода, такие как fixed, setprecision() и setw(), работают с потоками файлов.

Пространство имен

Когда вы используете разные модули библиотеки, всегда существует потенциальность конфликтов имен, так как разные библиотеки могут использовать одно и то же имя для различных целей. Эта проблема может быть решена с использованием пространства имен в C++. Пространство имен - это коллекция идентификаторов в рамках одного области именования. (В UML и Java это называется пакетом.) Имя сущности в пространстве имен квалифицируется именем пространства имен, за которым следует :: (называется оператором разрешения области), в виде namespace::entityName.

Для размещения сущности в пространстве имен используйте ключевое слово namespace следующим образом:

// create a namespace called myNamespace for the enclosed entities
namespace myNameSpace {
   int foo;               // variable
   int f() { ...... };    // function
   class Bar { ...... };  // compound type such as class and struct
}

// To reference the entities, use
myNameSpace::foo
myNameSpace::f()
myNameSpace::Bar

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

#include <iostream>

namespace a {   // contains variables
   int i1 = 8;
   int i2 = 9;
}

namespace b {   // contains function
   int max(int n1, int n2) {
      return (n1 > n2)? n1 : n2;
   }
}

int main() {
   std::cout << a::i1 << std::endl;                // 8
   std::cout << b::max(a::i1, a::i2) << std::endl; // 9
}

Вывод:

8
9
image desc

Использование пространства имен

// Use the fully qualified names,
// such as std::cout, std::endl, std::setw() and std::string.
std::cout << std::setw(6) << 1234 << std::endl;

// Use a using declaration to declare the particular identifiers.
using std::cout;
using std::endl;
......
cout << std::setw(6) << 1234 << endl;

// Use a using namespace directive.
using namespace std:
......
cout << setw(6) << 1234 << endl;

// For long namespace name, you could define a shorthand (or alias) to the namespace
namespace shorthand = namespace-name;

Резюме

Шаги для ввода-вывода файлов следующие:

  1. Создать ifstream для ввода или ofstream для вывода.
  2. Подключить поток к файлу ввода или вывода с помощью open(filename).
  3. Выполнить форматированный вывод с помощью оператора вставки потока << или ввод с помощью оператора извлечения потока >>, аналогично cout << и cin >>.
  4. Закрыть файл и освободить поток.

В C++ сущность (переменная, функция или класс) принадлежит глобальному пространству имен (идентифицируется :: без имени пространства имен).