Лекция "Потоки ввода вывода в с++ "
Оценка 4.6

Лекция "Потоки ввода вывода в с++ "

Оценка 4.6
Лекции
docx
информатика
Взрослым
15.03.2017
Лекция "Потоки ввода вывода в с++ "
Объект cinуправляет вводом из буфера потока, связанного с объектом stdin, объявленным в . По умолчанию эти два потока синхронизированы. Объект cout управляет буфером потока, связанным с объектом stdout, объявленным в . По умолчанию эти два потока также синхронизированы. Поток clog – это просто буферизованная версия потока cerr. В буферизованной версии потока запись на реальное внешнее устройство делается, только когда буфер полон. Поэтому clog является более эффективным для перенаправления вывода в файл, в то время как cerr используется главным образом для вывода на экран терминала.
тема 2 вопрос 35.docx
тема 2 вопрос 35 потоки ввода вывода в с++ классы потоков операции помещения в поток и извлечения из потока  примеры Главным преимуществом системы ввода­вывода C++ является то, что она может перегружаться для  создаваемых классов. Поток ввода­вывода – это логическое устройство, предназначенное для приема и выдачи информации  пользователю. Поток связан с физическим устройством с помощью системы ввода­вывода C++. Поток  обеспечивает пользователю единый интерфейс при работе с системой ввода­вывода. Это означает, что,  например, для вывода информации на экран монитора и для записи ее в файл используется одна и та же  функция. Когда программа на C++ начинает выполняться, автоматически создаются восемь предопределенных  стандартных потоков. Эти стандартные потоки связаны со стандартными файлами языка C следующим  образом: поток для "узких" символов cin cout cerr clog поток для "широких" символов wcin wcout wclog стандартный файл языка C stdin stdout stderr stderr Объект cinуправляет вводом из буфера потока, связанного с объектом stdin, объявленным в . По умолчанию эти два потока синхронизированы. Объект cout управляет буфером потока, связанным с объектом stdout, объявленным в . По  умолчанию эти два потока также синхронизированы. Поток clog – это просто буферизованная версия потока cerr. В буферизованной версии потока запись на  реальное внешнее устройство делается, только когда буфер полон. Поэтому clog является более  эффективным для перенаправления вывода в файл, в то время как cerr используется главным образом  для вывода на экран терминала. Система ввода­вывода содержит две иерархии классов: первая предназначена для работы с ASCII­ символами, имеющими длину 8 бит; вторая предназначена для работы с UNICODE­символами,  имеющими длину 16 бит. Символы первого набора называются "узкими", а второго – "широкими". В основе иерархии потоковых классов лежит класс basic_ios. Класс basic_ios является базовым для нескольких производных классов, среди которых классы  basic_istream, basic_ostream и basic_iostream. Он содержит наиболее общие функции, необходимые для всех потоков, и обслуживает информацию о состоянии, которая отражает целостность потока и буфер  потока. Классы, производные от basiс_ios, специализируют операции ввода­вывода. В свою очередь,  basic_ios использует класс ios_base, который также является базовым классом для всех потоковых  классов. Он не зависит от типа символов и инкапсулирует информацию, необходимую для всех потоков.  Этот класс определяет несколько типов данных, используемых всеми потоковыми классами, такие как  флаги форматирования, биты состояния, режимы открытия файлов и т.д. С целью обеспечения совместимости с традиционной версией библиотеки ввода­вывода C++ введены  синонимы для имен потоковых классов: Шаблон класса  Синоним  Шаблон класса  Синоним  basic_ios basic_ifstream  ifstream  basic_istream  basic_ofstream  ofstream  basic_оstream  оstream  basic_fstream  basic_streambuf iostream  basic_iostream  streambuf Имена синонимов в точности соответствуют именам потоковых классов в традиционной версии  библиотеки ввода­вывода C++. Далее при изложении потокового ввода­вывода и мы будем пользоваться  этими именами, поскольку как раз эти имена следует указывать в программах. Библиотека ввода­вывода содержит два параллельных семейства классов: одно – производное от  streambuf и второе – производное от ios. Оба эти класса являются низкоуровневыми, выполняющими  различный вид задач. Все потоковые классы имеют, по крайней мере, один из этих классов в качестве  базового. Доступ из ios­производных классов к streambuf­производным осуществляется через указатель. Класс streambuf обеспечивает интерфейс с памятью и физическими устройствами. Функции­члены  семейства классов streambuf используются ios­производными классами. Назначение классов потокового ввода­вывода следующее: istreamпотоковый класс общего назначения для ввода, являющийся базовым классом для других  потоков ввода; ifstreamпотоковый класс для ввода из файла; istream_withassignпотоковый класс ввода для cin; istrstrearmпотоковый класс для ввода строк; оstreamпотоковый класс общего назначения для вывода, являющийся базовым классом для других  потоков вывода; ofstreamпотоковый класс для вывода в файл; ostream_withassignпотоковый класс ввода для cout, cerr, clog; ostrstreamпотоковый класс для вывода строк; iostreamпотоковый класс общего назначения для ввода­вывода, являющийся базовым классом для  других потоков ввода­вывода; fstreamпотоковый класс для ввода­вывода в файл; strstreamпотоковый класс для ввода­вывода строк; stdiostreamкласс для ввода­вывода в стандартные файлы ввода­вывода; streambufабстрактный базовый класс буфера потока; filebufкласс буфера потока для дисковых файлов; strstreambufкласс буфера потока для строк; stdiobufкласс буфера потока для стандартных файлов ввода­вывода. Назначение почти всех классов следует из их названия. Классы группы _withassign являются  производными соответствующих потоковых классов без этого окончания. Они перегружают оператор  присваивания, что позволяет изменять указатель на используемый классом буфер. Если подключен  заголовочный файл , программы, написанные на языке C++, начинают выполняться с  четырьмя открытыми предопределенными потоками, объявленными как объекты классов группы  _withassign следующим образом: istream_withassign cin ;// соответствует stdin ostream_withassign cout ;// соответствует stdout ostream_withassign cerr ;// соответствует stderr ostream_withassign clog ;// буферизованный cerr В Microsoft Visual C++ предопределенные потоки cin, cout, cerr и clog инициализирует спеціально для  этого предназначенный статический класс iostream_init. ПРЕИМУЩЕСТВА БИБЛИОТЕКИ ПОТОКОВ C++ Библиотека потоков C++ предоставляет несколько преимуществ в сравнении с функциями вводавывода  библиотеки времени выполнения. Потоки вывода создаются на базе класса ostream, который обеспечивает методы для записи данных в  буфер потока. Перечислим основные методы класса ostream: operator<< форматированный вывод данных в поток, flush очищает буфер, put выводит символ, seekp устанавливает позицию для функции put, tellp  читает позицию указателя для функции put, write пишет последовательность байтов, От класса ostream  наследуются класс ofstream, который содержит дополнительные методы: open открыть файл, close закрыть файл, is_open проверка открыт ли файл. Сейчас приведем прототипы этих функций и примеры  их использования. 1. Функции open, close и is_open имеют следующие прототипы: void open ( const char *  filename, openmode mode = out | trunc ); void close ( ); bool is_open ( ); При открытии потока вывода нужно указать имя файла и режимы работы потока с этим файлом. При этом нужно запомнить, что режимы  работы с потоками ввода и вывода совпадают. Например, следующая программа добавляет предложение  в конец текстового файла и показывает, как использовать вышеперечисленные функции. 1 2 3 4 5 6 7 8 9  10 11 12 13 14 15 16 #include #include using namespace std; int main () { ofstream out; out.open ("test.txt",  ofstream::out | ofstream::app); if (out.is_open()) out << "This sentence is appended to the file content.\n"; else  cerr << "Open file failed." << endl; out.close(); return 0; } 2. Функцияflush очищает буфер. Эта функция  имеет следующий прототип: ostream& flush ( ); Ниже приведен пример использования функции flush.  Этот пример также показывает, как можно создавать текстовый файл 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  16 17 18 19 #include int main () { ofstream out("test.txt"); for (int n=0; n<100; n++) { out << n << ' ';  out.flush(); } out << '\n'; // переход на новую строку for (n=0; n<100; n++) out << (n+0.1) << ' ' << flush; out  << endl; // переход на новую строку out.close(); return 0; } 3. Функция put выводит символ в файл. Эта  функция имеет следующий прототип: ostream& put ( char ch ); В следующем примере показано, как  водить символы с консоли и выводить их в файл. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include  #include int main () { char ch; ofstream out("test.txt"); cout << "Input chars then input '.' to exit." << endl; do  { ch = cin.get(); out.put(ch); } while (ch!='.'); return 0; } 4. Функция seekp устанавливает, а функция tellp  читает позицию в файле для функции put. Эти функции имеют следующие прототипы: streampos tellp ( );  ostream& seekp ( streampos pos ); где pos ­ новая позиция в потоке; ostream& seekp ( streamoff off,  ios_base::seekdir dir ); где параметры имеют следующее назначение: off смещение в потоке относительно  позиции, указанной в параметре dir. dir направление поиска позиции, может принимать одно из  следующих значений: ios_base::beg – поиск от начала файла; ios_base::cur ­ поиск от текущей позиции;  ios_base::end – поиск от конца файла. Ниже приведен пример использования этих функций. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include int main () { long pos; ofstream out; out.open ("test.txt"); out << "This is a string." << endl; pos=out.tellp(); out.seekp (pos ­ 11); out << "an example."; out.close(); return 0; } 5.  Функция write пишет последовательность символов (байтов) в файл. Эта функция имеет следующий  прототип: ostream& write ( const char* s , size n ); где s указывает на область памяти, из которой данные  записываются в файл, а n – количество записываемых символов (байтов). Отметим, что эта функция  используется для записи данных в бинарные файлы, то есть содержимое области памяти записывается в  файл без изменения. Ниже приведен пример создания бинарного файла, используя функцию write. 1 2 3 4  5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 #include #include struct emp { int code; char name[20]; double salary; }; int main() { ofstream out; // выходной поток struct emp s; // для записей файла // открываем выходной поток в бинарном режиме  out.open("demo.bin", ofstream::binary); if(!out) { cerr << "Open file failed." << endl; return 1; } cout << "Input code, name and salary." << endl; cout << "Press Ctrl+z to exit." << endl; cout << '>'; // вводим первую запись  с консоли cin >> s.code >> s.name >> s.salary; while (!cin.eof()) { // пишем запись в файл out.write((const  char*)&s, sizeof(struct emp)); cout << '>'; // вводим следующие записи с консоли cin >> s.code >> s.name >> s.salary; } // закрываем выходной поток out.close(); return 0; } От класса ostream также наследуются класс ostringstream, который обеспечивает интерфейс для работы со строками. Класс ostringstream содержит  дополнительный метод: str – чтение и запись строки в поток. 6. Функция str выполняет запись и чтение  строки в поток. Эта функция имеет следующий прототип: string str ( ) const чтение строки из потока void  str ( string & s ); запись строки s в поток Например, в следующей программе показано, как ввести строку  в поток типа ostringstream, а затем прочитать его содержимое в объект типа string. 1 2 3 4 5 6 7 8 9 10 11  12 13 14 15 16 17 18 19 20 #include #include #include using namespace std; int main () { ostringstream oss;  string s; oss.str("Sample string_1."); s = oss.str(); cout << s << endl; oss << "Sample string_2."; s = oss.str();  cout << s << endl; return 0; } 1.4. Потоки ввода. Потоки ввода являются объектами класса istream,  который обеспечивает методы для чтения информации из буфера потока. Перечислим основные методы  класса istream: operator >> форматированный ввод, gcount возвращает количество символов,  прочитанных последней операцией ввода, get ввод символа, getline ввод строки, ignore удаление  символов из буфера, peek читает символ, но не удаляет его из буфера, putback возвращает символ в  буфер, read читает блок данных, seekg устанавливает указатель позиции файла для метода get, sync синхронизирует буфер потока с внешним устройством, tellg получает указатель позиции файла для  метода get, unget возвращает символ в поток, От класса istream наследуется класс ifstream, который  обеспечивает интерфейс для работы с файлами. Класс ifstream содержит дополнительные методы: open  открыть файл, close закрыть файл, is_open проверить, открыт ли файл. Как работать с этими функциями, было показано в предыдущем параграфе. Сейчас же подробно рассмотрим работу с функциями класса  istream. 1. Функция gcount возвращает количество символов, прочитанных последней не форматирующей  операцией ввода. Эта функция имеет следующий прототип: streamsize gcount ( ) const; К не  форматирующим операциям ввода относятся следующие операции: get, getline, ignore, read и readsome.  Пример использования функции gcount показан в следующей программе: 1 2 3 4 5 6 7 8 9 10 11 12 13 14  15 16 17 #include #include using namespace std; int main () { char line[80]; int length; cout << "Input a string:  " << endl; cin.getline(line, 80); length = cin.gcount(); cout << "String length = " << length­1 << endl; return  0; } 2. Функция get вводит символ из входного потока. Эта функция имеет следующий прототип: int get(); возвращает символ, извлеченный из потока; istream& get (char& c ); извлекает символ из потока и  сохраняет его в переменной с; istream& get (char* s, streamsize n, char delim = ‘\n’ ); вводит из потока  символы и записывает их в массив s, ввод символов прекращается в следующих случаях: ­ если введен (n­ 1) символ; ­ если в потоке встретился символ разделитель delim, сам символ разделитель из потока не  извлекается; ­ файл закончился раньше, чем прочитан (n­1) символ. После записи прочитанных символов  в массив s функция get записывает в этот массив пустой символ NULL, отмечающий конец строки. Ниже  приведена программа, которая распечатывает содержимое текстового файла. 1 2 3 4 5 6 7 8 9 10 11 12 13  14 15 16 17 #include #include using namespace std; int main () { ifstream in; in.open ("test.txt", ifstream::in);  while (in.good()) cout << (char) in.get(); cout << endl; in.close(); return 0; } А теперь приведена программа,  которая читает символы из входного потока, используя функцию get. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  16 17 18 19 20 21 22 23 24 25 26 #include int main () { char c; char a[3]; cout << "Input a char: "; c = cin.get(); cout << c << endl; cin.get(); // удаляем символ конца строки cout << "Input a char: "; cin.get(c); cout << c << endl; cin.get(); // удаляем символ конца строки cout << "Input a string: "; cin.get(a, 3); cout << endl << "The  first two symbols: "; cout << a << endl << endl; return 0; } 3. Функция getline вводит строки из файла. Эта  функция имеет следующий прототип: istream& getline (char* s, streamsize n, char delim = ‘\n’); вводит из  потока символы и записывает их в массив s, ввод символов прекращается в следующих случаях: ­ если  введен (n­1) символ; ­ если в потоке встретился символ разделитель delim, причем сам символ  разделитель извлекается из потока, но не записывается в массив s; ­ файл закончился раньше, чем  прочитан (n­1) символ. После записи прочитанных символов в массив s функция getline записывает в этот массив пустой символ NULL, отмечающий конец строки. Ниже приведена программа, которая вводит  строки из потока и распечатывает их на консоли. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include int  main () { char line[80]; cout << "Input strings. " << endl; cout << "To exit press CTRL+Z." << endl; cout <<  '>'; while (!cin.eof()) { cin.getline(line, 80); cout << ' ' << line << endl; cout << '>'; } return 0; } 4. Функция  ignore удаляет символы из буфера потока. Эта функция имеет следующий прототип: istream& ignore  ( streamsize n = 1, int delim = EOF ); где n – количество символов, которые необходимо удалить из  потока, а delim – это символ ограничитель. Функция удаляет символы из потока до тех пор, пока не  удалит n символов или не встретит символ разделитель. Например, в следующей программе выводятся  только первые символы введенных слов. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23  #include using namespace std; int main () { char c; cout << "Input a word: "; c = cin.get(); cin.ignore(256,'\n');  cout << "The first letter is: " << c << endl; cout << "Input another word: "; cin.ignore(); c = cin.get();  cin.ignore(256,'\n'); cout << "The second letter is: " << c << endl; return 0; } 5. Функция peek читает символ,  но не удаляет его из буфера. Эта функция имеет следующий прототип: int peek ( ); возвращает  прочитанный символ, а если файл закончился или в потоке произошла ошибка, то возвращает EOF. Ниже  приведена программа, в которой используется функция peek. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18  19 20 21 22 23 24 #include using namespace std; int main () { char c; int n; char s[256]; cout << "Enter a  number or a word: "; c = cin.peek(); if ( (c >= '0') && (c <= '9') ) { cin >> n; cout << "It is a number: " << n <<  endl; } else { cin >> s; cout << "It is a word: " << s << endl; } return 0; } 6. Функция putback возвращает  символ в буфер. Эта функция имеет следующий прототип: istream& putback (char ch ); если введенный  символ совпадает с символом ch, то функция возвращает его в буфер ввода, иначе поведение функции  непредсказуемо. Использование функции putback показано в следующей программе. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #include using namespace std; int main () { char c; int n; char  s[256]; cout << "Enter a number or a word: "; c = cin.get(); cin.putback (c); if ( (c >= '0') && (c <= '9') ) { cin  >> n; cout << "It is a number: " << n << endl; } else { cin >> s; cout << " It is a word: " << s << endl; } return  0; } 7. Функция read читает блок данных из файла и имеет следующий прототип: istream& read (char* s,  streamsize n ); где s указывает на область памяти, в которую данные читаются из файла, а n – количество  читаемых символов (байтов). Отметим, что эта функция используется для чтения данных из бинарных  файлов, то есть содержимое файла без изменения читается в область памяти. Ниже приведен пример  чтения записей бинарного файла, используя функцию read. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19  20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 // чтение бинарного файла #include #include struct emp { int code; char name[20]; double salary; };  int main() { ifstream in; // выходной поток struct emp s; // для записей файла unsigned i; // номер записи //  открываем входной поток в бинарном режиме in.open("demo.bin"); if(!in) { cout << "Open file failed.\n";  return 1; } cout << "Press Ctrl+z to exit.\n"; // читаем индекс cout << "Input an index: "; cin >> i; while (! cin.eof()) { // устанавливает указатель на нужную запись in.seekg(i*sizeof(struct emp)); // читаем запись из  файла in.read((char*)&s, sizeof(struct emp)); if (!in.good()) { cout << "The wrong index.\n"; cout << "Input an index: "; cin >> i; in.clear(); // очищаем ошибку continue; } // выводим запись на консоль cout << "\tcode = "  << s.code << " name = " << s.name << " sal = " << s.salary << endl, // читаем индекс cout << "Input an index:  "; cin >> i; } // закрываем входной поток in.close(); return 0; } 8. Функция seekg устанавливает указатель  позиции файла для метода get, а функция tellg получает указатель позиции файла для метода get. Эти  функции имеют следующие прототипы: istream& seekg ( streampos pos ); устанавливает позицию файла на значение pos, тип streampos эквивалентен типу long. istream& seekg ( streamoff off, ios_base::seekdir dir );  сдвигает позицию файла на значение off относительно значения параметра dir, который может принимать  следующие значения: ios_base::beg смещение относительно начала файла; ios_base::cur смещение  относительно текущей позиции; ios_base::end смещение относительно конца файла. streampos tellg ( );  возвращает указатель позиции файла для функции get, тип streampos эквивалентен типу long. Ниже  приведена программа, которая демонстрирует использование вышеуказанных функций. 1 2 3 4 5 6 7 8 9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 //  чтение файла в память #include #include struct emp { int code; char name[20]; double salary; }; int main ()  { int length; emp* buffer; ifstream in; in.open("demo.bin", ios::binary); if (!in) { cout << "Open file failed" <<  endl; return 1; } // определеям длину файла in.seekg(0, ios::end); length = in.tellg(); in.seekg(0, ios::beg); //  распределяем память под файл buffer = (emp*) new char[length]; // читаем файл  in.read((char*)buffer,length); in.close(); // выводим содержимое на консоль for (int i=0; i<<=""  buffer[i].code="" '="" buffer[i].name="" buffer[i].salary="" endl;="" return="" 0;="" }="" 9.="" Функция=""  sync="" синхронизирует="" буфер="" потока="" с="" внешним="" устройством.="" Эта="" функция=""  имеет="" следующий="" прототип:="" int="" (="" );="" Как="" работает="" эта="" функция,="" и=""  что="" такое="" синхронизация="" буфера="" устройством="" смотри="" в="" параграфе="" 1.6.=""  10.="" unget="" возвращает="" поток="" символ,="" предварительно="" извлеченный="" из="" потока.=""  unget();="" Ниже="" приведена="" программа,="" которой="" показано="" использование="" функции=""  unget.="" 1="" 2="" 3="" 4="" 5="" 6="" 7="" 8="" 9="" 10="" 11="" 12="" 13="" 14="" 15="" 16="" 17=""  18="" 19="" 20="" 21="" 22="" 23="" 24="" 25="" 26="" #include="" using namespace std; int main () { char  c; int n; char s[256]; cout << "Enter a number or a word: "; c = cin.get(); cin.unget(); if ( (c >= '0') && (c <= '9') ) { cin >> n; cout << "It is a number: " << n << endl; } else { cin >> s; cout << "It is a word: " << s << endl; }  return 0; } От класса istream наследуется класс istringstream, который обеспечивает интерфейс для  работы со строками. Класс istringstream содержит дополнительный метод: str чтение или запись строки в  поток. 11. Функция str для записи и чтения строки в поток. Прототипы этой функции были рассмотрены  в предыдущем параграфе пункт 6. Сейчас же приведем только программу, в которой показано, как  записать строку в поток типа istringstream, а затем вывести содержимое этого потока. 1 2 3 4 5 6 7 8 9 10  11 12 13 14 15 16 17 18 19 20 #include #include #include using namespace std; int main () { int n;  istringstream iss; string s = "0 1 2"; iss.str(s); for (int i = 0; i < 3; ++i) { iss >> n; cout << n + 1 << endl; }  return 0; } 1.5. Потоки ввода­вывода. Потоки ввода­вывода создаются на базе класса iostream, который  является производным классом от классов istream и ostream и поэтому наследует все их методы. Для  работы с файлами и со строками из класса iostream наследуются соответственно классы fstream и stringstream, которые позволяют, как писать данные в потоки, так и читать данные из потоков. Для  наглядного представления отношения наследования между этими классами смотри диаграмму  наследования в параграфе 1.1. Здесь же заметим, что заголовочный файл содержит потоки ввода­вывода: cin, cout, cerr и clog, примеры работы с которыми смотри в параграфе 1.8. Источник: http://www.itmathrepetitor.ru/s­lekciya­9­rabota­s­potokami­v­s/

Лекция "Потоки ввода вывода в с++ "

Лекция "Потоки ввода вывода в с++ "

Лекция "Потоки ввода вывода в с++ "

Лекция "Потоки ввода вывода в с++ "

Лекция "Потоки ввода вывода в с++ "

Лекция "Потоки ввода вывода в с++ "

Лекция "Потоки ввода вывода в с++ "

Лекция "Потоки ввода вывода в с++ "

Лекция "Потоки ввода вывода в с++ "

Лекция "Потоки ввода вывода в с++ "

Лекция "Потоки ввода вывода в с++ "

Лекция "Потоки ввода вывода в с++ "
Материалы на данной страницы взяты из открытых истончиков либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.
15.03.2017