Переписать строку в файле с
Теги: Текстовые файлы, fopen, fclose, feof, setbuf, setvbuf, fflush, fgetc, fprintf, fscanf, fgets, буферизированный поток, небуферизированный поток.
Методы
Добавляет строки в файл, затем закрывает файл. Если указанный файл не существует, этот метод создает файл, записывает в него указанные строки и затем закрывает файл.
Добавляет строки в файл, используя заданную кодировку, затем закрывает файл. Если указанный файл не существует, этот метод создает файл, записывает в него указанные строки и затем закрывает файл.
Асинхронно добавляет строки в файл, затем закрывает файл. Если указанный файл не существует, этот метод создает файл, записывает в него указанные строки и затем закрывает файл.
Асинхронно добавляет строки в файл, используя заданную кодировку, затем закрывает файл. Если указанный файл не существует, этот метод создает файл, записывает в него указанные строки и затем закрывает файл.
Открывает файл, добавляет в него указанную строку и затем закрывает файл. Если файл не существует, этот метод создает файл, записывает в него указанную строку и затем закрывает файл.
Добавляет указанную строку в файл в указанной кодировке, создавая файл, если он не существует.
Асинхронно открывает или создает файл, если он еще не существует, добавляет указанную строку в файл, а затем закрывает файл.
Асинхронно открывает или создает файл, если он еще не существует, добавляет указанную строку в файл в указанной кодировке, а затем закрывает файл.
Создает объект StreamWriter, добавляющий текст с кодировкой UTF-8 в существующий файл, или в новый файл, если указанный файл не существует.
Копирует существующий файл в новый файл. Перезапись файла с тем же именем не разрешена.
Копирует существующий файл в новый файл. Перезапись файла с тем же именем разрешена.
Создает или перезаписывает файл в указанном пути.
Создает или перезаписывает файл по заданному пути с указанием размер буфера.
Создает или перезаписывает файл по заданному пути с указанием размера буфера и параметров, которые описывают, как создавать или перезаписывать файл.
Создает или перезаписывает файл по заданному пути с указанием размера буфера и параметров, которые описывают, как создавать или перезаписывать файл. Также указывается значение, определяющее контроль доступа и безопасность аудита для файла.
Создает символьную ссылку файла, определяемую этим указателем path pathToTarget .
Создается или открывается файл для записи текста в кодировке UTF-8. Если файл уже существует, его содержимое перезаписывается.
Расшифровывает файл, зашифрованный текущей учетной записью с помощью метода Encrypt(String).
Удаляет указанный файл.
Шифрует файл таким образом, чтобы его можно было расшифровать только с помощью учетной записи, которая использовалась для шифрования.
Определяет, существует ли заданный файл.
Получает объект FileSecurity, который инкапсулирует записи списка ACL для заданного файла.
Получает объект FileSecurity, инкапсулирующий записи списка ACL определенного типа для конкретного файла.
Получает значение FileAttributes для файла в пути.
Возвращает дату и время создания заданного файла или каталога.
Возвращает дату и время создания заданного файла или каталога в формате общего скоординированного времени (UTC).
Возвращает время и дату последнего обращения к указанному файлу или каталогу.
Возвращает дату и время последнего доступа к заданному файлу или каталогу в формате всемирного координированного времени (UTC).
Возвращает время и дату последней операции записи в указанный файл или каталог.
Возвращает дату и время последней операции записи в заданный файл или каталог в формате всемирного координированного времени (UTC).
Перемещает заданный файл в новое местоположение и разрешает переименование файла.
Перемещает указанный файл в новое расположение, предоставляя параметры для указания нового имени файла и перезаписи конечного файла, если он уже существует.
Открывает объект FileStream по указанному пути с доступом для чтения и записи без совместного доступа.
Открывает FileStream в заданном пути с заданным режимом и доступом без совместного доступа.
Открывает FileStream в заданном пути, с заданным режимом доступа для чтения, записи или чтения и записи и с заданным параметром совместного использования.
Инициализирует новый экземпляр FileStream класса с указанным путем, режимом создания, разрешением на чтение и запись и общий доступ, доступ к другим fileStreams может иметь тот же файл, размер буфера, дополнительные параметры файла и размер выделения.
Инициализирует новый экземпляр SafeFileHandle класса с указанным путем, режимом создания, разрешением на чтение и запись и общий доступ, доступ к другому Файлу SafeFileHandles может иметь тот же файл, дополнительные параметры файла и размер выделения.
Открывает для чтения существующий файл.
Открывает для чтения существующий файл, содержащий текст в кодировке UTF-8.
Открывает существующий файл или создает новый файл для записи.
Открывает двоичный файл, считывает содержимое файла в массив байтов и затем закрывает файл.
Асинхронно открывает двоичный файл, считывает содержимое файла в массив байтов и затем закрывает файл.
Открывает текстовый файл, считывает все строки файла и затем закрывает файл.
Открывает файл, считывает все строки файла с заданной кодировкой и затем закрывает файл.
Асинхронно открывает текстовый файл, считывает все строки файла и затем закрывает файл.
Асинхронно открывает текстовый файл, считывает все строки файла с заданной кодировкой и затем закрывает файл.
Открывает текстовый файл, считывает весь текст файла и затем закрывает файл.
Открывает файл, считывает весь текст файла с заданной кодировкой и затем закрывает файл.
Асинхронно открывает текстовый файл, считывает весь текст файла и затем закрывает файл.
Асинхронно открывает текстовый файл, считывает весь текст из файла с заданной кодировкой и затем закрывает файл.
Считывает строки файла.
Считывает строки файла с заданной кодировкой.
Заменяет содержимое заданного файла на содержимое другого файла, удаляя исходный файл и создавая резервную копию замененного файла.
Заменяет содержимое заданного файла на содержимое другого файла, удаляя исходный файл и создавая резервную копию замененного файла, и при необходимости игнорирует ошибки слияния.
Возвращает целевой объект указанной ссылки на файл.
Применяет записи списка управления доступом (ACL), описанные объектом FileSecurity, к заданному файлу.
Устанавливает заданные атрибуты FileAttributes файла по заданному пути.
Устанавливает дату и время создания файла.
Устанавливает дату и время создания файла, представленные в формате общего скоординированного времени (UTC).
Устанавливаются дата и время последнего доступа к заданному файлу.
Устанавливает дату и время последнего доступа к заданному файлу в формате всемирного координированного времени (UTC).
Устанавливаются дата и время последней операции записи в заданный файл.
Устанавливает дату и время последней операции записи в заданный файл в формате всемирного координированного времени (UTC).
Создает новый файл, записывает в него указанный массив байтов и затем закрывает файл. Если целевой файл уже существует, он будет переопределен.
Асинхронно создает новый файл, записывает в него указанный массив байтов и затем закрывает файл. Если целевой файл уже существует, он будет переопределен.
Создает новый файл, записывает в него коллекцию строк, затем закрывает файл.
Создает новый файл, используя указанную кодировку, записывает коллекцию строк в этот файл, затем закрывает файл.
Создает новый файл, записывает в него указанный массив строк и затем закрывает файл.
Создает новый файл, записывает указанный массив строк в этот файл, используя заданную кодировку, затем закрывает файл.
Асинхронно создает новый файл, записывает в него указанные строки и затем закрывает файл.
Асинхронно создает новый файл, записывает указанные строки в этот файл, используя заданную кодировку, затем закрывает файл.
Создает новый файл, записывает в него указанную строку и затем закрывает файл. Если целевой файл уже существует, он будет переопределен.
Создает новый файл, записывает указанную строку в этот файл, используя заданную кодировку, и затем закрывает файл. Если целевой файл уже существует, он будет переопределен.
Асинхронно создает новый файл, записывает в него указанную строку и затем закрывает файл. Если целевой файл уже существует, он будет переопределен.
Асинхронно создает новый файл, записывает указанную строку в этот файл, используя заданную кодировку, и затем закрывает файл. Если целевой файл уже существует, он будет переопределен.
Оригинальная версия продукта: Visual Studio
Оригинальный номер базы знаний: 816149
Полный код сборки для чтения текстового файла
Файловая структура FAT32
Устройства внешней памяти в системе FAT32 имеют не байтовую, а блочную адресацию. Запись информации в устройство внешней памяти осуществляется блоками или секторами.
Сектор – минимальная адресуемая единица хранения информации на внешних запоминающих устройствах. Как правило, размер сектора фиксирован и составляет 512 байт. Для увеличения адресного пространства устройств внешней памяти сектора объединяют в группы, называемые кластерами.
Кластер – объединение нескольких секторов, которое может рассматриваться как самостоятельная единица, обладающая определёнными свойствами. Основным свойством кластера является его размер, измеряемый в количестве секторов или количестве байт.
Файловая система FAT32 имеет следующую структуру.
Нумерация кластеров, используемых для записи файлов, ведется с 2. Как правило, кластер №2 используется корневым каталогом, а начиная с кластера №3 хранится массив данных. Сектора, используемые для хранения информации, представленной выше корневого каталога, в кластеры не объединяются.
Минимальный размер файла, занимаемый на диске, соответствует 1 кластеру.
Загрузочный сектор начинается следующей информацией:
- EB 58 90 – безусловный переход и сигнатура;
- 4D 53 44 4F 53 35 2E 30 MSDOS5.0;
- 00 02 – количество байт в секторе (обычно 512);
- 1 байт – количество секторов в кластере;
- 2 байта – количество резервных секторов.
Кроме того, загрузочный сектор содержит следующую важную информацию:
- 0x10 (1 байт) – количество таблиц FAT (обычно 2);
- 0x20 (4 байта) – количество секторов на диске;
- 0x2С (4 байта) – номер кластера корневого каталога;
- 0x47 (11 байт) – метка тома;
- 0x1FE (2 байта) – сигнатура загрузочного сектора ( 55 AA ).
Сектор информации файловой системы содержит:
- 0x00 (4 байта) – сигнатура ( 52 52 61 41 );
- 0x1E4 (4 байта) – сигнатура ( 72 72 41 61 );
- 0x1E8 (4 байта) – количество свободных кластеров, -1 если не известно;
- 0x1EС (4 байта) – номер последнего записанного кластера;
- 0x1FE (2 байта) – сигнатура ( 55 AA ).
Таблица FAT содержит информацию о состоянии каждого кластера на диске. Младшие 2 байт таблицы FAT хранят F8 FF FF 0F FF FF FF FF (что соответствует состоянию кластеров 0 и 1, физически отсутствующих). Далее состояние каждого кластера содержит номер кластера, в котором продолжается текущий файл или следующую информацию:
- 00 00 00 00 – кластер свободен;
- FF FF FF 0F – конец текущего файла.
Корневой каталог содержит набор 32-битных записей информации о каждом файле, содержащих следующую информацию:
- 8 байт – имя файла;
- 3 байта – расширение файла;
Корневой каталог содержит набор 32-битных записей информации о каждом файле, содержащих следующую информацию:
- 8 байт – имя файла;
- 3 байта – расширение файла;
- 1 байт – атрибут файла:
- 1 байт – зарезервирован;
- 1 байт – время создания (миллисекунды) (число от 0 до 199);
- 2 байта – время создания (с точностью до 2с):
- 2 байта – дата создания:
- 2 байта – дата последнего доступа;
- 2 байта – старшие 2 байта начального кластера;
- 2 байта – время последней модификации;
- 2 байта – дата последней модификации;
- 2 байта – младшие 2 байта начального кластера;
- 4 байта – размер файла (в байтах).
В случае работы с длинными именами файлов (включая русские имена) кодировка имени файла производится в системе кодировки UTF-16. При этого для кодирования каждого символа отводится 2 байта. При этом имя файла записывается в виде следующей структуры:
- 1 байт последовательности;
- 10 байт содержат младшие 5 символов имени файла;
- 1 байт атрибут;
- 1 байт резервный;
- 1 байт – контрольная сумма имени DOS;
- 12 байт содержат младшие 3 символа имени файла;
- 2 байта – номер первого кластера;
- остальные символы длинного имени.
Далее следует запись, включающая имя файла в формате 8.3 в обычном формате.
Сводка
В разделе Чтение текстового файла этой статьи описывается, как использовать класс StreamReader для чтения текстового файла. В разделах Запись в текстовый файл (пример 1) и Запись в текстовый файл (пример 2) описывается, как использовать класс StreamWriter для записи текста в файл.
Комментарии
Методы Replace заменяют содержимое указанного файла содержимым другого файла. Они также создают резервную копию файла, который был заменен.
Replace(String, String, String)
Заменяет содержимое заданного файла на содержимое другого файла, удаляя исходный файл и создавая резервную копию замененного файла.
Параметры
Имя файла, который заменяет файл, указанный destinationFileName .
Имя заменяемого файла.
Имя файла резервной копии.
Исключения
Путь, описываемый параметром destinationFileName , имел недопустимую форму.
-или- Путь, описываемый параметром destinationBackupFileName , имел недопустимую форму.
Параметр destinationFileName имеет значение null .
Указан недопустимый диск.
Не удалось найти файл, описанный текущим объектом FileInfo.
-или- Файл, описываемый параметром destinationBackupFileName , не найден.
При открытии файла произошла ошибка ввода-вывода.
-или- Параметры sourceFileName и destinationFileName указывают один и тот же файл.
Указанный путь, имя файла или оба значения превышают максимальную длину, заданную в системе.
Параметр sourceFileName или destinationFileName указывает файл, доступный только для чтения.
-или- Эта операция не поддерживается на текущей платформе.
-или- Исходные или конечные параметры определяют каталог вместо файла.
-или- У вызывающего объекта отсутствует необходимое разрешение.
sourceFileName и destinationFileName укажите тот же существующий каталог.
Комментарии
Метод Replace заменяет содержимое указанного файла содержимым другого файла. Он также создает резервную копию файла, который был заменен.
Если и sourceFileName destinationFileName находятся на разных томах, этот метод вызовет исключение. Если файл destinationBackupFileName находится в другом томе исходного файла, файл резервной копии будет удален.
Передайте null параметру destinationBackupFileName , если вы не хотите создавать резервную копию заменяемого файла.
destinationBackupFileName Если он уже существует, он будет перезаписан с содержимым destinationFileName файла.
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет статические методы для создания, копирования, удаления, перемещения и открытия одного файла, а также помогает при создании объектов FileStream.
Примеры
В следующем примере показано, как использовать File класс для проверки наличия файла и в зависимости от результата, создайте новый файл и запишите его, либо откройте существующий файл и считывает его из него. Перед выполнением кода создайте папку c:\temp .
Работа с файлами в языке Си
Для программиста открытый файл представляется как последовательность считываемых или записываемых данных. При открытии файла с ним связывается поток ввода-вывода . Выводимая информация записывается в поток, вводимая информация считывается из потока.
Когда поток открывается для ввода-вывода, он связывается со стандартной структурой типа FILE , которая определена в stdio.h . Структура FILE содержит необходимую информацию о файле.
Открытие файла осуществляется с помощью функции fopen() , которая возвращает указатель на структуру типа FILE , который можно использовать для последующих операций с файлом.
name – имя открываемого файла (включая путь),
type — указатель на строку символов, определяющих способ доступа к файлу:
- "r" — открыть файл для чтения (файл должен существовать);
- "w" — открыть пустой файл для записи; если файл существует, то его содержимое теряется;
- "a" — открыть файл для записи в конец (для добавления); файл создается, если он не существует;
- "r+" — открыть файл для чтения и записи (файл должен существовать);
- "w+" — открыть пустой файл для чтения и записи; если файл существует, то его содержимое теряется;
- "a+" — открыть файл для чтения и дополнения, если файл не существует, то он создаётся.
Возвращаемое значение — указатель на открытый поток. Если обнаружена ошибка, то возвращается значение NULL .
Функция fclose() закрывает поток или потоки, связанные с открытыми при помощи функции fopen() файлами. Закрываемый поток определяется аргументом функции fclose() .
Возвращаемое значение: значение 0, если поток успешно закрыт; константа EOF , если произошла ошибка.
Чтение символа из файла:
Аргументом функции является указатель на поток типа FILE . Функция возвращает код считанного символа. Если достигнут конец файла или возникла ошибка, возвращается константа EOF .
Запись символа в файл:
Аргументами функции являются символ и указатель на поток типа FILE . Функция возвращает код считанного символа.
Функции fscanf() и fprintf() аналогичны функциям scanf() и printf() , но работают с файлами данных, и имеют первый аргумент — указатель на файл.
Функции fgets() и fputs() предназначены для ввода-вывода строк, они являются аналогами функций gets() и puts() для работы с файлами.
Символы читаются из потока до тех пор, пока не будет прочитан символ новой строки ‘\n’ , который включается в строку, или пока не наступит конец потока EOF или не будет прочитано максимальное количество символов. Результат помещается в указатель на строку и заканчивается нуль- символом ‘\0’ . Функция возвращает адрес строки.
Копирует строку в поток с текущей позиции. Завершающий нуль- символ не копируется.
Пример Ввести число и сохранить его в файле s1.txt. Считать число из файла s1.txt, увеличить его на 3 и сохранить в файле s2.txt.
Результат выполнения — 2 файла
Работа с файлами в C++ описана здесь.
Добрый день. Подскажите пожалуйста, возможно ли в С++ читать содержимое только файлов имеющих в своём имени только цифры? Например читать: 56.txt, 78.txt,99.txt и т.д. И не читать hellou.txt. Если да какие библиотеки и функции нужно использовать? В интернете по обработке имен файлов мало инфы.
Возможно сделать проверку имени файла на соответствие формату. Но само имя файла задаётся пользователем.
Здравствуйте, я сделал посимвольный вывод текстового файла. Как можно реализовать запрет переноса слов в консоли?
Считать количество выведенных символов в строке и длину следующего слова. Если количество символов +длина слова больше 80, то нужно перенести строчку и начать вывод с новой строки. При этом пост вольный вывод не получится - придется использовать буфер (массив) для хранения следующего слова.
Полный код сборки для записи в текстовый файл (версия 1)
Работа с текстовыми файлами
Р абота с текстовым файлом похожа работу с консолью: с помощью функций форматированного ввода мы сохраняем данные в файл, с помощью функций форматированного вывода считываем данные из файла. Есть множество нюансов, которые мы позже рассмотрим. Основные операции, которые необходимо проделать, это
- 1. Открыть файл, для того, чтобы к нему можно было обращаться. Соответственно, открывать можно для чтения, записи, чтения и записи, переписывания или записи в конец файла и т.п. Когда вы открываете файл, может также произойти куча ошибок – файла может не существовать, это может быть файл не того типа, у вас может не быть прав на работу с файлом и т.д. Всё это необходимо учитывать.
- 2. Непосредственно работа с файлом - запись и чтение. Здесь также нужно помнить, что мы работаем не с памятью с произвольным доступом, а с буферизированным потоком, что добавляет свою специфику.
- 3. Закрыть файл. Так как файл является внешним по отношению к программе ресурсом, то если его не закрыть, то он продолжит висеть в памяти, возможно, даже после закрытия программы (например, нельзя будет удалить открытый файл или внести изменения и т.п.). Кроме того, иногда необходимо не закрывать, а "переоткрывать" файл для того, чтобы, например, изменить режим доступа.
Кроме того, существует ряд задач, когда нам не нужно обращаться к содержимому файла: переименование, перемещение, копирование и т.д. К сожалению, в стандарте си нет описания функций для этих нужд. Они, безусловно, имеются для каждой из реализаций компилятора. Считывание содержимого каталога (папки, директории) – это тоже обращение к файлу, потому что папка сама по себе является файлом с метаинформацией.
Иногда необходимо выполнять некоторые вспомогательные операции: переместиться в нужное место файла, запомнить текущее положение, определить длину файла и т.д.
Для работы с файлом необходим объект FILE. Этот объект хранит идентификатор файлового потока и информацию, которая нужна, чтобы им управлять, включая указатель на его буфер, индикатор позиции в файле и индикаторы состояния.
Объект FILE сам по себе является структурой, но к его полям не должно быть доступа. Переносимая программа должна работать с файлом как с абстрактным объектом, позволяющим получить доступ до файлового потока.
Создание и выделение памяти под объект типа FILE осуществляется с помощью функции fopen или tmpfile (есть и другие, но мы остановимся только на этих).
Функция fopen открывает файл. Она получает два аргумента – строку с адресом файла и строку с режимом доступа к файлу. Имя файла может быть как абсолютным, так и относительным. fopen возвращает указатель на объект FILE, с помощью которого далее можно осуществлять доступ к файлу.
Например, откроем файл и запишем в него Hello World
Функция fopen сама выделяет память под объект, очистка проводится функцией fclose. Закрывать файл обязательно, самостоятельно он не закроется.
Функция fopen может открывать файл в текстовом или бинарном режиме. По умолчанию используется текстовый. Режим доступа может быть следующим
Тип | Описание |
---|---|
r | Чтение. Файл должен существовать. |
w | Запись нового файла. Если файл с таким именем уже существует, то его содержимое будет потеряно. |
a | Запись в конец файла. Операции позиционирования (fseek, fsetpos, frewind) игнорируются. Файл создаётся, если не существовал. |
r+ | Чтение и обновление. Можно как читать, так и писать. Файл должен существовать. |
w+ | Запись и обновление. Создаётся новый файл. Если файл с таким именем уже существует, то его содержимое будет потеряно. Можно как писать, так и читать. |
a+ | Запись в конец и обновление. Операции позиционирования работают только для чтения, для записи игнорируются. Если файл не существовал, то будет создан новый. |
Если необходимо открыть файл в бинарном режиме, то в конец строки добавляется буква b, например “rb”, “wb”, “ab”, или, для смешанного режима “ab+”, “wb+”, “ab+”. Вместо b можно добавлять букву t, тогда файл будет открываться в текстовом режиме. Это зависит от реализации. В новом стандарте си (2011) буква x означает, что функция fopen должна завершиться с ошибкой, если файл уже существует. Дополним нашу старую программу: заново откроем файл и считаем, что мы туда записали.
Вместо функции fgets можно было использовать fscanf, но нужно помнить, что она может считать строку только до первого пробела.
fscanf(file, "%127s", buffer);
Также, вместо того, чтобы открывать и закрывать файл можно воспользоваться функцией freopen, которая «переоткрывает» файл с новыми правами доступа.
Функции fprintf и fscanf отличаются от printf и scanf только тем, что принимают в качестве первого аргумента указатель на FILE, в который они будут выводить или из которого они будут читать данные. Здесь стоит сразу же добавить, что функции printf и scanf могут быть без проблем заменены функциями fprintf и fscanf. В ОС (мы рассматриваем самые распространённые и адекватные операционные системы) существует три стандартных потока: стандартный поток вывода stdout, стандартный поток ввода stdin и стандартный поток вывода ошибок stderr. Они автоматически открываются во время запуска приложения и связаны с консолью. Пример
Примеры
1. В одном файле записаны два числа - размерности массива. Заполним второй файл массивом случайных чисел.
2. Пользователь копирует файл, при этом сначала выбирает режим работы: файл может выводиться как на консоль, так и копироваться в новый файл.
3. Пользователь вводит данные с консоли и они записываются в файл до тех пор, пока не будет нажата клавиша esc. Проверьте программу и посмотрите. как она себя ведёт в случае, если вы вводите backspace: что выводится в файл и что выводится на консоль.
4. В файле записаны целые числа. Найти максимальное из них. Воспользуемся тем, что функция fscanf возвращает число верно прочитанных и сопоставленных объектов. Каждый раз должно возвращаться число 1.
Другое решение считывать числа, пока не дойдём до конца файла.
5. В файле записаны слова: русское слово, табуляция, английское слово, в несколько рядов. Пользователь вводит английское слово, необходимо вывести русское.
Файл с переводом выглядит примерно так
солнце sun
карандаш pen
шариковая ручка pencil
дверь door
окно windows
стул chair
кресло armchair
и сохранён в кодировке cp866 (OEM 866). При этом важно: последняя пара cлов также заканчивается переводом строки.
Алгоритм следующий - считываем строку из файла, находим в строке знак табуляции, подменяем знак табуляции нулём, копируем русское слово из буфера, копируем английское слово из буфера, проверяем на равенство.
6. Подсчитать количество строк в файле. Будем считывать файл посимвольно, считая количество символов '\n' до тех пор, пока не встретим символ EOF. EOF – это спецсимвол, который указывает на то, что ввод закончен и больше нет данных для чтения. Функция возвращает отрицательное значение в случае ошибки.
ЗАМЕЧАНИЕ: EOF имеет тип int, поэтому нужно использовать int для считывания символов. Кроме того, значение EOF не определено стандартом.
Всё ещё не понятно? – пиши вопросы на ящик
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Заменяет содержимое заданного файла на содержимое другого файла, удаляя исходный файл и создавая резервную копию замененного файла.
Устранение неполадок
Перенос кода в блок try-catch-finally для обработки ошибок и исключений является хорошей практикой программирования, когда речь заходит о выполнении любых операций с файлом. В частности, может потребоваться освободить дескрипторы файла в окончательном блоке, чтобы файл не был заблокирован на неопределенный срок. Некоторые возможные ошибки включают файл, который не существует, или файл, который уже используется.
Для удобства обращения информация в запоминающих устройствах хранится в виде файлов.
Файл – именованная область внешней памяти, выделенная для хранения массива данных. Данные, содержащиеся в файлах, имеют самый разнообразный характер: программы на алгоритмическом или машинном языке; исходные данные для работы программ или результаты выполнения программ; произвольные тексты; графические изображения и т. п.
Каталог ( папка , директория ) – именованная совокупность байтов на носителе информации, содержащая название подкаталогов и файлов, используется в файловой системе для упрощения организации файлов.
Файловой системой называется функциональная часть операционной системы, обеспечивающая выполнение операций над файлами. Примерами файловых систем являются FAT (FAT – File Allocation Table, таблица размещения файлов), NTFS, UDF (используется на компакт-дисках).
Существуют три основные версии FAT: FAT12, FAT16 и FAT32. Они отличаются разрядностью записей в дисковой структуре, т.е. количеством бит, отведённых для хранения номера кластера. FAT12 применяется в основном для дискет (до 4 кбайт), FAT16 – для дисков малого объёма, FAT32 – для FLASH-накопителей большой емкости (до 32 Гбайт).
Рассмотрим структуру файловой системы на примере FAT32.
Полный код сборки для записи в текстовый файл (версия 2)
Запись в текстовый файл (пример 2)
В следующем коде используется класс StreamWriter для открытия, записи и закрытия текстового файла. В отличие от предыдущего примера, этот код передает в конструктор два дополнительных параметра. Первый параметр — путь к файлу и имя файла. Второй параметр, true , указывает, что файл открыт в режиме добавления. Если вы задаете false для второго параметра, содержимое файла перезаписывается при каждом запуске кода. Третий параметр задает Unicode , чтобы кодирование файла в StreamWriter выполнялось в формате Юникода. Можно также указать следующие методы кодирования для третьего параметра:
Метод Write аналогичен методу WriteLine , за исключением того, что метод Write не вставляет автоматически сочетание символов возврата каретки или перевода строки (CR/LF). Это полезно, когда нужно одновременно записывать по одному символу.
Запустите Visual Studio.
В меню Файл выберите пункт Создать и затем пункт Проект.
Добавьте следующий код в начало файла Class1.cs:
Добавьте указанный ниже код в метод Main :
В меню Отладка выберите Пуск для компиляции и запуска приложения. Этот код создает файл с именем Test1.txt на диске C. Откройте Test1.txt в текстовом редакторе, например в Блокноте. Test1.txt содержит одну текстовую строку: 0123456789.
Перегрузки
Заменяет содержимое заданного файла на содержимое другого файла, удаляя исходный файл и создавая резервную копию замененного файла.
Заменяет содержимое заданного файла на содержимое другого файла, удаляя исходный файл и создавая резервную копию замененного файла, и при необходимости игнорирует ошибки слияния.
Запись в текстовый файл (пример 1)
В следующем коде используется класс StreamWriter для открытия, записи и закрытия текстового файла. Аналогично тому, как используется класс StreamReader , можно передать путь к текстовому файлу в конструктор StreamWriter для автоматического открытия файла. Метод WriteLine записывает всю текстовую строку в текстовый файл.
Запустите Visual Studio.
В меню Файл выберите пункт Создать, а затем выберите Проект.
Добавьте следующий код в начало файла Class1.cs:
Добавьте указанный ниже код в метод Main :
В меню Отладка выберите Пуск для компиляции и запуска приложения. Этот код создает файл с именем Test.txt на диске C. Откройте Test.txt в текстовом редакторе, например в Блокноте. Test.txt содержит две текстовые строки:
Примеры
В следующем примере кода метод используется Replace для замены файла другим файлом и создания резервной копии замененного файла.
Ошибка открытия файла
Если вызов функции fopen прошёл неудачно, то она возвратит NULL. Ошибки во время работы с файлами встречаются достаточно часто, поэтому каждый раз, когда мы окрываем файл, необходимо проверять результат работы
Проблему вызывает случай, когда открывается сразу несколько файлов: если один из них нельзя открыть, то остальные также должны быть закрыты
В простых случаях можно действовать влоб, как в предыдущем куске кода. В более сложных случаях используются методы, подменяющиее RAII из С++: обёртки, или особенности компилятора (cleanup в GCC) и т.п.
Буферизация данных
- 1) Если он заполнен
- 2) Если поток закрывается
- 3) Если мы явно указываем, что необходимо очистить буфер (здесь тоже есть исключения:)).
- 4) Также очищается, если программа завершилась удачно. Вместе с этим закрываются и все файлы. В случае ошибки выполнения этого может не произойти.
Форсировать выгрузку буфера можно с помощью вызова функции fflush(File *). Рассмотрим два примера – с очисткой и без.
Раскомментируйте вызов fflush. Во время выполнения откройте текстовый файл и посмотрите на поведение.
Буфер файла можно назначить самостоятельно, задав свой размер. Делается это при помощи функции
которая принимает уже открытый FILE и указатель на новый буфер. Размер нового буфера должен быть не меньше чем BUFSIZ (к примеру, на текущей рабочей станции BUFSIZ равен 512 байт). Если передать в качестве буфера NULL, то поток станет небуферизированным. Можно также воспользоваться функцией
- _IOFBF - полная буферизация. Данные записываются в файл, когда он заполняется. На считывание, буфер считается заполненным, когда запрашивается операция ввода и буфер пуст.
- _IOLBF - линейная буферизация. Данные записываются в файл когда он заполняется, либо когда встречается символ новой строки. На считывание, буфер заполняется до символа новой строки, когда запрашивается операция ввода и буфер пуст.
- _IONBF – без буферизации. В этом случае параметры size и buffer игнорируются.
Пример: зададим свой буфер и посмотрим, как осуществляется чтение из файла. Пусть файл короткий (что-нибудь, типа Hello, World!), и считываем мы его посимвольно
Видно, что данные уже находятся в буфере. Считывание посимвольно производится уже из буфера.
Функция int feof (FILE * stream); возвращает истину, если конец файла достигнут. Функцию удобно использовать, когда необходимо пройти весь файл от начала до конца. Пусть есть файл с текстовым содержимым text.txt. Считаем посимвольно файл и выведем на экран.
Всё бы ничего, только функция feof работает неправильно. Это связано с тем, что понятие "конец файла" не определено. При использовании feof часто возникает ошибка, когда последние считанные данные выводятся два раза. Это связано с тем, что данные записывается в буфер ввода, последнее считывание происходит с ошибкой и функция возвращает старое считанное значение.
Этот пример сработает с ошибкой (скорее всего) и выведет последний символ файла два раза.
Решение – не использовать feof. Например, хранить общее количество записей или использовать тот факт, что функции fscanf и пр. обычно возвращают число верно считанных и сопоставленных значений.
Комментарии
File Используйте класс для типичных операций, таких как копирование, перемещение, переименование, создание, открытие, удаление и добавление в один файл за раз. Класс также можно использовать для File получения и задания атрибутов файла или DateTime сведений, связанных с созданием, доступом и записью файла. Если вы хотите выполнять операции с несколькими файлами, см Directory.GetFiles . или DirectoryInfo.GetFiles.
Многие методы File возвращают другие типы ввода-вывода при создании или открытии файлов. Эти другие типы можно использовать для дальнейшего управления файлом. Дополнительные сведения см. в разделе о конкретных File членах, таких как OpenText, CreateTextили Create.
Так как все File методы являются статическими, можно использовать метод, File а не соответствующий FileInfo метод экземпляра, если требуется выполнить только одно действие. Для всех File методов требуется путь к файлу, который вы управляете.
Статические методы File класса выполняют проверки безопасности для всех методов. Если вы собираетесь повторно использовать объект несколько раз, рассмотрите возможность использования соответствующего FileInfo метода экземпляра, так как проверка безопасности не всегда потребуется.
По умолчанию всем пользователям предоставляется полный доступ на чтение и запись к новым файлам.
В следующей таблице описаны перечисления, используемые для настройки поведения различных File методов.
Перечисление | Описание |
---|---|
FileAccess | Указывает доступ на чтение и запись к файлу. |
FileShare | Указывает уровень доступа, разрешенный для файла, который уже используется. |
FileMode | Указывает, сохраняется ли содержимое существующего файла или перезаписывается, а также указывает, вызывают ли запросы на создание существующего файла исключение. |
В элементах, которые принимают путь в качестве входной строки, этот путь должен быть правильно сформирован или создается исключение. Например, если путь является полным, но начинается с пробела, путь не обрезается в методах класса. Таким образом, путь имеет неправильный формат и возникает исключение. Аналогичным образом путь или сочетание путей не могут быть полностью полностью дважды. Например, "c:\temp c:\windows" также вызывает исключение в большинстве случаев. Убедитесь, что пути правильно сформированы при использовании методов, которые принимают строку пути.
В элементах, которые принимают путь, путь может ссылаться на файл или только каталог. Указанный путь также может ссылаться на относительный путь или UNC-путь для сервера и имени общей папки. Например, все следующие допустимые пути:
Список распространенных задач ввода-вывода см. в разделе "Общие задачи ввода-вывода".
Чтение текстового файла
В следующем коде используется класс StreamReader для открытия, чтения и закрытия текстового файла. Можно передать путь к текстовому файлу в конструктор StreamReader для автоматического открытия файла. Метод ReadLine считывает каждую строку текста и перемещает указатель файла на следующую строку по мере чтения. Если метод ReadLine достигает конца файла, он возвращает пустую ссылку. Дополнительные сведения см. в разделе Класс StreamReader.
Создайте пример текстового файла в Блокноте. Выполните приведенные ниже действия.
- Вставьте текст hello world в Блокнот.
- Сохраните файл как Sample.txt.
Запустите Microsoft Visual Studio.
В меню Файл выберите пункт Создать, а затем выберите Проект.
Добавьте следующий код в начало файла Class1.cs:
Добавьте указанный ниже код в метод Main :
В меню Отладка выберите Пуск для компиляции и запуска приложения. Нажмите клавишу ВВОД, чтобы закрыть окно консоли. В окне консоли отображается содержимое файла Sample.txt:
Читайте также: