Запись данных в файл на с#. Работа с файлами в Си-шарп. Классы StreamReader и StreamWriter. Запись в файл

Я признаюсь: «Понятия не имею как записывать в файл структуру, если внутри ее полей находятся указатели». Я могу записывать каждое поле по отдельности, но это не то, чего бы мне хотелось на самом деле. На самом деле мне хотелось бы записывать структуру сразу целиком и такая возможность для структур существует. (Единственная оговорка, что мое: «существует» относится к структурам без указателей. С указателями я не знаю (думается, что для структур с указателями обрабатывать поля нужно только по отдельности).

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

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

Итак, чтобы записать структуру в файл нужно, чтобы была такая структура, которую мы хотим записать. Логично? – логично. Поэтому Начинаем с написания простой структуры

PHP

struct mystruct //Структура MyStruct с тремя полями (i,buf,d) { long i; char buf; double d; }; int main() { mystruct X; //Объявляем структуру X, тип которой mystruct return 0; }

Наверное это достаточно просто и понятно. Создали структуру и переменную типа созданной структуры. Теперь осталась самая важная часть — записать структуру в файл. Чтобы записать структуру в файл, нужно знать размеры структуры.
Снова поговорю об указателях. Если в полях структуры есть указатели, то правильный размер структуры узнать не получится. Размер объекта из указателя вытащить нельзя. Существует возможность узнать размер самого указателя, но не объекта на который он указывает. Это порождает некоторые заметные трудности. Указатель – это все-таки указатель, сложная гадость.
Возвращаемся к записи несложной структуры в файл. Чтобы записать структуру в файл, нужно сообщить компилятору адрес структуры, приведенный к типу указатель на char и размер записываемой структуры. Делается это так

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

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

PHP

#include #include #include struct mystruct { long i; char buf; double d; }; int main() { const char *FName="d:\\txt"; //Путь к файлу. Вписывайте свой. mystruct X; //memset(&ms,0,sizeof ms); //можно проинициализировать элементы структуры нулями так X.i = 10; //записали значение в поле i X.d = 2; //записали значение в поле d strcpy(X.buf,"сайт"); //Записали значение в поле buf // открываем файл для записи ofstream f(FName,ios::binary|ios::out); f.write((char*)&X,sizeof X); //Записали всю структуру целиком f.close(); strcpy(X.buf,"\0"); //я изменяю поле buf струтктуры X X.i=0; //я изменяю поле i структуры X //открываем файл для чтения ifstream in(FName,ios::binary|ios::in); in.read((char*)&X,sizeof X); //Читаем структуру целиком сразу in.close(); cout<

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

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

#include

#include

#include

struct mystruct {

long i ;

char buf [ 255 ] ;

double d ;

} ;

int main ()

const char * FName = "d:\\txt" ; //Путь к файлу. Вписывайте свой.

mystruct X ;

//memset(&ms,0,sizeof ms); //можно проинициализировать элементы структуры нулями так

X . i = 10 ; //записали значение в поле i

X . d = 2 ; //записали значение в поле d

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

in . close () ;

cout << X . buf << "\n" ; //Выводим значение из поля структуры. Оно равно сайт

return 0 ;

Очень хорошо строку с записью в файл я объяснить не смогу. Этот синтаксис проще запомнить, главное, что в первом параметре используется указатель на char из-за чего используется приведение типов к такому указателю, а после запятой идет второй параметр. Вторым параметром сообщается размер, который нужно использовать для записи в файл. Те кто знакомы с приведениями типов должны понимать, что происходит, кто не знаком имеет смысл привыкать. Понимание еще придет.

Чтение из файла

Существует два способа указать путь к файлу.

  • Абсолютный путь, который всегда начинается с корневой папки.
  • Относительный путь, который относится к текущему рабочему каталогу программы.
Существуют также папки с точками и точками. Это не настоящие папки, а специальные имена, которые можно использовать в пути. Один период для имени папки - это сокращение для «этой директории». Два периода означают «родительская папка».

Обработка абсолютных и относительных путей

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

  • (char*)&X -> Неудобная запись. Читать ее нужно справа налево. Адрес структуры X приводится к типу указатель на char. Это необходимо, чтобы сообщить методу write (read) адрес структуры в нужном ему виде. Внимательно прочитайте справа-налево, единственное: &X = адрес структуры X , и имейте ввиду, что такой вид обратного чтения при работе с указателями бывает часто удобен.

Вот такой пример записи структуры в файл и чтения данных из файла в структуру для начинающих. Этот пример относительно прост. Главное понимать, что когда вы открываете файл для обработки, то после обработки обязательно его закрывать. Что при чтении или записи структуры из файла по описанному алгоритму, нужно привести адрес структуры к типу указатель на char и сообщить размер структуры. Следует помнить, что указатели: «Сложная гадость» и использовать их может или ввести в заблуждение или заставить написать больше сложного кода. Также хочу лишний раз обратить внимание на то, что в символьный массив нельзя присвоить строку и чтобы записать в него значение, нужно использовать приемы копирования.

Поиск файлов и содержимого папки

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

статья полностью переписана 07 января 2014г.

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

Большинство компьютерных программ работают с файлами, и поэтому возникает необходимость создавать, удалять, записывать читать, открывать файлы. Что же такое файл? Файл – именованный набор байтов, который может быть сохранен на некотором накопителе. Ну, теперь ясно, что под файлом понимается некоторая последовательность байтов, которая имеет своё, уникальное имя, например файл.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 можно объединить, то есть в одной строке создать объект и связать его с файлом. Делается это так:

Проект: создание случайных файлов викторины

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

Вот что делает программа. Создает 50 вопросов с несколькими вариантами ответов для каждой викторины в случайном порядке. Предоставляет правильный ответ и три случайных неправильных ответа для каждого вопроса в случайном порядке.

  • Записывает викторины в 35 текстовых файлов.
  • Записывает ключи ответа в 35 текстовых файлов.
Это означает, что код должен будет сделать следующее.

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; }

Храните данные опроса в словаре

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

Создайте файл викторины и перетасовывайте запрос

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

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

  1. создать объект класса ifstream и связать его с файлом, из которого будет производиться считывание;
  2. прочитать файл;
  3. закрыть файл.
#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.

Шаг 3: Создайте параметры ответа

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

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

Рисунок 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 .



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

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

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