Visual studio ввод вывод c

Обновлено: 07.07.2024

Работа файлового ввода/вывода в языке C++ почти аналогична работе обычных потоков ввода/вывода (но с небольшими нюансами).

Классы файлового ввода/вывода

Есть три основных класса файлового ввода/вывода в языке C++:

ofstream (является дочерним классу ostream);

fstream (является дочерним классу iostream ).

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

В отличие от потоков cout, cin, cerr и clog, которые сразу же можно использовать, файловые потоки должны быть явно установлены программистом. То есть, чтобы открыть файл для чтения и/или записи, нужно создать объект соответствующего класса файлового ввода/вывода, указав имя файла в качестве параметра. Затем, с помощью оператора вставки ( << ) или оператора извлечения ( >> ), можно записывать данные в файл или считывать содержимое файла. После проделывания данных действий нужно закрыть файл — явно вызвать метод close() или просто позволить файловой переменной ввода/вывода выйти из области видимости (деструктор файлового класса ввода/вывода закроет этот файл автоматически вместо нас).

Файловый вывод

Для записи в файл используется класс ofstream . Например:

// Класс ofstream используется для записи данных в файл. // Если мы не можем открыть этот файл для записи данных, cerr << "Uh oh, SomeText.txt could not be opened for writing!" << endl ; // Когда outf выйдет из области видимости, то деструктор класса ofstream автоматически закроет наш файл

Обратите внимание, мы также можем использовать метод put() для записи одного символа в файл.

Файловый ввод

Теперь мы попытаемся прочитать содержимое файла, который создали в предыдущем примере. Обратите внимание, ifstream возвратит 0 , если мы достигли конца файла (это удобно для определения «длины» содержимого файла). Например:

// ifstream используется для чтения содержимого файла. // Если мы не можем открыть этот файл для чтения его содержимого, cerr << "Uh oh, SomeText.txt could not be opened for reading!" << endl ; // то перемещаем эти данные в строку, которую затем выводим на экран // Когда inf выйдет из области видимости, то деструктор класса ifstream автоматически закроет наш файл

Результат выполнения программы:

Хм, это не совсем то, что мы хотели. Как мы уже узнали на предыдущих уроках, оператор извлечения работает с «отформатированными данными», т.е. он игнорирует все пробелы, символы табуляции и символ новой строки. Чтобы прочитать всё содержимое как есть, без его разбивки на части (как в примере, приведенном выше), нам нужно использовать метод getline():

// ifstream используется для чтения содержимого файлов. // Мы попытаемся прочитать содержимое файла SomeText.txt // Если мы не можем открыть файл для чтения его содержимого, cerr << "Uh oh, SomeText.txt could not be opened for reading!" << endl ; // то перемещаем то, что можем прочитать, в строку, а затем выводим эту строку на экран // Когда inf выйдет из области видимости, то деструктор класса ifstream автоматически закроет наш файл

Результат выполнения программы:

Буферизованный вывод

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

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

Также буфер можно очистить вручную, используя метод ostream::flush() или отправив std::flush в выходной поток. Любой из этих способов может быть полезен для обеспечения немедленной записи содержимого буфера на диск в случае сбоя программы.

Интересный нюанс: Поскольку std::endl; также очищает выходной поток, то его чрезмерное использование (приводящее к ненужным очисткам буфера) может повлиять на производительность программы (так как очистка буфера в некоторых случаях может быть затратной операцией). По этой причине программисты, которые заботятся о производительности своего кода, часто используют \n вместо std::endl для вставки символа новой строки в выходной поток, дабы избежать ненужной очистки буфера.

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

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

app — открывает файл в режиме добавления;

ate — переходит в конец файла перед чтением/записью;

binary — открывает файл в бинарном режиме (вместо текстового режима);

in — открывает файл в режиме чтения (по умолчанию для ifstream );

out — открывает файл в режиме записи (по умолчанию для ofstream );

trunc — удаляет файл, если он уже существует.

Можно указать сразу несколько флагов путем использования побитового ИЛИ (|).

ifstream по умолчанию работает в режиме ios::in;

ofstream по умолчанию работает в режиме ios::out;

fstream по умолчанию работает в режиме ios::in ИЛИ ios::out, что означает, что вы можете выполнять как чтение содержимого файла, так и запись данных в файл.

Оригинальная версия продукта: Visual C++
Исходный номер КБ: 307398

Аннотация

  • System::ComponentModel
  • System::Windows::Forms
  • System::Drawing

Демонстрация операций I/O файла

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

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

В следующем примере код StreamReader использует класс для чтения текстового файла. Содержимое файла добавляется в управление ListBox. Блок try. catch используется для оповещения программы, если файл пуст. Существует множество способов определить, когда достигается конец файла; этот пример использует Peek метод для изучения следующей строки перед чтением.

В Visual C++необходимо добавить параметр компилятора поддержки во время работы общего языка (/clr:oldSyntax), чтобы успешно компилировать предыдущий пример кода как управляемый C++. Чтобы добавить общий параметр компиляторов поддержки во время работы, выполните следующие действия:

Щелкните Project и нажмите кнопку <ProjectName> Свойства.

<ProjectName> является местообнамерщиком имени проекта.

Расширь свойства конфигурации и нажмите кнопку General.

В правой области щелкните, чтобы выбрать службу поддержки общего языкового времени, старый синтаксис (/clr:oldSyntax) в параметрах проекта поддержки общего языкового времени.

Чтобы выполнить поиск абонентской группы для пользователя в поле Абонентская группа (телефонный контекст), нажмите кнопку Обзор.

Написание текстового файла

Этот пример кода использует StreamWriter класс для создания и записи в файл. Если у вас есть существующий файл, вы можете открыть его таким же образом.

Просмотр сведений о файлах

Этот пример кода использует FileInfo класс для доступа к свойствам файла. Notepad.exe используется в этом примере. Свойства отображаются в диспетчере ListBox.

Диски списка

В этом примере кода используются классы и классы для списка Directory Drive логических дисков в системе. В этом примере результаты отображаются в диспетчере ListBox.

Папки list sub

Этот пример кода GetDirectories использует метод класса для получения списка Directory папок.

Файлы списка

Этот пример кода использует GetFiles метод класса для получения списка Directory файлов.

Многие вещи могут пойти не так, когда пользователь получает доступ к файлам. Файлы могут не существовать, файлы могут быть в использовании или пользователи могут не иметь прав на файлы папок, к которые они пытаются получить доступ. Рассмотрите эти возможности при написании кода для обработки исключений, которые могут быть созданы.

Пример пошаговая

В меню Файл выберите пункт Создать и затем пункт Проект.

Введите KB307398 в поле Имя, введите поле C:\ Расположение и нажмите кнопку ОК.

Откройте форму Form1 в представлении Design и нажмите кнопку F4, чтобы открыть окно Свойства.

В окне Свойства разложите папку Размер. В поле Ширина введите 700. В поле Высота введите 320.

Добавьте в Form1 один элемент управления ListBox и шесть элементов управления Кнопкой.

Чтобы просмотреть ящик инструментов, щелкните Панели инструментов в меню Просмотр.

В окне Свойства измените расположение , имя , размер , TabIndex, и текстовые свойства этих элементов управления следующим образом:

Откройте файл Form1.h. В Form1 объявлении класса объявите одну частную переменную String со следующим кодом:

В Form1 конструкторе класса добавьте следующий код:

Чтобы сделать операции вывода ввода файлов, добавьте пространство System::IO имен.

Нажмите КНОПКУ SHIFT+F7, чтобы открыть Form1 в представлении Design. Дважды щелкните кнопку "Прочитайте текстовый файл", а затем вклейте следующий код:

В представлении Design Form1 дважды щелкните кнопку Write Text File и впишите следующий код:

В представлении Design Form1 дважды щелкните кнопку Сведения о файле представления и вклеите следующий код в методе:

В представлении Design Form1 дважды щелкните кнопку List Drives и вклеите следующий код:

В представлении Design Form1 дважды щелкните кнопку Подмостки списка и вклеите следующий код:

В представлении Design Form1 дважды щелкните кнопку "Файлы списков", а затем вклеите следующий код:

Чтобы создать и запустить программу, нажмите кнопку CTRL+F5.

Полный пример кода

Ссылки

Для вывода информации на консоль мы уже использовали встроенный метод Console.WriteLine . То есть, если мы хотим вывести некоторую информацию на консоль, то нам надо передать ее в метод Console.WriteLine:

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

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

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

Есть другой способ вывода на консоль сразу нескольких значений:

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

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

будет заменена на

Console.Write

Кроме Console.WriteLine() можно также использовать метод Console.Write() , он работает точно так же за тем исключением, что не добавляет переход на следующую строку, то есть последующий консольный вывод будет выводиться на той же строке.

Консольный ввод

Кроме вывода информации на консоль мы можем получать информацию с консоли. Для этого предназначен метод Console.ReadLine() . Он позволяет получить введенную строку.

В данном случае все, что вводит пользователь, с помощью метода Console.ReadLine() передается в переменную name.

Пример работы программы:

Особенностью метода Console.ReadLine() является то, что он может считать информацию с консоли только в виде строки. Кроме того, возможная ситуация, когда для метода Console.ReadLine не окажется доступных для считывания строк, то есть когда ему нечего считывать, он возвращаает значение null , то есть, грубо говоря, фактически отсутствие значения. И чтобы отразить эту ситуацию мы определяем переменную name , в которую получаем ввод с консоли, как переменную типа string? . Здесь string указывает, что переменная может хранить значения типа string, то есть строки. А знак вопроса ? указывает, что переменная также может хранить значение null , то есть по сути не иметь никакого значения. Далее мы более подробно разберем null и как с ним работать.

Convert.ToInt32() (преобразует к типу int)

Convert.ToDouble() (преобразует к типу double)

Convert.ToDecimal() (преобразует к типу decimal)

Пример ввода значений:

При вводе важно учитывать текущую операционную систему. В одних культурах разделителем между целой и дробной частью является точка (США, Великобритания. ), в других - запятая (Россия, Германия. ). Например, если текущая ОС - русскоязычная, значит, надо вводить дробные числа с разделителем запятой. Если локализация англоязычная, значит, разделителем целой и дробной части при вводе будет точка.

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

В С для этих целей используется библиотека stdio.h .
В С++ разработана новая библиотека ввода-вывода iostream , использующая концепцию объектно-ориентированного программирования:

Библиотека iostream определяет три стандартных потока:

Для их использования в Microsoft Visual Studio необходимо прописать строку:

Для выполнения операций ввода-вывода переопределены две операции поразрядного сдвига:

  • >> получить из входного потока
  • << поместить в выходной поток

Вывод информации

cout << значение;

Здесь значение преобразуется в последовательность символов и выводится в выходной поток:

Возможно многократное назначение потоков:
cout << 'значение1' << 'значение2' << . << 'значение n';

int n;
char j;
cin >> n >> j;
cout << "Значение n равно" << n << "j=" << j;

Ввод информации

cin >> идентификатор;

При этом из входного потока читается последовательность символов до пробела, затем эта последовательность преобразуется к типу идентификатора, и получаемое значение помещается в идентификатор:

Возможно многократное назначение потоков:
cin >> переменная1 >> переменная2 >>. >> переменнаяn;

При наборе данных на клавиатуре значения для такого оператора должны быть разделены символами (пробел, \n, \t ).

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

Для ввода текста до символа перевода строки используется манипулятор потока getline() :

Манипуляторы потока

Функцию - манипулятор потока можно включать в операции помещения в поток и извлечения из потока (<<, >>).

В С++ имеется ряд манипуляторов. Рассмотрим основные:

Пример Программа ввода-вывода значения переменной в C++

Та же программа, написанная на языке Си

Пример Использование форматированного вывода

Еще один пример использования форматированного вывода: для t∈[0;3] с шагом 0,5 вычислить значение y=cos(t).

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

Исходный код примеров из этой статьи можете скачать из нашего github-репозитория.

Консольный ввод\вывод

Класс Console. Вывод данных в консоль

Класс Console содержит методы для работы с консольным вводом\выводом, управлением потоком с ошибками и окном консоли. Начнем с вывода информации в консоль, для решения этой задачи класс Console предоставляет два метода: Write и WriteLine.

Для знакомства с методами класса Console создайте в удобном для вас каталоге проект с именем CSharpLesson3:

Метод Write

Откройте файл Program.cs в созданном ранее проекте и добавьте в метод Main следующие строки, демонстрирующие работу с методом Write:

Более подробно про форматирование будет написано в уроке, посвященном работе со строками.

Сохраните документ, откройте консоль, перейдите в каталог с проектом и выполните команду:

Результат работы программы будет выглядеть примерно следующим образом:

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

Метод WriteLine

Метод WriteLine записывает указанные данные в выходной поток и добавляет символ перевода строки. Добавьте в программу следующие строки:

Теперь надпись “Текущая дата:” и дата со временем будут выведены в разных строках.
WriteLine (также как Write) может принимать не только строковые значения, но и переменные разных типов:

Удобным и наглядным способом вывода значений переменных в консоль с дополнительным текстовым пояснением является использование строковой интерполяции:

Запустите проект и в консоли увидите результат выполнения программы:

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

Класс Console. Чтение данных из консоли

В классе Console, помимо рассмотренных выше методов вывода в консоль, присутствуют методы для считывания вводимых данных из консоли.

Метод Read

Если после надписи “Нажмите любую клавишу, а затем Enter” будет введено более одного символа, то Read вернет только первый.

Для представления кода в виде символа необходимо переменную key1 привести к типу Char, для этого можно воспользоваться методом Convert.ToChar().

Метод ReadLine

Метод ReadLine возвращает введенную строку символов до нажатия клавиши “Enter”. Добавим несколько строк в файл с исходным кодом, для демонстрации работы с методом ReadLine :

Если необходимо получить с консоли численные данные, то следует воспользоваться методами из класса Convert для приведения типа String к соответствующему числовому типу:

Метод ReadKey

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

Исходный код примеров из этой статьи можете скачать из нашего github-репозитория.

Читайте также: