Cc++ — Текстовые файлы в Си


Содержание

C/c++ — Текстовые файлы в Си

БлогNot. Лекции по C/C++: работа с файлами (stdio.h)

Лекции по C/C++: работа с файлами (stdio.h)

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

Базовые функции для работы с файлами описаны в библиотеке stdio.h . Вся работа с файлом выполняется через файловую переменную — указатель на структуру типа FILE , определённую в стандартной библиотеке:

Открыть файл можно функцией fopen , имеющей 2 параметра:

Параметр имя_файла может содержать относительный или абсолютный путь к открываемому файлу:

1) «data.txt» — открывается файл data.txt из текущей папки

Важно: при запуске exe-файла «текущая папка» – та, где он находится; при отладке в IDE папка может быть иной, например, в Visual Studio при открытом консольном решении с именем Console файл следует разместить в папке Console/Console , а при запуске исполняемого файла не из IDE – в папке Console/Debug .

2) «f:\\my.dat» — открывается файл my.dat из головной папки диска f:

3) имя файла запрашивается у пользователя:

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

1) «rt» — открываем для чтения текстовый файл;

2) «r+b» — открываем для произвольного доступа (чтение и запись) бинарный файл;

3) «at» – открываем текстовый файл для добавления данных в конец файла;

4) «w» — открываем файл для записи без указания того, текстовый он или бинарный.

Фактически, указание «r» или «t» не накладывает каких-либо ограничений на методы, которые мы будем применять для чтения или записи данных.

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

1) стандартный обработчик ferror (см. пособиe, п.8.7);

2) сравнить указатель, который вернула fopen , с константой NULL ( nullptr ) из стандартной библиотеки:

Пример. Приложение проверяет, удалось ли открыть файл из текущей папки, имя файла запрашивается у пользователя (Visual Studio)

Важно! Функции, возвращающие указатель, в том числе, fopen , считаются небезопасными в ряде новых компиляторов, например, Visual Studio 2015. Если их использование приводит не просто к предупреждению, а к генерации ошибок, есть 2 основных способа решения проблемы:

1) в соответствии с рекомендациями компилятора, заменить старые названия функций на их безопасные версии, например, strcpy на strcpy_s и fopen на fopen_s . При этом может измениться и способ вызова функций, например,

2) в начало файла (до всех #include ) включить директиву

Если используется предкомпиляция, то можно определить этот макрос в заголовочном файле stdafx.h .


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

Если файл форматированный, то есть, является текстовым и состоит из лексем, разделённых стандартными разделителями (пробел, табуляция, перевод строки), обмен данными с ним можно выполнять методами:

  • fscanf — для чтения
  • fprintf — для записи

Первым параметром этих функций указывается файловая переменная, в остальном работа совпадает со стандартными scanf и printf .

Пример. Файл text.txt в текущей папке приложения имеет следующий вид:

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

1. Функции семейства scanf возвращают целое число — количество значений, которые успешно прочитаны в соответствии с указанным форматом. В реальных приложениях эту величину следует проверять в коде:

2. На «восприятие» программой данных может влиять установленная в приложении локаль. Например, если до показанного кода выполнен оператор результат работы кода может измениться (для русской локали разделителем целой и дробной части числа является запятая, а не точка).

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

4. Код показывает, как читать из файла заранее неизвестное количество значений – это позволяет сделать стандартная функция feof (проверка, достигнут ли конец файла; вернёт не 0, если прочитано всё).

5. Распространённый в примерах из Сети код вида

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

В качестве примера форматной записи в файл сохраним массив a из 10 целочисленных значений в файле с именем result.txt по 5 элементов в строке:

Важно! Ввод/вывод функциями библиотеки stdio.h буферизован, то есть, данные «пропускаются» через область памяти заданного размера, обмен данными происходит не отдельными байтами, а «порциями». Поэтому перед чтением данных желательно очищать буфер от возможных «остатков» предыдущего чтения методом fflush , а после записи данных следует обязательно закрывать файл методом fclose , иначе данные могут быть потеряны. Заметим, что консольный ввод/вывод «обычными» методами scanf и printf также буферизован.

Теперь рассмотрим текстовый файл, состоящий из неструктурированных строк (абзацев) текста, разделённых символами перевода строки. При работе с такими данными могут потребоваться следующие функции:

  • fgetc и fputc — для посимвольного чтения и посимвольной записи данных;
  • fgets и fputs — для чтения и записи строк с указанным максимальным размером.

Как и в случае с функциями для чтения форматированных данных, у всех этих методов имеются аналоги для работы со стандартным вводом/выводом.

Пример. Читая файл, определить длину каждой строки в символах. Для решения задачи воспользуемся тем фактом, что строки завершаются символом «перевод строки» ( ‘\n’ ). Предполагается, что файл уже открыт для чтения.

Важно! Из-за особенностей реализации fgetc , без последней проверки за телом цикла код мог «не обратить внимания», например, на последнюю строку файла, состоящую только из пробелов и не завершающуюся переводом строки.

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

Важно! Без дополнительной обработки прочитанные из файла строки при выводе будут содержать лишние пустые строки между строками данных. Это происходит потому, что функция fgets читает строку файла вместе с символом перевода строки (точней, под Windows — с парой символов \r\n , интерпретируемых как один), а puts добавляет к выводимой строке ещё один перевод строки.

Если максимальная длина строки принципиально не ограничена, помочь может либо предварительное посимвольное чтение файла для её определения, либо работа с файлом как с бинарными данными. Бинарный файл отличается от текстового тем, что необязательно состоит из печатаемых символов со стандартными разделителями между ними. Соответственно, для него не имеет смысла понятие «строки данных», а основной способ работы с ним – чтение и запись наборов байт указанного размера. Основные функции для чтения и записи бинарных данных – fread и fwrite соответственно. В базовой реализации они имеют по 4 параметра:

  • void *buffer — нетипизированный указатель на место хранения данных;
  • size_t (unsigned) size — размер элемента данных в байтах.
  • size_t count — максимальное количество элементов, которые требуется прочитать (записать);
  • FILE *stream — указатель на структуру FILE

Пример. Целочисленный массив a запишем в двоичный файл.

Цукерберг рекомендует:  Навигация с эффектом скольжения при смене категорий

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


Подход к чтению данных с помощью fread аналогичен. Например, если файл уже открыт для чтения в режиме «rb»:

Для файлов, открытых в режиме «r+b», разрешены и чтение, и запись (произвольный доступ). Поэтому при работе с такими файлами нужны функции позиционирования файлового указателя:

  • функции fgetpos и ftell позволяют выполнить чтение текущей позиции указателя в файле;
  • функции fseek и fsetpos позволяют осуществить переход к нужной позиции в файле.

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

Материал для чтения из пособия: пп. 8.6-8.11. Обратите внимание на таблицы с описанными прототипами функций ввода/вывода.

Рекомендуемые задачи: базовое задание включает две задачи, первая из которых предполагает обработку файла как текстовых данных, вторая – как бинарных. В качестве дополнительной третьей задачи может быть предложена реализация одной из задач 1, 2, содержащая консольный интерфейс и меню.

Про conio.h и почему его не надо использовать:

Для ввода/вывода через цветную консоль во многих источниках используются методы библиотеки conio.h . Следует учитывать, что её реализации в компиляторах от Borland и Microsoft значительно отличаются, а в компиляторах под Unix/Linux реализации conio.h могут отсутствовать.

Как вариант, в компиляторах Visual Studio можно использовать аналоги conio.h от сторонних разработчиков, например, открытый проект coniow.h. Законченный пример кода, реализующего несложное консольное меню для Visual Studio, есть вот здесь. Предполагается, что к проекту подключены заголовочный файл coniow.h и файл исходного кода coniow.c .

05.11.2015, 09:20; рейтинг: 28855

SBP-Program

Работа с файлами в Си

Текстовые файлы

Рассмотрим работу с текстовым файлом в Си на примере. Создайте на диске С текстовый файл с именем TextFile.txt. Наберите в этом файле такие строки:

А это код программы на C, которая открывает наш файл и считывает из него строки:

Чтоб открыть текстовый файл в C используем функцию fopen:

первый аргумент функции fopen указывает на файл, а второй говорит, что файл открыт для чтения из него.

Строки считываем с помощью функции fgets:

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

После завершения работы с файлом, его надо закрыть:

Русские буквы в строках тоже проходят.

Кстати, эту программу я сделал в Eclipse. Как работать с C/C++ в Eclipse можно посмотреть здесь.

Итак, мы открыли и считали данные из текстового файла.

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

Создаем текстовый файл для записи в него данных:


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

C-строка cString, и число nVal записываются программой в текстовый файл. cNewLine — это просто переход на новую строку.

Записываем данные в текстовый файл с помощью функции fprintf:

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

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

Добавим к «а» плюс, в этом случае, если файл не существует, то он будет создан:

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

Открыть существующий (содержимое его стирается) или создать новый файл для чтения и записи:

Считывание всей информации из текстового файла

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

Выводит только первую строку. Но как всё-таки считать весь файл?

2 ответа 2

То же самое, но циклом — построчно. На весь файл может просто не хватить памяти :), хотя это тоже возможно — считать сразу все. Но лучше — построчно.

Словами — «пока можно прочесть очередную строку, читаем«

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

Функции работы с файлами и операции ввода-вывода (C++/CLI) File Handling and I/O (C++/CLI)

Демонстрирует различные операции с файлами с помощью .NET Framework. Demonstrates various file operations using the .NET Framework.

В следующих разделах описывается использование классов, определенных в System.IO пространство имен для выполнения различных операций с файлами. The following topics demonstrate the use of classes defined in the System.IO namespace to perform various file operations.

Перечисление файлов в каталоге Enumerate Files in a Directory

В следующем примере кода показано, как получить список файлов в каталоге. The following code example demonstrates how to retrieve a list of the files in a directory. Кроме того подкаталоги пронумеровываются. Additionally, the subdirectories are enumerated. В следующем примере кода используется GetFiles GetFiles и GetDirectories методов, чтобы отобразить содержимое каталога C:\Windows. The following code example uses the GetFilesGetFiles and GetDirectories methods to display the contents of the C:\Windows directory.

Пример Example

Монитор изменений в файловой системе Monitor File System Changes

В следующем примере кода используется FileSystemWatcher для регистрации событий, соответствующие файлы, созданные, измененные, удаленные или переименован. The following code example uses FileSystemWatcher to register for events corresponding to files being created, changed, deleted, or renamed. Вместо периодического опроса поиск изменений в файлах в каталоге, вы можете использовать FileSystemWatcher класс, который создает события при обнаружении изменения. Instead of periodically polling a directory for changes to files, you can use the FileSystemWatcher class to fire events when a change is detected.

Пример Example


Прочитать двоичный файл Read a Binary File

В следующем примере кода демонстрируется чтение двоичных данных из файла, используя два класса из System.IO пространство имен: FileStream и BinaryReader. The following code example shows how to read binary data from a file, by using two classes from the System.IO namespace: FileStream and BinaryReader. FileStream представляет фактический файл. FileStream represents the actual file. BinaryReader предоставляет интерфейс для потока, который разрешает двоичный доступ. BinaryReader provides an interface to the stream that allows binary access.

В примере кода считывает файл с именем data.bin и содержит целые числа в двоичном формате. The code example reads a file that’s named data.bin and contains integers in binary format. Сведения об этом файле см. в разделе как: Запись в двоичный файл (C++выполняет). For information about this kind of file, see How to: Write a Binary File (C++/CLI).

Пример Example

Чтение из текстового файла Read a Text File

В следующем примере кода показано, как открыть и прочитать текст файла по одной строке за раз, с помощью StreamReader класс, который определен в System.IO пространства имен. The following code example demonstrates how to open and read a text file one line at a time, by using the StreamReader class that’s defined in the System.IO namespace. Экземпляр этого класса используется для открытия текстового файла и затем StreamReader.ReadLine метод используется для считывания каждой строки. An instance of this class is used to open a text file and then the StreamReader.ReadLine method is used to retrieve each line.

Данный пример кода считывает файл с именем textfile.txt и содержит текст. This code example reads a file that’s named textfile.txt and contains text. Сведения об этом файле см. в разделе как: Запись в текстовый файл (C++выполняет). For information about this kind of file, see How to: Write a Text File (C++/CLI).

Пример Example

Получение сведений о файле Retrieve File Information

В следующем примере кода показано FileInfo класса. The following code example demonstrates the FileInfo class. Если имя файла, этот класс можно использовать для получения сведений о файле, такие как размер файла, каталога, полное имя и Дата и время создания и последнего изменения. When you have the name of a file, you can use this class to retrieve information about the file such as the file size, directory, full name, and date and time of creation and of the last modification.

Цукерберг рекомендует:  Таймер обратного отсчета

Этот код извлекает информацию о файлах для Notepad.exe. This code retrieves file information for Notepad.exe.

Пример Example

Запись в двоичный файл Write a Binary File

В следующем примере кода демонстрируется запись двоичных данных в файл. The following code example demonstrates writing binary data to a file. Два класса из System.IO используются пространства имен: FileStream и BinaryWriter. Two classes from the System.IO namespace are used: FileStream and BinaryWriter. FileStream представляет фактический файл, хотя BinaryWriter предоставляет интерфейс для потока, который разрешает двоичный доступ. FileStream represents the actual file, while BinaryWriter provides an interface to the stream that allows binary access.

В следующем примере кода записывает файл, содержащий целые числа в двоичном формате. The following code example writes a file containing integers in binary format. Этот файл может быть считан с код в как: Прочитать двоичный файл (C++выполняет). This file can be read with the code in How to: Read a Binary File (C++/CLI).

Пример Example

Запись в текстовый файл Write a Text File

В следующем примере кода показано, как для создания текстового файла и запись в него с помощью текста StreamWriter класс, который определен в System.IO пространства имен. The following code example demonstrates how to create a text file and write text to it using the StreamWriter class, which is defined in the System.IO namespace. StreamWriter Конструктор принимает имя создаваемого файла. The StreamWriter constructor takes the name of the file to be created. Если файл существует, он перезаписывается (Если передается значение false как второй StringWriter аргумент конструктора). If the file exists, it is overwritten (unless you pass True as the second StringWriter constructor argument).

Файл реализуется с помощью Write и WriteLine функции. The file is then filed using the Write and WriteLine functions.

Запись в текстовый файл с помощью функции fputs

Чтобы записать строку или несколько строк в файл, нам понадобится функция стандартной библиотеки C++ — fputs() .

Чтобы записать информацию в файл, нам нужно сначала его открыть — в этом нам поможет функция fopen() . Эта функция стандартной библиотеки C++ открывает файлы в различных режимах.

  • r — открывает текстовый файл только для чтения.
  • w — открывает текстовый файл только для записи
  • a — открывает текстовый файл с возможностью дозаписи

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


обращаю Ваше внимание на очень важный момент — при написании пути к файлу в Windows используется символ бэкслеша ( \ ), если мы хотим записать бекслеш в строку, нам нужно использовать два бэкслеша ( \\ ), иначе компилятор воспримет одинарный слеш, как специальный символ.

Далее мы закрываем наш файл с помощью функции fclose();.

Считать значения из input.txt и записать в output.txt на C++

На олимпиадах по программированию для ввода данных в программу используют, как правило, файл с названием input.txt(содержит входные данные), а для вывода используется output.txt(содержит все выходные данные). В данной статье мы разберем, как нам брать данные из файла input.txt и записывать в output.txt.

Из input.txt в output.txt

Может показаться, что это неудобно, и проще всего организовать ввод данных через консоль, попросив об этом пользователя примерно таким сообщением «Введите значение N:». Однако, использование файлов input.txt и output.txt позволяет автоматизировать проверку ответа участника олимпиады, что в разы ускоряет подведение итогов.

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

Мы уже говорили, как считывать данные из файла и записывать данные в файл посредством функций стандартной библиотеки языка программирования C++. Давайте же применим наши знания в решении данной задачи.

Ввод данных из файла и вывод в файл

Открытие и закрытие файлов

До этого при вводе-выводе данных мы работали со стандартными потоками — клавиатурой и монитором. Теперь рассмотрим, как в языке C реализовано получение данных из файлов и запись их туда. Перед тем как выполнять эти операции, надо открыть файл и получить доступ к нему.

В языке программирования C указатель на файл имеет тип FILE и его объявление выглядит так:
FILE *myfile;

С другой стороны, функция fopen() открывает файл по указанному в качестве первого аргумента адресу в режиме чтения («r»), записи («w») или добавления («a») и возвращает в программу указатель на него. Поэтому процесс открытия файла и подключения его к программе выглядит примерно так:
myfile = fopen («hello.txt», «r»);

При чтении или записи данных в файл обращение к нему осуществляется посредством файлового указателя (в данном случае, myfile).

Если в силу тех или иных причин (нет файла по указанному адресу, запрещен доступ к нему) функция fopen() не может открыть файл, то она возвращает NULL. В реальных программах почти всегда обрабатывают ошибку открытия файла в ветке if , мы же далее опустим это.

Объявление функции fopen() содержится в заголовочном файле stdio.h, поэтому требуется его подключение. Также в stdio.h объявлен тип-структура FILE.

После того, как работа с файлом закончена, принято его закрывать, чтобы освободить буфер от данных и по другим причинам. Это особенно важно, если после работы с файлом программа продолжает выполняться. Разрыв связи между внешним файлом и указателем на него из программы выполняется с помощью функции fclose() . В качестве параметра ей передается указатель на файл:
fclose(myfile);

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

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

fscanf()

Функция fscanf() аналогична по смыслу функции scanf() , но в отличии от нее осуществляет форматированный ввод из файла, а не стандартного потока ввода. Функция fscanf() принимает параметры: файловый указатель, строку формата, адреса областей памяти для записи данных:
fscanf (myfile, «%s%d», str, &a);

Возвращает количество удачно считанных данных или EOF. Пробелы, символы перехода на новую строку учитываются как разделители данных.

Допустим, у нас есть файл содержащий такое описание объектов:

Тогда, чтобы считать эти данные, мы можем написать такую программу:

В данном случае объявляется структура и массив структур. Каждая строка из файла соответствует одному элементу массива; элемент массива представляет собой структуру, содержащую строковое и два числовых поля. За одну итерацию цикл считывает одну строку. Когда встречается конец файла fscanf() возвращает значение EOF и цикл завершается.


fgets()

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

Например:
fgets (str, 50, myfile)

Такой вызов функции прочитает из файла, связанного с указателем myfile, одну строку текста полностью, если ее длина меньше 50 символов с учетом символа ‘\n’, который функция также сохранит в массиве. Последним (50-ым) элементом массива str будет символ ‘\0’, добавленный fgets() . Если строка окажется длиннее, то функция прочитает 49 символов и в конце запишет ‘\0’. В таком случае ‘\n’ в считанной строке содержаться не будет.

В этой программе в отличие от предыдущей данные считываются строка за строкой в массив arr. Когда считывается следующая строка, предыдущая теряется. Функция fgets() возвращает NULL в случае, если не может прочитать следующую строку.

getc() или fgetc()

Функция getc() или fgetc() (работает и то и другое) позволяет получить из файла очередной один символ.

Приведенный в качестве примера код выводит данные из файла на экран.

Запись в текстовый файл

Также как и ввод, вывод в файл может быть различным.

  • Форматированный вывод. Функция fprintf ( файловый_указатель, строка_формата, переменные ) .
  • Посточный вывод. Функция fputs ( строка, файловый_указатель ) .
  • Посимвольный вывод. Функция fputc() или putc( символ, файловый_указатель ) .

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

Цукерберг рекомендует:  Java - Помогите дополнить код циклом с постусловием

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

Построчный вывод в файл ( fputs() , в отличие от puts() сама не помещает в конце строки ‘\n’):

Пример посимвольного вывода:

Чтение из двоичного файла и запись в него

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

При открытии файла для двоичного доступа, вторым параметром функции fopen() является строка «rb» или «wb».

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

Функции fread() и fwrite() принимают в качестве параметров:

  1. адрес области памяти, куда данные записываются или откуда считываются,
  2. размер одного данного какого-либо типа,
  3. количество считываемых данных указанного размера,
  4. файловый указатель.

Эти функции возвращают количество успешно прочитанных или записанных данных. Т.е. можно «заказать» считывание 50 элементов данных, а получить только 10. Ошибки при этом не возникнет.


Пример использования функций fread() и fwrite() :

Здесь осуществляется попытка чтения из первого файла 50-ти символов. В n сохраняется количество реально считанных символов. Значение n может быть равно 50 или меньше. Данные помещаются в строку. То же самое происходит со вторым файлом. Далее первая строка присоединяется ко второй, и данные сбрасываются в третий файл.

BestProg

Примеры использования средств C++ для работы с файлами

В теме приводятся примеры использования файловой системы C++ для:

  • чтения информации из файлов;
  • записи информации в файлы.

Содержание

1. Функция, читающая строки из клавиатуры и записывающая их в файл

После вызова функции Example1() будет создан файл «myfile.txt» , в котором будут записаны строки, введенные с клавиатуры.

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

2. Функция, которая читает текстовый файл и выводит его содержимое на экран

Функция Example2() читает содержимое файла filename , имя которого есть входящим параметром функции.

Результат работи программы отображает содержимое файла «myfile.txt» , созданного в п.1 этой темы

3. Пример бесформатного ввода/вывода. Копирование одного файла в другой

В примере реализована функция Example3() , которая выполняет копирование файлов в двоичном (бинарном) формате. Функция получает два параметра. Первый параметр типа const char* есть имя файла-источника. Второй параметр типа const char* есть имя файла-назначения.
Функция реализует посимвольное копирование. Для получения символа из файла-источника используется функция get() .

Вызов функции Example3() из функции main() может быть следующим:

После выполнения функции Example3() будет создан файл «myfile2.txt» , который будет копией файла «myfile.txt» .

4. Пример бесформатного ввода/вывода. Копирование одного файла в другой. Функция put()

Функция Example4() из данного примера работает также как и предыдущая, только вместо вывода в поток используется функция put() . Также, с помощью функции is_open() выполняется проверка на корректность открытия файла.

5. Пример функции записывающей структурную переменную в файл

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

Реализована функция Example5() , которая выполняет запись структурной переменной типа BOOK в файл, имя которого есть входящим параметром. Функция Example5() использует функцию write() для записи. Файл открывается в двоичном формате ( ios::binary ).

6. Пример чтения структурной переменной из файла

Данный пример есть продолжением предыдущего примера из пункта 5. В примере в функции Example6() заполняется значение структурной переменной типа BOOK . Полученное значение формируется как входящий параметр-ссылка на тип BOOK . Также функция получает параметром имя файла для чтения. Для чтения структурной переменной используется функция read() .


Результат работы программы

7. Пример чтения/записи массива структур в файл. Функции write() , read()

В примере используются функции write() , read() для работы со структурой типа BOOK , а именно:

  • записи массива типа BOOK в файл, который состоит из трех структурных переменных;
  • чтения массива структур типа BOOK из файла.

Результат работы программы

8. Пример записи/чтения массива чисел типа double
  • запись в файл массива M чисел типа double функцией write() ;
  • чтение из файла массива чисел типу double функцией read() .

Файл открывается в двоичном формате.

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

9. Пример чтения из файла строк. Функция getline()

В функции Example9() реализуется построчное чтение из файла с помощью функции getline() . Имя файла задается входящим параметром filename . Строки в файле состоят из набора слов, разделенных символом «пробел».

10. Пример чтения строк из файла. Функции getline() + eof()

В примере реализована функция Example10() , которая выполняет чтение строк из файла. Файл открывается в текстовом формате. Имя файла задается входящим параметром функции. Определение конца файла выполняется с помощью функции eof() .

C/c++ — Текстовые файлы в Си

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

сорри, потом только увидел, что ты пошёл намного дальше) очень интересно будет почитать тебя)

Автор сайта отвечает :
Aleksey ad, спасибо за проявленное внимание)) Честно говоря я не верю, что сам сильно далеко смогу уйти. Я пока стараюсь избегать указателей, т.к. для начинающих они немного запутывают смыслОдно дело веселится, другое дело не давать лишнего. Любой помощи был бы рад, т.к. один в поле не воин, как ни крути icq 586-115-460 email daslex@yandex.ru

http://juniordeveloperad.blogspot.com/2012/04/junior-c-deloper-hi.html Вот, смотри. Я не знаю твоей мотивации и откуда ты берёшь свои азы…К примеру, по ссылке выложены задания по первой части предмета объектно-ориентированное программирование одного ииз Вузов. Могу скинуть на мыло книжку, по которой учаться студенты (её, конечно, не хватает). Про указатели скажу одно — надо разбираться. Для меня они остаются не до конца разобранными, но пользуюсь. Начал их разбирать с си. Там намного больше они участвуют в жизнедеятельности прилаги, там вообще больше ориентированно на работу с памятью. А потом перешёл на с++ и здесь опять же указатели. Многие говорят, что в с# они будут не нужны…Но я всё равно стараюсь разобраться и использовать их по максимуму �� всё приходит с опытом.Кстати, в java нету указателей) Да и работа с памятью облегчена)По поводу контактов — не против, но icq не пользую. скайп скину на почту.

Автор сайта отвечает :
как С не С++, так и С++ не C#. java тоже – это java. К теме изучения C++ это не относится. Скорее это плюсы и минусы языков, поводы для дискуссий на форумах. по поводу книжки. может кому-то это тоже интересно и лучше дать автора и название книги сюда, чем лично мне

И еще по поводу вашей ссылки я постараюсь не спорить с вами ни тут ни там, просто скажу что думаю «Начинать надо с потяжелее» – лично я считаю совершенно по другомуСтрауструп писал, что чем больше вы знаете С, тем сложнее будет перейти на С++, используя преимущества C++ (не дословно). Вы держитесь противоположной идеологии и это полностью ваше право.

Чтение и запись в текстовые файлы

Для того, чтобы писать в текстовые файлы или читать из них, достаточно воспользоваться опера­торами > для открытого потока. Например, следующая программа записывает целое чис­ло, число с плавающей запятой и строку в файл TEST:

#include
#include
int main()
<
ofstream out(«test»);
if (!out) <
cout
#include
int main()
<
char ch;
int i;
float f;
char str[80];
ifstream in(«test»);
if (!in) <
cout > i;
in >> f;
in >> ch;
in >> str;
cout > для чтения текстовых файлов надо иметь в виду, что проис­ходит определенное преобразование символов. Например, символы-разделители опускаются. Если нужно предотвратить какое-либо преобразование символов, то необходимо использовать функ­ции двоичного ввода/вывода С++, которые рассматриваются в следующем разделе.

Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих