Как связать указатель на файл с именем файла

Обновлено: 24.04.2024

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

Ключевые слова

Текст научной работы

Язык программирования С++ обеспечивает несколько способов работы с файлами. Рассмотрим способ потока. Поток является некоторым абстрактным понятием, который относится к любому переносу данных (последовательность байтов) от источника к приемнику. Операция записи информации в поток называется включением информации, а чтение информации из потока извлечением. Эти операции выполняются через буфер. Потоки бывают входные (информация заносится в память), выходные (информация считывается из памяти), а также двунаправленные (допускается как чтение информации, так и запись) 3.

Для работы с файловыми потоками применяются классы istream и ostream. Эти классы базовые для класса iostream, который реализует двунаправленный поток. Чтобы применить в программе этих классов нужно подключить соответствующие заголовочные файлы.

Преимущества работы с файлами используя поток по сравнению с функциями ввода-вывода — контроль типов и работа с типами пользователя. Недостаток работы с использованием потока — это уменьшение быстродействия программы.

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

Работа с файлами заключается в выполнении следующих операций:

  1. открытие файла (для записи информации, добавления или чтения);
  2. запись информации в файл или считывание её с файла;
  3. закрытие файла.

При закрытии файл отсоединяется от потока.

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

Используя FILE, переменная типа указатель файла объявляется следующим образом:

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

Здесь *file_name — это имя файла, перед именем можно указать путь к файлу. Параметр *file_mode определяет режим открытия файла.

Если при выполнении операции открытия файла вышла ошибка, то fopen() вернет NULL, т.е. пустой указатель.

Файл закрывается с помощью функции fclose():

Здесь myfile указатель файла.

Cимвола с файла можно считать используя функцию fgetc():

fgetc() возвращает целочисленное значение. Символ находится в младшем разряде. В том случае, если чтение произошло без ошибок, то старший разряд равен нулю. При чтении признака конца файла функция fgetc() вернет значение EOF.

Символ в файл записывается с помощью функции fputc():

Здесь сh — записываемый символ. В файл записывается только младший разряд сh.

Для определения достигнут ли конец файла, необходимо использовать функцию feof():

При чтении признака конца файла feof() вернет true, а иначе — false.

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

Данные из файла можно считывать и записывать строками. Для этого используются функции fgets() и fputs():

Здесь параметр n — это длина строки, *mys — указатель на строку.

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

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

Для чтения и записи данных любых типов используются функции: fread() и fwrite():

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

Язык программирования С++ обеспечивает несколько способов работы с файлами. Рассмотрим способ потока. Поток является некоторым абстрактным понятием, который относится к любому переносу данных (последовательность байтов) от источника к приемнику. Операция записи информации в поток называется включением информации, а чтение информации из потока извлечением. Эти операции выполняются через буфер. Потоки бывают входные (информация заносится в память), выходные (информация считывается из памяти), а также двунаправленные (допускается как чтение информации, так и запись) 5.

Для работы с файловыми потоками применяются классы istream и ostream. Эти классы базовые для класса iostream, который реализует двунаправленный поток. Чтобы применить в программе этих классов нужно подключить соответствующие заголовочные файлы.

Преимущества работы с файлами используя поток по сравнению с функциями ввода-вывода — контроль типов и работа с типами пользователя. Недостаток работы с использованием потока — это уменьшение быстродействия программы.

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

Работа с файлами заключается в выполнении следующих операций:

  1. открытие файла (для записи информации, добавления или чтения);
  2. запись информации в файл или считывание её с файла;
  3. закрытие файла.

При закрытии файл отсоединяется от потока.

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

Используя FILE, переменная типа указатель файла объявляется следующим образом:

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

Здесь *file_name — это имя файла, перед именем можно указать путь к файлу. Параметр *file_mode определяет режим открытия файла.

Если при выполнении операции открытия файла вышла ошибка, то fopen() вернет NULL, т.е. пустой указатель.

Файл закрывается с помощью функции fclose():

Здесь myfile указатель файла.

Cимвола с файла можно считать используя функцию fgetc():

fgetc() возвращает целочисленное значение. Символ находится в младшем разряде. В том случае, если чтение произошло без ошибок, то старший разряд равен нулю. При чтении признака конца файла функция fgetc() вернет значение EOF.

Символ в файл записывается с помощью функции fputc():

Здесь сh — записываемый символ. В файл записывается только младший разряд сh.

Для определения достигнут ли конец файла, необходимо использовать функцию feof():

При чтении признака конца файла feof() вернет true, а иначе — false.

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

Данные из файла можно считывать и записывать строками. Для этого используются функции fgets() и fputs():

Здесь параметр n — это длина строки, *mys — указатель на строку.

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

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

Для чтения и записи данных любых типов используются функции: fread() и fwrite():

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

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

Здесь offset — количество байтов, на которое нужно перенести указатель файла, начиная от позиции whence. Параметр whence может принимать значения SEEK_SET (начало файла), SEEK_CUR (текущая позиция файла), SEEK_END (конец файла).

Функцию fseek() можно использовать для того, чтобы перейти к нужному элементу файла внутри однотипных данных. Например, чтобы получить доступ к пятому элементу в файле, нужно использовать:

Здесь spisok — тип элементов.

Для определения значения указателя текущей позиции в файле нужно использовать функцию ftell():

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

Список литературы

  1. Вирт Н. Алгоритмы и структуры данных. – М.: Мир, 1989. – 406 с.
  2. Дубров Г.В. Основы программирования на С++. – М.: Конкорд, 1993. – 219 c.
  3. Подбельский В.В. Язык С++: Учебное пособие – 5 изд. – М: Финансы и статистика, 2004. – 560 c.
  4. Хусаинов, И.Г. Решение задач на ЭВМ. Структурное программирование / Стерлитамак: Стерлитамакский филиал БашГУ, 2014. 110 с.
  5. Шилдт Г. С++: базовый курс. 3-е издание. – М.: Издательский дом "Вильямс". 2010. – 624 с.

Цитировать

Функция fseek() устанавливает указатель положения в файле, связанном со stream, в соответ­ствии со значениями offset и origin. Ее основное назначение — поддерживать операции ввода/ вывода по произвольному адресу. Аргумент offset — это выраженный в байтах сдвиг от позиции, определяемой origin, до новой позиции. Аргумент origin может принимать значения 0, 1 или 2, причем 0 означает начало файла, 1 — текущую позицию, а 2 — конец файла. В stdio.h определе­ны следующие макросы для origin

Имя Позиция origin
SEEK_SET Начало файла
SEEK_CUR Текущая позиция
SEEK_END Конец файла

В случае успеха fseek() возвращает 0. Ненулевое значение означает неудачу. С помощью fseek() можно переместить указатель положения в любую точку внутри файла и даже за его пределы после конца файла. Однако попытка установить указатель перед началом файла будет восприня­та как ошибка.

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

Приведенная здесь функция отыскивает указанную структуру типа addr. Обратим внимание на то , что sizeof используется как для получения количества байт , на которое нужно сместиться , так и для обеспечения переносимости.
struct addr {
char name [ 40 ] ;
char street [ 40 ] ;
char city [ 40 ] ;
char state [ 3 ] ;
char zip [ 10 ] ;
} info ;
void find ( long client_num )
{
FILE * fp ;
if ( ( fp = fopen ( "mail" , "rb" ) ) == NULL ) {
printf ( "Cannot open file. \n " ) ;
exit ( 1 ) ;
}
/* получение правильной структуры */
fseek ( client_num * sizeof ( struct addr ) , 0 ) ;
/* чтение данных в память */
fread ( & info , sizeof ( struct addr ) , 1 , fp ) ;
fclose ( fp ) ;
}

Функция fopen() открывает для использования поток, связывает файл с данным потоком и затем возвращает указатель FILE на данный поток. Чаще всего файл рас­сматривается как дисковый файл. Функция fopen() имеет следующий прототип:

FILE *fopen(const char *имя_файла, const char *режим);

где режим указывает на строку, содержащую желаемый режим открытия файла. Допустимые зна­чения для режим в Borland С++ показаны в таблице. имя_файла должно быть строкой симво­лов, предоставляющей корректное имя файла операционной системе, и может содержать указа­ние пути.

Функция fopen() возвращает указатель базового типа FILE. Данный указатель идентифицирует файл и используется большинством функций файловой системы. Его никогда не следует изменять самостоятельно. Функция возвращает нулевой указатель, если файл не может быть открыт.

Как показывает таблица, файл может быть открыт или в текстовом, или в двоичном режи­ме. В текстовом режиме при вводе последовательность возврат каретки и перевод строки трансли­руется в символ новой строки. При выводе справедливо обратное: символ новой строки трансли­руется в возврат каретки и перевод строки. В двоичных файлах такого перевода не происходит. Когда в аргументе режима не указаны ни t, ни b, то статус файла текстовый/двоичный определя­ется значением глобальной переменной _fmode, определенной в Borland С++. По умолчанию fmode установлена в О_ТЕХТ, то есть устанавливается текстовый режим. Если установить _fmode в О_BINARY, то файлы будут открываться в двоичном режиме. (Эти макросы определены в fcntl.h.) Естественно, использование явно указанных t или b устраняет эффекты, связанные с переменной _fmode. Кроме этого, _fmode характерна только для продуктов Borland. Она не определена в системе ввода/вывода ANSI С.

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

fp = fopen ("test", "w") ;

где fp - это переменная типа FILE *. Тем не менее обычно можно увидеть следующее:

if((fp = fopen("test", "w"))==NULL) puts ("Cannot open file.");
exit (1);
>

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

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

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

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

Открывает файл для чтения. (Открывает по умолчанию как текстовый файл.)

Создает файл для записи. (Открывает по умолчанию как текстовый файл.)

Присоединяет к файлу. (Открывает по умолчанию как текстовый файл.)

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

Открывает двоичный файл для записи.

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

Открывает файл для чтения/записи. (Открывает по умолчанию как текстовый файл.)

Создает файл для чтения/записи. (Открывает по умолчанию как текстовый файл.)

Присоединяет или создает файл для чтения/записи. (Открывает по умолчанию как текстовый файл.)

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

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

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

Указатель на функцию (как передать?)
void abc(int a, int b) < >void func(void *f(int, int))

Решение

Доброго времени суток, джентмены.

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


Как передать указатель на функцию в функцию
И как с ней работать?

Как передать указатель на структуру в функцию
Подскажите как передать указатель *arr на структуру в функцию2, чтобы в ней использовать уже.


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

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

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

Описание функции
int __stdcall getValue(char *path, double *value)
Параметры:
char *path- указатель на имя файла
double *value – указатель на массив , в который функция запишет результаты анализа

Пытаюсь передать указатель, но не выходит


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

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

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

Добавлено через 1 минуту

Решение

Такое пробовал получаю ошибку:

не удается получить адрес определить размер или объявить указатель на управляемый тип (string)

Вывел в консоли содержимое

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

Указатель на константную строку и имя массива как указатель
Изучаю C. У меня есть указатель на константную строку, и я хочу его изменить путем передачи в.

Указатель на имя файла как аргумент функции. Как реализовать?
Доброго времени суток всем! Прошу помощи! Написал программу, есть пару моментов, сложных для меня. .


Выделять из имени каждого файла имя компьютера и имя учётной записи и записывать их в два файла соответственно
здравствуйте, подскажите. Есть например, 10 файлов (.txt) в названии которых написано имя.

Дана строка содержащая полное имя файла.Выделить из этой строки только имя файла без расширения
1.Дан символ С.Вывести его код (то есть номер в кодовой таблице) 2. Дан символ С.Вывести два.

Читайте также: