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

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

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

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

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

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

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

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

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

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

В качестве параметра ей передается указатель на файл:

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

Description

The fopen() function opens the file whose name is the string pointed to by path and associates a stream with it.

The argument mode points to a string beginning with one of the following sequences (possibly followed by additional characters, as described
below):

r

Open text file for reading. The stream is positioned at the beginning of the file.

r+

Open for reading and writing. The stream is positioned at the beginning of the file.

w

Truncate file to zero length or create text file for writing. The stream is positioned at the beginning of the file.

w+

Open for reading and writing. The file is created if it does not exist, otherwise it is truncated. The stream is positioned at the beginning of the file.

a

Open for appending (writing at end of file). The file is created if it does not exist. The stream is positioned at the end of the file.

a+

Open for reading and appending (writing at end of file). The file is created if it does not exist. The initial file position for reading is at the beginning
of the file, but output is always appended to the end of the file.

The mode string can also include the letter ‘b’ either as a last character or as a character between the characters in any of the two-character
strings described above. This is strictly for compatibility with C89 and has no effect; the ‘b’ is ignored on all POSIX conforming systems, including Linux.
(Other systems may treat text files and binary files differently, and adding the ‘b’ may be a good idea if you do I/O to a binary file and expect that your
program may be ported to non-UNIX environments.)

See NOTES below for details of glibc extensions for mode.

Any created files will have mode S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH (0666), as modified by
the process’s umask value (see umask(2)).

Reads and writes may be intermixed on read/write streams in any order. Note that ANSI C requires that a file positioning function intervene between output
and input, unless an input operation encounters end-of-file. (If this condition is not met, then a read is allowed to return the result of writes other than
the most recent.) Therefore it is good practice (and indeed sometimes necessary under Linux) to put an fseek(3) or fgetpos(3) operation between
write and read operations on such a stream. This operation may be an apparent no-op (as in fseek(…, 0L, SEEK_CUR) called for its synchronizing side
effect.

Opening a file in append mode (a as the first character of mode) causes all subsequent write operations to this stream to occur at
end-of-file, as if preceded the call:

fseek(stream, 0, SEEK_END);

The fdopen() function associates a stream with the existing file descriptor, fd. The mode of the stream (one of the values «r», «r+»,
«w», «w+», «a», «a+») must be compatible with the mode of the file descriptor. The file position indicator of the new stream is set to that belonging to
fd, and the error and end-of-file indicators are cleared. Modes «w» or «w+» do not cause truncation of the file. The file descriptor is not dup’ed, and
will be closed when the stream created by fdopen() is closed. The result of applying fdopen() to a shared memory object is undefined.

The freopen() function opens the file whose name is the string pointed to by path and associates the stream pointed to by stream with
it. The original stream (if it exists) is closed. The mode argument is used just as in the fopen() function. The primary use of the
freopen() function is to change the file associated with a standard text stream (stderr, stdin, or stdout).

COLOPHON top

       This page is part of release 5.08 of the Linux man-pages project.  A
       description of the project, information about reporting bugs, and the
       latest version of this page, can be found at
       https://www.kernel.org/doc/man-pages/.

GNU                              2019-05-09                         FOPEN(3)

Pages that refer to this page:
creat(2), 
open(2), 
openat(2), 
addmntent(3), 
endmntent(3), 
fclose(3), 
fcloseall(3), 
fflush(3), 
fgetc(3), 
fgetgrent(3), 
fgetpwent(3), 
fgets(3), 
fgetwc(3), 
fgetws(3), 
fmemopen(3), 
fopencookie(3), 
fputc(3), 
fputs(3), 
fputwc(3), 
fputws(3), 
getc(3), 
getchar(3), 
getdelim(3), 
getline(3), 
getmntent(3), 
getmntent_r(3), 
gets(3), 
getwc(3), 
hasmntopt(3), 
open_memstream(3), 
open_wmemstream(3), 
pclose(3), 
popen(3), 
pthread_getattr_np(3), 
putc(3), 
putchar(3), 
puts(3), 
putwc(3), 
setbuf(3), 
setbuffer(3), 
setlinebuf(3), 
setmntent(3), 
setvbuf(3), 
stderr(3), 
stdin(3), 
stdio(3), 
stdout(3), 
ungetc(3)

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector