C открыть файл для чтения

C++. Работа с текстовыми файлами

C открыть файл для чтения

Файлы позволяют пользователю считывать большие объемы данных непосредственно с диска, не вводя их с клавиатуры. Существуют два основных типа файлов: текстовые и двоичные.

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

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

Для работы с файлами используются специальные типы данных, называемые потоками. Поток ifstream служит для работы с файлами в режиме чтения, а ofstream в режиме записи. Для работы с файлами в режиме как записи, так и чтения служит поток fstream.

В программах на C++ при работе с текстовыми файлами необходимо подключать библиотеки iostream и fstream.

Для того чтобы записывать данные в текстовый файл, необходимо:

  1. описать переменную типа ofstream.
  2. открыть файл с помощью функции open.
  3. вывести информацию в файл.
  4. обязательно закрыть файл.

Для считывания данных из текстового файла, необходимо:

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

Запись информации в текстовый файл

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

ofstream F;

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

F.open(«file», mode);

Здесь F — переменная, описанная как ofstream, file — полное имя файла на диске, mode — режим работы с открываемым файлом.

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

txt, находящемуся в папке sitesна диске D, в программе необходимо указать: D:\\sites\\accounts.txt.

Файл может быть открыт в одном из следующих режимов:

  • ios::in — открыть файл в режиме чтения данных; режим является режимом по умолчанию для потоков ifstream;
  • ios::out — открыть файл в режиме записи данных (при этом информация о существующем файле уничтожается); режим является режимом по умолчанию для потоков ofstream;
  • ios::app — открыть файл в режиме записи данных в конец файла;
  • ios::ate — передвинуться в конец уже открытого файла;
  • ios::trunc — очистить файл, это же происходит в режиме ios::out;
  • ios::nocreate — не выполнять операцию открытия файла, если он не существует;
  • ios::noreplace — не открывать существующий файл.

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

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

Открыть файл (в качестве примера возьмем файл D:\\sites\\accounts.txt) в режиме записи можно одним из следующих способов:

//первый способofstream F;F.open(«D:\\sites\\accounts.txt», ios::out);//второй способ, режим ios::out является режимом по умолчанию//для потока ofstreamofstream F;F.open(«D:\\game\oobs.txt»);//третий способ объединяет описание переменной и типа поток//и открытие файла в одном оператореofstream F («D:\\game\oobs.txt», ios::out);

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

Если вы хотите открыть существующий файл в режиме дозаписи, то в качестве режима следует использовать значение ios::app.

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

Например, для записи в поток F переменной a, оператор вывода будет иметь вид:

F

Источник: https://kvodo.ru/urok-10-1-rabota-s-tekstovyimi-faylami-v-c.html

C# и .NET | FileStream. Чтение и запись файла

C открыть файл для чтения

Последнее обновление: 13.10.2019

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

Создание FileStream

Для создания объекта FileStream можно использовать как конструкторы этого класса, так и статические методы класса File. Конструктор FileStream имеет множество перегруженных версий, из которых отмечу лишь одну, самую простую и используемую:

FileStream(string filename, FileMode mode)

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

  • Append: если файл существует, то текст добавляется в конец файл. Если файла нет, то он создается. Файл открывается только для записи.
  • Create: создается новый файл. Если такой файл уже существует, то он перезаписывается
  • CreateNew: создается новый файл. Если такой файл уже существует, то он приложение выбрасывает ошибку
  • Open: открывает файл. Если файл не существует, выбрасывается исключение
  • OpenOrCreate: если файл существует, он открывается, если нет – создается новый
  • Truncate: если файл существует, то он перезаписывается. Файл открывается только для записи.

Другой способ создания объекта FileStream представляют статические методы класса File:

FileStream File.Open(string file, FileMode mode); FileStream File.OpenRead(string file); FileStream File.OpenWrite(string file);

Первый метод открывает файл с учетом объекта FileMode и возвращает файловой поток FileStream. У этого метода также есть несколько перегруженных версий. Второй метод открывает поток для чтения, а третий открывает поток для записи.

Свойства и методы FileStream

Рассмотрим наиболее важные его свойства и методы класса FileStream:

  • Свойство Length: возвращает длину потока в байтах
  • Свойство Position: возвращает текущую позицию в потоке
  • void CopyTo(Stream destination): копирует данные из текущего потока в поток destination
  • Task CopyToAsync(Stream destination): асинхронная версия метода CopyToAsync
  • int Read(byte[] array, int offset, int count): считывает данные из файла в массив байтов и возвращает количество успешно считанных байтов. Принимает три параметра:
    • array – массив байтов, куда будут помещены считываемые из файла данные
    • offset представляет смещение в байтах в массиве array, в который считанные байты будут помещены
    • count – максимальное число байтов, предназначенных для чтения. Если в файле находится меньшее количество байтов, то все они будут считаны.
    • Task ReadAsync(byte[] array, int offset, int count): асинхронная версия метода Read
  • long Seek(long offset, SeekOrigin origin): устанавливает позицию в потоке со смещением на количество байт, указанных в параметре offset.

  • void Write(byte[] array, int offset, int count): записывает в файл данные из массива байтов. Принимает три параметра:

    • array – массив байтов, откуда данные будут записываться в файл
    • offset – смещение в байтах в массиве array, откуда начинается запись байтов в поток
    • count – максимальное число байтов, предназначенных для записи
  • ValueTask WriteAsync(byte[] array, int offset, int count): асинхронная версия метода Write

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

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

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

Посмотрим на примере считывания-записи в текстовый файл:

using System; using System.IO; namespace HelloApp { class Program { static void Main(string[] args) { // создаем каталог для файла string path = @”C:\SomeDir2″; DirectoryInfo dirInfo = new DirectoryInfo(path); if (!dirInfo.Exists) { dirInfo.Create(); } Console.WriteLine(“Введите строку для записи в файл:”); string text = Console.ReadLine(); // запись в файл using (FileStream fstream = new FileStream($”{path}ote.txt”, FileMode.OpenOrCreate)) { // преобразуем строку в байты byte[] array = System.Text.Encoding.Default.GetBytes(text); // запись массива байтов в файл fstream.Write(array, 0, array.Length); Console.WriteLine(“Текст записан в файл”); } // чтение из файла using (FileStream fstream = File.OpenRead($”{path}ote.txt”)) { // преобразуем строку в байты byte[] array = new byte[fstream.Length]; // считываем данные fstream.Read(array, 0, array.Length); // декодируем байты в строку string textFromFile = System.Text.Encoding.Default.GetString(array); Console.WriteLine($”Текст из файла: {textFromFile}”); } Console.ReadLine(); } } }

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

И при чтении, и при записи используется оператор using. Не надо путать данный оператор с директивой using, которая подключает пространства имен в начале файла кода. Оператор using позволяет создавать объект в блоке кода, по завершению которого вызывается метод Dispose у этого объекта, и, таким образом, объект уничтожается. В данном случае в качестве такого объекта служит переменная fstream.

И при записи, и при чтении применяется объект кодировки Encoding.Default из пространства имен System.Text. В данном случае мы используем два его метода: GetBytes для получения массива байтов из строки и GetString для получения строки из массива байтов.

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

fstream.WriteByte(13); fstream.WriteByte(103);

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

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

using System; using System.IO; using System.Threading.Tasks; namespace HelloApp { class Program { static async Task Main(string[] args) { // создаем каталог для файла string path = @”C:\SomeDir3″; DirectoryInfo dirInfo = new DirectoryInfo(path); if (!dirInfo.Exists) { dirInfo.Create(); } Console.WriteLine(“Введите строку для записи в файл:”); string text = Console.ReadLine(); // запись в файл using (FileStream fstream = new FileStream($”{path}ote.txt”, FileMode.OpenOrCreate)) { byte[] array = System.Text.Encoding.Default.GetBytes(text); // асинхронная запись массива байтов в файл await fstream.WriteAsync(array, 0, array.Length); Console.WriteLine(“Текст записан в файл”); } // чтение из файла using (FileStream fstream = File.OpenRead($”{path}ote.txt”)) { byte[] array = new byte[fstream.Length]; // асинхронное чтение файла await fstream.ReadAsync(array, 0, array.Length); string textFromFile = System.Text.Encoding.Default.GetString(array); Console.WriteLine($”Текст из файла: {textFromFile}”); } Console.ReadLine(); } } }

Произвольный доступ к файлам

Нередко бинарные файлы представляют определенную структуру. И, зная эту структуру, мы можем взять из файла нужную порцию информации или наоброт записать в определенном месте файла определенный набор байтов. Например, в wav-файлах непосредственно звуковые данные начинаются с 44 байта, а до 44 байта идут различные метаданные – количество каналов аудио, частота дискретизации и т.д.

С помощью метода Seek() мы можем управлять положением курсора потока, начиная с которого производится считывание или запись в файл. Этот метод принимает два параметра: offset (смещение) и позиция в файле. Позиция в файле описывается тремя значениями:

  • SeekOrigin.Begin: начало файла
  • SeekOrigin.End: конец файла
  • SeekOrigin.Current: текущая позиция в файле

Курсор потока, с которого начинается чтение или запись, смещается вперед на значение offset относительно позиции, указанной в качестве второго параметра. Смещение может быть отрицательным, тогда курсор сдвигается назад, если положительное – то вперед.

Рассмотрим на примере:

using System.IO; using System.Text; class Program { static void Main(string[] args) { string text = “hello world”; // запись в файл using (FileStream fstream = new FileStream(@”D:ote.dat”, FileMode.OpenOrCreate)) { // преобразуем строку в байты byte[] input = Encoding.Default.GetBytes(text); // запись массива байтов в файл fstream.Write(input, 0, input.Length); Console.WriteLine(“Текст записан в файл”); // перемещаем указатель в конец файла, до конца файла- пять байт fstream.Seek(-5, SeekOrigin.End); // минус 5 символов с конца потока // считываем четыре символов с текущей позиции byte[] output = new byte[4]; fstream.Read(output, 0, output.Length); // декодируем байты в строку string textFromFile = Encoding.Default.GetString(output); Console.WriteLine($”Текст из файла: {textFromFile}”); // worl // заменим в файле слово world на слово house string replaceText = “house”; fstream.Seek(-5, SeekOrigin.End); // минус 5 символов с конца потока input = Encoding.Default.GetBytes(replaceText); fstream.Write(input, 0, input.Length); // считываем весь файл // возвращаем указатель в начало файла fstream.Seek(0, SeekOrigin.Begin); output = new byte[fstream.Length]; fstream.Read(output, 0, output.Length); // декодируем байты в строку textFromFile = Encoding.Default.GetString(output); Console.WriteLine($”Текст из файла: {textFromFile}”); // hello house } Console.Read(); } }

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

Текст записан в файл Текст из файла: worl Текст из файла: hello house

Вызов fstream.Seek(-5, SeekOrigin.End) перемещает курсор потока в конец файлов назад на пять символов:

То есть после записи в новый файл строки “hello world” курсор будет стоять на позиции символа “w”.

После этого считываем четыре байта начиная с символа “w”. В данной кодировке 1 символ будет представлять 1 байт. Поэтому чтение 4 байтов будет эквивалентно чтению четырех сиволов: “worl”.

Затем опять же перемещаемся в конец файла, не доходя до конца пять символов (то есть опять же с позиции символа “w”), и осуществляем запись строки “house”. Таким образом, строка “house” заменяет строку “world”.

Закрытие потока

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

FileStream fstream = null; try { fstream = new FileStream(@”D:ote3.dat”, FileMode.OpenOrCreate); // операции с потоком } catch(Exception ex) { } finally { if (fstream != null) fstream.Close(); }

Если мы не используем конструкцию using, то нам надо явным образом вызвать метод Close(): fstream.Close()

Источник: https://metanit.com/sharp/tutorial/5.4.php

Чтение и запись в текстовый файл с помощью Visual C # – C#

C открыть файл для чтения

  • 04/14/2020
  • Чтение занимает 5 мин
    • r
    • o

Эта статья поможет вам читать и записывать в текстовый файл с помощью Visual C#.

Исходная версия продукта:   Visual Studio
Исходный номер статьи базы знаний:   816149

В разделе чтение текстового файла этой статьи описано, как использовать StreamReader класс для чтения текстового файла. В разделе запись текстового файла (пример 1) и запись текстового файла (пример 2) описывается использование StreamWriter класса для записи текста в файл.

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

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

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

Для получения дополнительных сведений см класс StreamReader.

  1. Создайте пример текстового файла в блокноте. Выполните приведенные ниже действия.

    1. Вставьте текст Hello World в блокноте.
    2. Сохраните файл как Sample.txt.
  2. Запустите Microsoft Visual Studio.

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

  4. Выберите проекты Visual C# в разделе типы проектов, а затем выберите консольное приложение в разделе шаблоны.

  5. Добавьте следующий код в начало файла Class1.CS :

    using System.IO;

  6. Добавьте следующий код в Main метод:

    String line;try{ //Pass the file path and file name to the StreamReader constructor StreamReader sr = new StreamReader(“C:\\Sample.txt”); //Read the first line of text line = sr.ReadLine(); //Continue to read until you reach end of file while (line != null) { //write the lie to console window Console.WriteLine(line); //Read the next line line = sr.ReadLine(); } //close the file sr.Close(); Console.ReadLine();}catch(Exception e){ Console.WriteLine(“Exception: ” + e.Message);}finally{ Console.WriteLine(“Executing finally block.”);}

  7. В меню Отладка выберите команду начать , чтобы скомпилировать и запустить приложение. Нажмите клавишу ВВОД, чтобы закрыть окно консоли . В окне консоли отображается содержимое файла Sample.txt :

    Hello world

Создание текстового файла (пример 1)

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

  1. Запустите Visual Studio.

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

  3. Выберите проекты Visual C# в разделе типы проектов, а затем выберите консольное приложение в разделе шаблоны.

  4. Добавьте следующий код в начало файла Class1.CS :

    using System.IO;

  5. Добавьте следующий код в Main метод:

    try{ //Pass the filepath and filename to the StreamWriter Constructor StreamWriter sw = new StreamWriter(“C:\\Test.txt”); //Write a line of text sw.WriteLine(“Hello World!!”); //Write a second line of text sw.WriteLine(“From the StreamWriter class”); //Close the file sw.Close();}catch(Exception e){ Console.WriteLine(“Exception: ” + e.Message);}finally{ Console.WriteLine(“Executing finally block.”);}

  6. В меню Отладка выберите команду начать , чтобы скомпилировать и запустить приложение. Этот код создает файл с именем Test.txt на диске C. Откройте Test.txt в текстовом редакторе, например в блокноте. Test.txt содержит две строки текста:

    Hello World!!From the StreamWriter class

Создание текстового файла (пример 2)

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

Второй параметр указывает, true что файл открыт в режиме Append. Если указать false второй параметр, содержимое файла перезаписывается каждый раз при запуске кода. Третий параметр указывает Unicode , что StreamWriter кодирует файл в формате Юникод.

Кроме того, можно указать следующие методы кодирования для третьего параметра:

WriteМетод аналогичен WriteLine методу, за исключением того, что Write метод не внедряет сочетание символов возврата каретки и перевода строки (CR/LF). Это удобно, если вы хотите написать по одному символу за раз.

  1. Запустите Visual Studio.

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

  3. Выберите проекты Visual C# в разделе типы проектов, а затем выберите консольное приложение в разделе шаблоны.

  4. Добавьте следующий код в начало файла Class1.CS :

    using System.IO;using System.Text;

  5. Добавьте следующий код в Main метод:

    Int64 x;try{ //Open the File StreamWriter sw = new StreamWriter(“C:\\Test1.txt”, true, Encoding.ASCII); //Write out the numbers 1 to 10 on the same line. for(x=0; x < 10; x++) { sw.Write(x); } //close the file sw.Close();}catch(Exception e){ Console.WriteLine("Exception: " + e.Message);}finally{ Console.WriteLine("Executing finally block.");}

  6. В меню Отладка выберите команду начать , чтобы скомпилировать и запустить приложение. Этот код создает файл с именем Test1.txt на диске C. Откройте Test1.txt в текстовом редакторе, например в блокноте. Test1.txt содержит одну строку текста: 0123456789.

Полный листинг кода для чтения текстового файла

//Read a Text Fileusing System;using System.IO;namespace readwriteapp{ class Class1 { [STAThread] static void Main(string[] args) { String line; try { //Pass the file path and file name to the StreamReader constructor StreamReader sr = new StreamReader(“C:\\Sample.txt”); //Read the first line of text line = sr.

ReadLine(); //Continue to read until you reach end of file while (line != null) { //write the lie to console window Console.WriteLine(line); //Read the next line line = sr.ReadLine(); } //close the file sr.Close(); Console.ReadLine(); } catch(Exception e) { Console.WriteLine(“Exception: ” + e.Message); } finally { Console.

WriteLine(“Executing finally block.”); } } }}

Полный листинг кода для записи текстового файла (версия 1)

//Write a text file – Version-1using System;using System.IO;namespace readwriteapp{ class Class1 { [STAThread] static void Main(string[] args) { try { //Pass the filepath and filename to the StreamWriter Constructor StreamWriter sw = new StreamWriter(“C:\\Test.

txt”); //Write a line of text sw.WriteLine(“Hello World!!”); //Write a second line of text sw.WriteLine(“From the StreamWriter class”); //Close the file sw.Close(); } catch(Exception e) { Console.WriteLine(“Exception: ” + e.Message); } finally { Console.

WriteLine(“Executing finally block.”); } } }}

Полный листинг кода для записи текстового файла (версия 2)

//Write a text file – Version 2using System;using System.IO;using System.Text;namespace readwriteapp{ class Class1 { [STAThread] static void Main(string[] args) { Int64 x; try { //Open the File StreamWriter sw = new StreamWriter(“C:\\Test1.

txt”, true, Encoding.ASCII); //Writeout the numbers 1 to 10 on the same line. for(x=0; x < 10; x++) { sw.Write(x); } //close the file sw.Close(); } catch(Exception e) { Console.WriteLine("Exception: " + e.Message); } finally { Console.

WriteLine(“Executing finally block.”); } } }}

Устранение неполадок

Для всех операций с файлами рекомендуется программировать код внутри try-catch-finally блока, чтобы обрабатывать ошибки и исключения. В частности, может потребоваться освободить дескрипторы файла в последнем блоке, чтобы файл не блокировался в течение неопределенного срока. Некоторые возможные ошибки включают несуществующий файл или уже используемый файл.

Источник: https://docs.microsoft.com/ru-ru/troubleshoot/dotnet/csharp/read-write-text-file

Работа с файлами : открытие и закрытие, чтение и запись данных

C открыть файл для чтения
 

Для удобства обращения информация в запоминающих устройствах хранится в виде файлов. 

Файл – именованная область внешней памяти, выделенная для хранения массива данных.

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

 

Каталог (папка, директория) – именованная совокупность байтов на носителе информации, содержащая название подкаталогов и файлов, используется в файловой системе для упрощения организации файлов.

 

Файловой системой называется функциональная часть операционной системы, обеспечивающая выполнение операций над файлами. Примерами файловых систем являются FAT (FAT – File Allocation Table, таблица размещения файлов), NTFS, UDF (используется на компакт-дисках).

 Существуют три основные версии FAT: FAT12, FAT16 и FAT32. Они отличаются разрядностью записей в дисковой структуре, т.е. количеством бит, отведённых для хранения номера кластера. FAT12 применяется в основном для дискет (до 4 кбайт), FAT16 – для дисков малого объёма, FAT32 – для FLASH-накопителей большой емкости (до 32 Гбайт). Рассмотрим структуру файловой системы на примере FAT32.

Файловая структура 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 в обычном формате.

Работа с файлами в языке Си

Для программиста открытый файл представляется как последовательность считываемых или записываемых данных. При открытии файла с ним связывается поток ввода-вывода.

Выводимая информация записывается в поток, вводимая информация считывается из потока.

Когда поток открывается для ввода-вывода, он связывается со стандартной структурой типа FILE, которая определена в stdio.h.

Структура FILE содержит необходимую информацию о файле.

Открытие файла осуществляется с помощью функции fopen(), которая возвращает указатель на структуру типа FILE, который можно использовать для последующих операций с файлом.

name – имя открываемого файла (включая путь),
type — указатель на строку символов, определяющих способ доступа к файлу:

  • “r” — открыть файл для чтения (файл должен существовать);
  • “w” — открыть пустой файл для записи; если файл существует, то его содержимое теряется;
  • “a” — открыть файл для записи в конец (для добавления); файл создается, если он не существует;
  • “r+” — открыть файл для чтения и записи (файл должен существовать);
  • “w+” — открыть пустой файл для чтения и записи; если файл существует, то его содержимое теряется;
  • “a+” — открыть файл для чтения и дополнения, если файл не существует, то он создаётся.

 
Возвращаемое значение — указатель на открытый поток. Если обнаружена ошибка, то возвращается значение NULL.

Функция fclose() закрывает поток или потоки, связанные с открытыми при помощи функции fopen() файлами. Закрываемый поток определяется аргументом функции fclose().

Возвращаемое значение: значение 0, если поток успешно закрыт; константа EOF, если произошла ошибка.

#include 
int main() {  FILE *fp;

  char name[] = “my.txt”;

  if ((fp = fopen(name, “r”)) == NULL)  {

    printf(“Не удалось открыть файл”);

    getchar();

    return 0;

  }

  // открыть файл удалось

  …      // требуемые действия над данными  fclose(fp);  getchar();

  return 0;

}

Чтение символа из файла:

Аргументом функции является указатель на поток типа FILE. Функция возвращает код считанного символа. Если достигнут конец файла или возникла ошибка, возвращается константа EOF.

Запись символа в файл:

Аргументами функции являются символ и указатель на поток типа FILE. Функция возвращает код считанного символа.

Функции fscanf() и fprintf() аналогичны функциям scanf() и printf(), но работают с файлами данных, и имеют первый аргумент — указатель на файл.

fscanf(поток, “ФорматВвода”, аргументы);


fprintf(поток, “ФорматВывода”, аргументы);

Функции fgets() и fputs() предназначены для ввода-вывода строк, они являются аналогами функций gets() и puts() для работы с файлами.

fgets(УказательНаСтроку, КоличествоСимволов, поток);


Символы читаются из потока до тех пор, пока не будет прочитан символ новой строки ‘’, который включается в строку, или пока не наступит конец потока EOF или не будет прочитано максимальное количество символов. Результат помещается в указатель на строку и заканчивается нуль- символом ‘\0’. Функция возвращает адрес строки.

fputs(УказательНаСтроку,поток);

Копирует строку в поток с текущей позиции. Завершающий нуль- символ не копируется.

Пример Ввести число и сохранить его в файле s1.txt. Считать число из файла s1.txt, увеличить его на 3 и сохранить в файле s2.txt.

123456789101112131415161718192021

22

#include 
#include 
int main(){  FILE *S1, *S2;

  int x, y;

  system(“chcp 1251”);
  system(“cls”);
  printf(“Введите число : “);
  scanf(“%d”, &x);
  S1 = fopen(“S1.txt”, “w”);
  fprintf(S1, “%d”, x);  fclose(S1);

  S1 = fopen(“S1.txt”, “r”);

  S2 = fopen(“S2.txt”, “w”);
  fscanf(S1, “%d”, &y);  y += 3;  fclose(S1);

  fprintf(S2, “%d”, y);

  fclose(S2);

  return 0;

}

Результат выполнения — 2 файла

Работа с файлами в C++ описана здесь.

Назад: Язык Си

Источник: https://prog-cpp.ru/c-files/

Поделиться:
Нет комментариев

    Добавить комментарий

    Ваш e-mail не будет опубликован. Все поля обязательны для заполнения.