Не открывается файл ifstream c

Обновлено: 02.07.2024

Подробное чтение и запись файла C ++ (ofstream, ifstream, fstream)

Рассматривая идеи программирования на C ++, каждое упражнение в основном использует ofstream, ifstream, fstream. Раньше я примерно знал его использование и значение. Прочитав несколько постов Дэниела в блоге, я организовал и резюмировал:

Здесь в основном обсуждается содержание fstream:

1. Откройте файл

В классе fstream функция-член open () реализует операцию открытия файла, тем самым связывая поток данных с файлом и считывая и записывая файл через объекты fstream, ifstream, fstream.

  1. <span style= "font-family:Times New Roman;font-size:16px;" >
  2. public member function
  3. void open ( constchar * filename,
  4. ios_base::openmode mode = ios_base::in | ios_base::out );
  5. void open( constwchar_t *_Filename,
  6. ios_base::openmode mode= ios_base::in | ios_base::out,
  7. int prot = ios_base::_Openprot);
  8. </span>

Параметры: имя файла Имя файла операции

Режим открытия файла

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

Способ открытия файла определяется в классе ios (то есть базовом классе потокового ввода-вывода), есть несколько способов:

Эти методы могут использоваться в комбинации, в форме «или» операция («|»): например,

  1. ofstream out;
  2. out.open( "Hello.txt" , ios::in|ios::out|ios::binary) // Сделаем соответствующий выбор в соответствии с вашими потребностями

Атрибуты открытого файла также определены в классе ios:

Атрибуты файла также могут использоваться в сочетании с операциями «или» и «+», которые не будут здесь описаны.

Во многих программах вы можете встретить такое использование, как ofstream out ("Hello.txt"), ifstream in (". "), fstream foi (". "), и нет явного вызова open () Функция выполняет файловые операции и напрямую вызывает свой метод открытия по умолчанию. Поскольку функция open () вызывается в конструкторе класса потока и имеет тот же конструктор, вы можете напрямую использовать объект потока в файле здесь. Операция по умолчанию выглядит следующим образом:

  1. <span style= "font-family:Times New Roman;font-size:16px;" >
  2. ofstream out( ". " , ios::out);
  3. ifstream in( ". " , ios::in);
  4. fstream foi( ". " , ios::in|ios::out);
  5. </span>

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

2. Закройте файл

Когда операции чтения и записи файла завершены, мы должны закрыть файл, чтобы файл снова был доступен. Функция-член close (), которая отвечает за выгрузку данных в кеш и закрытие файла. После вызова этой функции исходный объект потока можно использовать для открытия других файлов, а другие процессы могут снова получить доступ к файлу. Чтобы не допустить уничтожения объекта потока и его обращения к открытому файлу, деструктор автоматически вызывает функцию close.

3. Чтение и запись текстовых файлов

Классы stream, ifstream и fstream являются производными от ostream, istream и iostream соответственно. Вот почему объекты fstream могут использовать члены своего родительского класса для доступа к данным.

В общем, мы будем использовать эти классы для взаимодействия с теми же функциями-членами (cin и cout), что и для консоли (console) для ввода и вывода. Как показано в следующем примере, мы используем перегруженный оператор вставки <<:

Чтение данных из файла также можно выполнить так же, как cin >>:

Приведенный выше пример читает содержимое текстового файла и выводит его на экран. Обратите внимание, что мы используем новую функцию-член с именем eof, которая наследуется ifstream от класса ios и возвращает true, когда достигнут конец файла.

Проверка государственных флагов

В дополнение к eof (), есть некоторые функции-члены, которые проверяют состояние потока (все возвращаемые значения, возвращаемые bool):

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

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

Если прочитанный файл достигает конца файла, верните true.

Это является наиболее распространенным: если вызов какой-либо из вышеперечисленных функций возвращает true, эта функция возвращает false

Для сброса флагов состояния, проверенных вышеупомянутыми функциями-членами, вы можете использовать функцию-член clear () без параметров.

Получите и поместите указатели потока (получите и поместите указатели потока)

Все объекты потока ввода / вывода (объекты потоков ввода / вывода) имеют по крайней мере один указатель потока:

  • ifstream, как и istream, имеет указатель, называемый get указатель, который указывает на следующий элемент для чтения.
  • ofstream, как и ostream, имеет указатель пут указатель, который указывает на место, где записан следующий элемент.
  • fstream, похожий на iostream, наследует как get, так и put

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

Эти две функции-члены не должны передавать параметры и возвращать значение типа pos_type (в соответствии со стандартом ANSI-C ++), которое представляет собой целое число, представляющее позицию текущего указателя потока get (с помощью tellg) или указателя потока put (с помощью tellp).

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

seekg ( pos_type position );
seekp ( pos_type position );

Используя этот прототип, указатель потока изменяется, чтобы указывать на абсолютную позицию, рассчитанную с начала файла. Обязательные типы параметров такие же, как те, которые возвращаются функциями Tellg и Tellp.

seekg ( off_type offset, seekdir direction );
seekp ( off_type offset, seekdir direction );

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

Значения указателей потока get и put рассчитываются по-разному для текстовых и двоичных файлов, поскольку некоторые специальные символы в файлах текстового режима могут быть изменены. По этой причине рекомендуется всегда использовать первые прототипы seekg и seekp для файлов, открытых в режиме текстовых файлов, и не изменять возвращаемое значение Tellg или Tellp. Для двоичных файлов вы можете использовать эти функции произвольно, и не должно быть неожиданного поведения.

В следующем примере эти функции используются для получения размера двоичного файла:

4. Двоичные файлы

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

Поток файлов включает в себя две функции-члена, специально предназначенные для последовательного чтения и записи данных: запись и чтение. Первая функция (запись) является функцией-членом ostream, которая наследуется от ofstream. И read является функцией-членом istream, унаследованной от ifstream. Объекты класса fstream имеют обе функции. Их прототип:

write ( char * buffer, streamsize size );
read ( char * buffer, streamsize size );

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

5. Буферы и синхронизация

Когда мы работаем с файловыми потоками, они связаны с буфером типа streambuf. Этот буфер (буфер) фактически является пространством памяти, как поток (поток) и носитель физического файла. Например, для выходного потока каждый раз, когда вызывается функция-член put (запись одного символа), этот символ не записывается напрямую в физический файл, соответствующий выходному потоку, но сначала вставляется в кэш потока ( буфер).

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

  • Когда файл закрыт:Перед закрытием файла все кэши, которые не были полностью записаны или прочитаны, будут синхронизированы.
  • Когда буфер кеша заполнен:Буферы имеют определенный предел пространства. Когда кеш заполнен, он будет автоматически синхронизирован.
  • Контрольный персонаж четко заявляет:Когда встречаются определенные управляющие символы в потоке, происходит синхронизация. Эти управляющие символы включают в себя: flush и endl.
  • Вызовите функцию sync () явно:Вызов функции-члена sync () (без параметров) может вызвать немедленную синхронизацию. Эта функция возвращает значение типа int, равное -1, указывающее, что поток не имеет кеша или операция не выполнена.

Интеллектуальная рекомендация

совместный запрос mysql с тремя таблицами (таблица сотрудников, таблица отделов, таблица зарплат)

1. Краткое изложение проблемы: (внизу есть инструкция по созданию таблицы, копирование можно непосредственно практиковать с помощью (mysql)) Найдите отделы, в которых есть хотя бы один сотрудник. Отоб.


[Загрузчик классов обучения JVM] Третий день пользовательского контента, связанного с загрузчиком классов


IP, сеанс и cookie

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

Наиболее частые операции следующее:

    1. Методы проверки открыт ли файл is_open() и достигнут ли конец файла eof()
      1. Настройка форматированного вывода для >> с помощью width() и precision()
      1. Операции позиционирования tellg(), tellp() и seekg(), seekp()

      Это не все возможности, которые предоставляет библиотека fstream. Рассматривать все сейчас мы не будем, поскольку их круг применения достаточно узок. Познакомимся с вышеперечисленными. Начнем с класса чтения.

      Класс ifstream

      Открытие файла в конструкторе выглядит так:

      ifstream file ( "d:\\1\\файл.txt" ) ; // открываем файл в конструкторе

      Так мы просим открыть файл txt с именем файл.txt, который лежит в папке с названием 1, а папка находится на диске d.

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

      Так все отработает нормально и файл откроется:

      библиотека fstream, работа с файлами в с++, программирование для начинающих

      Второй вариант проверки с использованием метода is_open() :

      Метод is_open() вернет 1, если файл найден и успешно открыт. Иначе вернет 0 и сработает код прописанный в блоке else .

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

      Оператор считывания >>

      Так же как и в iostream считывание можно организовать оператором >> , который указывает в какую переменную будет произведено считывание:

      Считает вещественное, целое и строку. Считывание строки закончится, если появится пробел или конец строки. Стоит отметить, что оператор >> применяется к текстовым файлам. Считывание из бинарного файла производить лучше всего с помощью метода read().

      Кстати этот оператор достаточно удобен, если стоит задача разделить файл на слова:

      Методы getline() и get()

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

      Если же читать нужно в массив символов char[], то либо get() либо getline() именно как методы:

      Принцип в общем тот же, что и в аналогах из iostream: Указывается в параметрах буфер (переменная, куда будет производиться чтение), или точнее указатель на блок памяти (если переменная объявлена статически: char buffer[255] к примеру, то пишется в параметры &buffer), указывается максимальное количество считываемого (в примере это n), дабы не произошло переполнение и выход за пределы буфера и по необходимости символ-разделитель, до которого будет считка (в примере это пробел). Надеюсь я не больно наступлю на хобот фанатикам Си, если сажу что эти две функции на 99% взаимозаменяемы, и на 95% могут быть заменены методом read() .

      Метод read()

      Похож на предыдущий пример?

      Метод close()

      Метод eof()

      Проверяет не достигнут ли конец файла. Т.е. можно ли из него продолжать чтение. Выше пример с считкой слов оператором >> как раз использует такую проверку.

      Метод seekg()

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

      Репутация: 1
      Всего: 1

      Здаравствуте.
      Смешно такое спрашывать. Но у меня почему то не считывается файл.
      В книгах смотрел, видео урок смотрел, делаю все так как там, а мне вот.
      Програмка на 10 строчек, и не работает, - выводит не содержымое файла, а одно и то же число..
      В чем туплю? Спасибо..

      using namespace std;

      Репутация: 52
      Всего: 211

      Репутация: 1
      Всего: 1

      Файл в той же директории - проверял дважды. :(
      IDE CodeBlocks.

      А почему директория то мняется? :(

      Запускал и на Windows 7 64bit(сначало думал, что проблема в разрядности - оказывается - нет) и на 32bit.

      а как вывести то.
      GetCurrentDirectory.

      Репутация: 52
      Всего: 211

      в той это в которой? я же говорю, твой файл находится в папке debug/release, а IDE меняет текущую директорию на директорию проекта (кажется, не помню точно, то ли проекта, то ли солюшена, но это в студии, как там в CodeBlocks не знаю).

      Репутация: 1
      Всего: 1

      Я при создании проекта ставил флажок только Debug, Release не отмечал.

      using namespace std;

      Репутация: 52
      Всего: 211

      ты не понял о чем я.. в общем поставь абсолютный путь.

      Репутация: 1
      Всего: 1

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

      Цитата

      ты не понял о чем я.. в общем поставь абсолютный путь.

      и теперь тоже не понял.. не пинайте сильно.. :(
      Я при создании проекта и всех файлов указывал путь где они будут сохранятся..

      Может вы это имеете введу - "Свойства проекта"

      Присоединённый файл


      Присоединённый файл ( Кол-во скачиваний: 5 )
      Untitled_1.jpg 71,44 Kb

      Репутация: 52
      Всего: 211

      Репутация: 1
      Всего: 1

      Вот что в итоге выводит на экран.

      Присоединённый файл

      Присоединённый файл ( Кол-во скачиваний: 6 )
      Untitled_1.jpg 42,63 Kb

      Репутация: 52
      Всего: 211

      Репутация: 1
      Всего: 1


      Присоединённый файл ( Кол-во скачиваний: 2 )
      Praktikum1.rar 432,62 Kb

      Репутация: 52
      Всего: 211

      ты находящиеся в файле данные

      Добавлено через 2 минуты и 32 секунды

      using namespace std;

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

      Репутация: 1
      Всего: 1

      вот я затупил. - спасибо огромное, думаю вопрос решен!

      Запрещается!

      1. Публиковать ссылки на вскрытые компоненты

      2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

      • Действия модераторов можно обсудить здесь
      • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
      • Вопросы по реализации алгоритмов рассматриваются здесь
      • FAQ раздела лежит здесь!

      Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

      [ Время генерации скрипта: 0.1301 ] [ Использовано запросов: 21 ] [ GZIP включён ]

      БлогNot. Лекции по C/C++: работа с файлами (fstream)

      Лекции по C/C++: работа с файлами (fstream)

      Механизм ввода-вывода, разработанный для обычного языка С, не соответствует общепринятому сегодня стилю объектно-ориентированного программирования, кроме того, он активно использует операции с указателями, считающиеся потенциально небезопасными в современных защищённых средах выполнения кода. Альтернативой при разработке прикладных приложений является механизм стандартных классов ввода-вывода, предоставляемый стандартом языка C++.

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

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

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

      Ниже приведены возможные значения флагов и их назначение.

      Режим Назначение
      in Открыть для ввода (выбирается по умолчанию для ifstream)
      out Открыть для вывода (выбирается по умолчанию для ofstream)
      binary Открыть файл в бинарном виде
      aрр Присоединять данные; запись в конец файла
      ate Установить файловый указатель на конец файла
      trunc Уничтожить содержимое, если файл существует (выбирается по умолчанию, если флаг out указан, а флаги ate и арр — нет)

      Например, чтобы открыть файл с именем test.txt для чтения данных в бинарном виде, следует написать:

      Оператор логического ИЛИ ( | ) позволяет составить режим с любым сочетанием флагов. Так, чтобы, открывая файл по записи, случайно не затереть существующий файл с тем же именем, надо использовать следующую форму:

      Предполагается, что к проекту подключён соответствующий заголовочный файл:

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

      Операторы включения и извлечения

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

      Можно также записывать текстовую строку по частям:

      Оператор endl завершает ввод строки символом "возврат каретки":

      С помощью оператора включения несложно записывать в файл значения переменных или элементов массива:

      В результате выполнения кода образуется три строки текстового файла Temp.txt :

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

      Оператор извлечения ( >> )производит обратные действия. Казалось бы, чтобы извлечь символы из файла Temp.txt , записанного ранее, нужно написать код наподобие следующего:

      Однако оператор извлечения остановится на первом попавшемся разделителе (символе пробела, табуляции или новой строки). Таким образом, при разборе предложения "Текстовый массив содержит переменные" только слово "Текстовый" запишется в массив buff , пробел игнорируется, а слово "массив" станет значением целой переменной vx и исполнение кода "пойдет вразнос" с неминуемым нарушением структуры данных. Далее, при обсуждении класса ifstream , будет показано, как правильно организовать чтение файла из предыдущего примера.

      Класс ifstream: чтение файлов

      Как следует из расшифровки названия, класс ifstream предназначен для ввода файлового потока. Далее перечислены основные методы класса. Большая часть из них унаследована от класса istream и перегружена с расширением родительской функциональности. К примеру, функция get , в зависимости от параметра вызова, способна считывать не только одиночный символ, но и символьный блок.

      Метод Описание
      open Открывает файл для чтения
      get Читает один или более символов из файла
      getline Читает символьную строку из текстового файла или данные из бинарного файла до определенного ограничителя
      read Считывает заданное число байт из файла в память
      eof Возвращает ненулевое значение (true), когда указатель потока достигает конца файла
      peek Выдает очередной символ потока, но не выбирает его
      seekg Перемещает указатель позиционирования файла в заданное положение
      tellg Возвращает текущее значение указателя позиционирования файла
      close Закрывает файл

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

      Метод getline прочитает первую строку файла до конца, а оператор >> присвоит значения переменным.

      Следующий пример показывает добавление данных в текстовый файл с последующим чтением всего файла. Цикл while (1) используется вместо while(!file2.eof()) по причинам, которые обсуждались в предыдущей лекции.

      Этот код под ОС Windows также зависит от наличия в последней строке файла символа перевода строки, надежнее было бы сделать так:

      Явные вызовы методов open и close не обязательны. Действительно, вызов конструктора с аргументом позволяет сразу же, в момент создания поточного объекта file , открыть файл:

      Вместо метода close можно использовать оператор delete , который автоматически вызовет деструктор объекта file и закроет файл. Код цикла while обеспечивает надлежащую проверку признака конца файла.

      Класс ofstream: запись файлов

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

      Метод Описание
      open Открывает файл для записи
      put Записывает одиночный символ в файл
      write Записывает заданное число байт из памяти в файл
      seekp Перемещает указатель позиционирования в указанное положение
      tellp Возвращает текущее значение указателя позиционирования файла
      close Закрывает файл

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

      Бинарные файлы

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

      Первый параметр методов write и read (адрес блока записи/чтения) должен иметь тип символьного указателя char * , поэтому необходимо произвести явное преобразование типа адреса структуры void * . Второй параметр указывает, что бинарные блоки файла имеют постоянный размер байтов независимо от фактической длины записи. Следующее приложение дает пример создания и отображения данных простейшей записной книжки. Затем записи файла последовательно считываются и отображаются на консоли.

      P.S. При выполнении этого и других листингов в Visual Studio последних версий может дополнительно понадобиться подключение директивы _CRT_SECURE_NO_WARNINGS.

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

      Класс fstream: произвольный доступ к файлу

      Предположим что в нашей записной книжке накопилось 100 записей, а мы хотим считать 50-ю. Конечно, можно организовать цикл и прочитать все записи с первой по заданную. Очевидно, что более целенаправленное решение - установить указатель позиционирования файла pos прямо на запись 50 и считать ее:

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

      Если не указать флаг ios::ate (или ios::app ), то при открытии бинарного файла Notebook.dat его предыдущее содержимое будет стерто!

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

      Наконец, можно открыть файл одновременно для чтения/записи, используя методы, унаследованные поточным классом fstream от своих предшественников. Поскольку класс fstream произведен от istream и ostream (родителей ifstream и ofstream соответственно), все упомянутые ранее методы становятся доступными в приложении.

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