File operations in c windows

Содержание
  1. File Operations, Open, Write, and Close Files In C
  2. stdio.h Library
  3. Opening File
  4. Closing File
  5. Reading File
  6. Writing File
  7. Функции работы с файлами и операции ввода-вывода (C++/CLI) File Handling and I/O (C++/CLI)
  8. Перечислить файлы в каталоге Enumerate Files in a Directory
  9. Пример Example
  10. Мониторинг изменений файловой системы Monitor File System Changes
  11. Пример Example
  12. Чтение двоичного файла Read a Binary File
  13. Пример Example
  14. Чтение текстового файла Read a Text File
  15. Пример Example
  16. Получение сведений о файле Retrieve File Information
  17. Пример Example
  18. Запись двоичного файла Write a Binary File
  19. Пример Example
  20. Запись текстового файла Write a Text File
  21. Работа с файлами в C
  22. Как работать с файлами
  23. Опции-параметры для открытия файлов
  24. Запись в текстовый файл
  25. Позиционирование указателя при записи файла
  26. Основные функции для работы с файлами в языке Си
  27. Открытие и закрытие файлового потока
  28. Чтение из файлов
  29. Запись в файл
  30. Считывание русских символов из файла
  31. Отличие работы с потоками в Си от других языков
  32. Заключение

File Operations, Open, Write, and Close Files In C

While learning C programming language one of the most exciting parts is writing and reading a file. Because these operations create something on the operating system we can see which is different from other examples. In this tutorial, we will look at different aspects of file operations.

stdio.h Library

As we know C provides different types of features with libraries. Input and output related features are provided by the library named stdio.h. In order to run related file operations, we should include this library as below. We generally put include like to the start of the code file like below.

Opening File

The first step to work with a file is opening it. Files can be opened by using fopen function. fopen function generally gets the filename and mode parameters.

fopen function returns a handler back where we use FILE type variable for this.

Below we will create a file pointer named fp and open file named test.txt with w+ write and read mode.

Closing File

In the previous part, we have opened a file with fopen function. But the code provided there is not an efficient code because the file handler does not closed which means the file is not closed. Not closing a file can create a performance or write problems. So after our operation is completed we should close the file with fclose function.

and complete code will be like below.

Reading File

One of the fundamental steps for file operation is reading a file. There are different ways and modes to read a file but in this step, we simply read a line. We will put this in a while loop and read it to the end of the file. Because we will read file so we will use read mode while opening the file with fopen function. We will provide the variable, str , we want to put the grabbed string and the size to read which is 80 and the last one is the file pointer fp

And here fully working code where we use while to read line by line to the end of the file. If the end of the file arrived the NULL value will be returned.

Writing File

In previous steps, we have learned how to open and close files. But the ultimate goal is not opening and closing files. We generally read or write to file. There are different ways to write a file but in this tutorial, we will simply put some line to the file. We will use fputs function by providing the string and file pointer like below.

We can see the whole working example below.

Функции работы с файлами и операции ввода-вывода (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.

Читайте также:  Proxy in linux terminal

Пример 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++/CLI). 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. Экземпляр этого класса используется для открытия текстового файла, а затем System.IO.StreamReader.ReadLine метод используется для получения каждой строки. An instance of this class is used to open a text file and then the System.IO.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++/CLI). 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++/CLI). 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. Если файл существует, он перезаписывается (если не передается значение true в качестве второго 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.

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

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

Читайте также:  Rar rus для windows

Как работать с файлами

Для открытия потока передачи байтов следует писать следующую конструкцию:

FILE * переменная fopen(имя файла, режим открытия);

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

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

Пример открытия и закрытия потока:

int main(void)
<
FILE * f = fopen(«D:\text.txt», «w»); \\ Доступ к файлу, который находится по адресу D:\text.txt c параметром «W», который указывает на запись.
fclose(f); \\ Удаление потока
return 0;
>

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

Пример проверки на ошибку:

int main(void)
<
FILE * f; \\ Объявление переменной типа FILE
if((f= fopen(«D:\text25.txt», «r»))==NULL) \\ Проверка на наличие ошибки при открытии потока.
<
perror(«Error:»); Если есть ошибка, то будет выведен ее текст, в нашем случае это «Error No such file or directory».
exit(0); \\Принудительный выход из программы.
>

fclose(f); \\ Если файл открыт, то функция тут же его закроет.
return 0;
>

Для вывода ошибки в консоль, применяется функция perror(string), которая в качестве параметра принимает текст ошибки. В нашем примере не имеет смысла продолжать выполнение программы, поэтому ее принудительно останавливают с помощью функции exit(0).

Текст ошибки из параметра функции perror сопровождается и сообщением компилятора в виде No such file or directory, которое говорит о отсутствия такого файла в указанной директории. Однако некоторые параметры функции fopen позволяют создать несуществующий файл. Если файл с конкретным именем не находится, то он будет создан заново.

Опции-параметры для открытия файлов

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

  • wb — запись бинарного файла.
  • rb – чтение бинарного файла.
  • ab – продожение записи.
  • w+b – создается бинарный файл для чтения и записи.
  • r+b – чтение или запись бинарного файла.
  • a+b – если файл отсутствует, то создается, если присутствует и заполнен, то продолжение записи.

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

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

Для записи символов или строки в текстовый файл используется функция fputs(). Синтаксис данной функции следующий: int fputs( const char ch, FILE f); Здесь первый параметр ch принимает записываемую строку или символ. Второй параметр указывает на открытый файловый поток. Если при записи произошла ошибка, то функция возвращает значение ошибки EOF.

Пример записи теста в файл:

int main(void)
<
char * mes = «Hello, my name is Vova»; \\Сохраняем строку для записи в файл
char * fName = «D://text5.txt»; \\Сохраняем путь к файлу
char c[256];
FILE * f;

if((f= fopen(fName, «w»))==NULL) \\Если возникла ошибка при открытии файла, то вывести сообщение «Error» и выйти из программы
<
perror(«Error»);
return 1;
>

fputs(mes, f); \\ Запись в файл строки в переменной mes

fclose(f);
return 0;

Так как в данном примере был использован режим открытия «W», то нам открывается пустой файл для записи. Если после выполнения данного кода открыть файл text5.txt, то в его содержании будет строка «Hello, my name is Vova».

Позиционирование указателя при записи файла

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

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

У данной функции следующий синтаксис: fseek(файл, количество байтов для смещения, начальная позиции);

Читайте также:  Имитатор iphone для windows

Пояснение к функции:

  1. Параметр «файл» является переменной типа FILE, указывающая на директорию его расположения.
  2. Параметр «количество байтов для смещения» обладает типом long и в числовом формате указывает на сколько символов нужно переместить каретку.
  3. Параметр «начальная позиция» имеет числовой тип и указывает на каком по порядку от начала байте нужно установить каретку файла.
  4. В третий параметр можно вписать одну из встроенных в структуру FILE констант: SEEK_SET — устанавливает позицию на начало файла; SEEK_CUR — сохраняет текущую позицию в файле, если она была смещена; SEEK_END — устанавливает каретку на конечную позицию.

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

int main(void) <
int i; \\ Переменная для сохранения символов в цикле
char * str = «Hello»; \\ Первая строка записываемая в файл
char * final_str; \\ Строка для дописывания в файл
File * f = fopen(«text.txt», w);
fputs(str, f); \\ Записываем первую строку в файл

fseek(f, 6, SEEK_SET); \\ Устанавливаем каретку на 6-ю позицию
fputs(«World!», f); \\ С шестой позиции записываем в файл строку «World!»
fseek(f, 0, SEEK_SET); \\ Устанавливаем позицию каретки в начало

while ((i = getc(f))!=EOF) \\ Получаем каждый символ файла и сохраняем его в переменную «final_str»
<
*final_str +=(char *)i;
>

printf(«Содержание файла:», final_str); \\ Выводим содержимое файла на консоль
fclose(f);
>

Основные функции для работы с файлами в языке Си

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

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

  • File fopen(f, option) — принимает в качестве аргумента путь к фалу и режим открытия потока, создает поток для записи или чтения текстовых или бинарных данных. Если нет возможности открыть файл, а режим не предусматривает его создания, то возвращает NULL.
  • File freopen(dir, option, f) — аналогичная функция предыдущей, однако первый параметр указывает только путь к фалу, а последний имя файла.
  • fclose(str) — закрывает поток для освобождения памяти от потока, в качестве параметра принимает путь к фалу или объект FILE.

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

  • fgets(f) — читает символ из файла и возвращает его числовой формат int, если результат успешный, то возвращает следующий файл. Если возникает ошибка то возвращает EOF.
  • getc(f) — аналогичная предыдущей функции, но возвращает только один символ в числовом формате.

Запись в файл

  • fwrite(chararr, sizeb, sizec, f) — функция записывает массив символов chararr в файл. Второй параметр указывает размер каждого байта, третий параметр указывает количество байтов, четвертый является объектом File или строковой директорией к нему. Если запись осуществилась успешно, то функция вернет sizec в формате int.
  • fputc(number, f) — первый параметр конвертирует числовой код символа в сам символ и записывает его в поток f. Если запись прошла успешно, то возвращается записанный символ первого параметра, в случае неудачи возвращается EOF.

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

setlocale(LC_ALL, «Russian») — вызов данной функции позволяет настроить поток на работу с кириллицей.

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

Отличие работы с потоками в Си от других языков

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

Ранее мы создавали переменную “f” для сохранения потока. Без нее всегда придется писать строку на подобие “C\:files\index.txt”. Данный подход достаточно неудобный и требует постоянной записи строки. При этом, все равно придется закрывать поток. Проще сохранить его в переменную – это дает гарантию тог, что работа всегда осуществляется с данным потоком.

Заключение

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

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

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

Оцените статью