Не удается открыть файл включение fstream h

Обновлено: 06.07.2024

В C++ файл открывается путем стыковки его с потоком. Имеется три типа потоков: ввода, вывода и ввода/вывода. Для открытия потока ввода необходимо объявить поток как объект класса ifstream. Для открытия потока вывода необходимо объявить его как объект класса ofstream. Потоки, кото­рые выполняют как ввод, так и вывод, должны быть объявлены как объекты класса fstream. На­пример, следующий фрагмент программы создает один поток ввода, один поток вывода и один поток, способный выполнять как ввод, так и вывод:

ifstream in; // ввод

ofstream out; // вывод

fstream both; // ввод и вывод

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

void open(const char "filename, int mode, int access=filebuf::openprot);

Здесь filename является именем файла и может включать указание пути. Величина mode определя­ет, каким способом открывается файл. Mode может принимать одно или более из следующих значений, (определенных в заголовочном файле fstream.h):

Можно комбинировать два и более из этих значений, используя побитовое ИЛИ.

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

ios::in задает возможность ввода из файла. ios::out указывает, что файл предназначен для выво­да. Однако создание потока с использованием ifstream задает режим ввода, а создание потока с использованием ofstream задает режим вывода, и в этих случаях нет необходимости задавать ука­занные выше величины.

ios::nocreate задает такой режим, при котором функция open() может открыть только существу­ющий файл. ios::noreplace не позволяет открыть файл функции ореn(), если файл уже существует, но не указаны атрибуты ios::ate или ios::app.

ios::trunc обусловливает уничтожение содержимого файла с заданным именем и усечение дли­ны файла до нуля.

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

Величина access определяет, каким образом осуществляется доступ к файлу. Значения атрибута файлов определяются следующим образом:

Атрибут Значение
0 Нормальный файл, отрытый доступ
1 Файл только для чтения
2 Скрытый файл
4 Системный файл
8 Архивный файл

С помощью операций побитового ИЛИ можно задать одновременно несколько атрибутов. Обычно эти атрибуты оставляются по умолчанию, что соответствует filebuf::openprot и соответ­ствует нормальному файлу.

В следующем фрагменте открывается нормальный файл для вывода:

ofstream out;
out.open ( "test", ios::out, 0);

Тем не менее, практически никогда не бывает подобного вызова функции ореn(), поскольку оба параметра имеют значения по умолчанию: для ifstream значением по умолчанию mode служит ios::in; а для ofstream значение по умолчанию равно ios::out. Параметр доступа access по умолча­нию соответствует нормальному файлу, как это уже отмечалось выше. Поэтому предыдущая инст­рукция будет выглядеть следующим образом:

out.open("test"); // значения по умолчанию для вывода и нормального файла

Для того, чтобы открыть поток одновременно для ввода и вывода, необходимо задать обе вели­чины ios::in и ios::out для режима mode, как показано в следующем примере:

fstream mystream;
mystream.open("test", ios::in | ios::out);

Если функции open() не удается открыть поток, то поток остается равным NULL.

Хотя открытие файла с использованием функции ореn() является вполне допустимым, в боль­шинстве случаев так не делается, потому что классы ifstream, ofstream и fstream содержат конст­рукторы, автоматически открывающие файл. Конструкторы имеют те же параметры и значения по умолчанию, что и функция ореn(). Поэтому наиболее типичный способ открытия файла вы­глядит следующим образом:

ifstream mystream("myfile"); // открытие файла для чтения

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

ifstream mystream("myfile"); // открытие файла для чтения
if (!mystream) cout << "Cannot open file.\n"; // обработка ошибки
>

Для того, чтобы закрыть файл, следует использовать функцию-член close(). Например, чтобы закрыть файл, пристыкованный к потоку mystream, используется следующая инструкция:

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

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

В fstream.h описан класс basic_fstream, пробовала заменить, результат тот же! Подскажите, что делать??

Привожу часть программы:

void CALLBACK display(void)
<
long t0 = GetTickCount();
fstream f;
f.open("file.txt",ios::out);

for (int a=0; a<10; ++a)
<
long t0 = GetTickCount();
for(int i =0; i < 100; ++i)

glRotatef(330.0, 1, 0., 0.);

glScalef (0.5, 0.5, 0.5);

gluNurbsSurface(theNurb,
8, knots,
8, knots,
4 * 3,
3,
&ctlpoints[0][0][0],
4, 4,
GL_MAP2_VERTEX_3);

>
long t1 = GetTickCount();

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

Это пишется без .h

Добавлено через 22 секунды
Компилятор какой?

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

Цитата

fatal error C1083: Не удается открыть файл include: fstream: No such file or directory

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


О как. Посмотри есть ли этот файл в c:/programm files/microsoft<дальше не помню>/vc/include. Кароче, поищи каталог include в папке куда установила VC. Так как я никогда не пользовался экспресс версиями.

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

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

А насчет fstream в include - он там есть. не понимаю в чем проблема((((

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

Посмотри в настройках IDE должны быть определены пути инклудов. В полной английской версии это Tools/Options -> Projects and Solutions -> VC++ Directories. В категории Include files нужно добавить путь до каталога с iostream, fstream etc., если, конечно, его там нет.

user posted image

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

запуталась(( что делать.

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

Постарайся приводить код в теге code, а не цитата, а то не читается.

fstream f; замени на ofstream f;

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

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

user posted image

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

Если удалить из папки эти заголовки, он ругается на необъявленный идентификатор!!
Если удалить неопознанные файлы, ругается на отсутствие их..

исправила, не помогло(

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

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

бррр. какие неопознаные? верни всё как было. В SDK нет ошибок.

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

user posted image

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

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

P.s. Это не код, пишу цитатой.. =)

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

Может, что углядишь. Это 100% работает

Добавлено через 1 минуту и 6 секунд
кстати, про пространство имён std не забыла?

user posted image

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

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

в твоём файле нет.

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

Я, кстати, тоже не вижу объявления o_O

user posted image

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

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

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

Добавлено через 1 минуту и 52 секунды
Сейчас все падает =((((

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

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

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

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

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

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

Некоторые вещи, которые вы должны проверить:

Проверьте папку include в вашей версии VS (в " C:\Program Files\Microsoft Visual Studio xx.x\VC\include " проверьте файл, который вы включаете, iostream , убедитесь, что он там).

Проверьте свои проекты Включить каталоги в <Project Name> > Properties > Configuration Properties > VC++ Directories > Include Directories - (это должно выглядеть так: $(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSdkDir)include;$(FrameworkSDKDir)\include; )

Убедитесь, что вы выбрали правильный проект для этого кода ( File > New > Project > Visual C++ > Win32 Console Application )

Убедитесь, что в ваших кодовых файлах нет <iostream.h> , VS не поддерживает это (в том же проекте, проверьте ваши другие файлы кода,.cpp и .h файлы для <iostream.h> и удалите его).

Убедитесь, что у вас не более одной функции main() в вашем файлы проекта кода (в том же проекте, проверьте свои другие файлы кода, файлы .cpp и .h для функции main() и удалите его или замените другим именем).

Некоторые вещи, с которыми вы могли бы попытаться построить:

  • Исключить using namespace std; из вашей функции main() и поместить ее после включения директивы.
  • Используйте std::cout без using namespace std; .

Выше работали для меня. Ниже не было:

Это также не удалось:

Возможно, ваш компилятор и ресурсы, установленные вокруг него, были как-то неполными. Я рекомендую повторно установить ваш компилятор: он должен работать после этого.

У меня возникла эта ошибка, когда я создал консольное приложение "Пустое" в Visual Studio 2015. Я заново создал приложение, оставив флажок "Пусто", он добавил все необходимые библиотеки.

Это сделало это для меня.

Вот проект консоли С++ win32!

Теперь идет проект консоли С++ CLR!

другие вещи, которые вы узнаете из отладки, чтобы добавить для предотвращения ошибок

Блог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 соответственно), все упомянутые ранее методы становятся доступными в приложении.

Детали системы:
Windows 10
Visual Studio Community 2017 v.15.2 (26430.6)
— Установленная разработка рабочего стола с C ++ (Снимок экрана: Список установки )

Шаг 1: Я написал знаменитую программу Hello World на C ++.

Шаг 2: Я нажал на Построить> Построить решение.

Проблема: ‘Stdio.h’: Данный файл или каталог отсутствует. Полная ошибка:

Детали по устранению неполадок / Вещи, которые я пробовал:

  1. Свойства конфигурации> Каталоги VC ++
    Include Directories $(VC_IncludePath);$(WindowsSDK_IncludePath);
  2. Снимок экрана: Solution Explorer (файлы в проекте)

Код в stdafx.cpp файл:

Код в stdafx.h файл:

Решение

Возникла та же проблема с переносом проекта с VS2013 на VS2017,
Исправлено: измените «Свойства-> Общие-> Версия Windows SDK» на 10

Другие решения

Столкнулся с проблемой пропавших без вести stdlib.h а также stdio.h (а может и больше) после установки VS2017 Community на новый компьютер и переноса решения с VS2013 на VS2017.

Сейчас мои проекты строятся без проблем.

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

Есть три способа решить эту проблему.

Переустановите Visual Studio
Это также сработало для меня, потому что я понял, что, возможно, что-то не так с моим Windows SDK. Я использовал Windows 10, но с Windows SDK 8.1. У вас может быть и эта проблема.
шаги: Откройте установщик Visual Studio> щелкните трехстрочную строку меню> Удалить> Перезагрузите компьютер> Откройте установщик Visual Studio> Установите то, что вам нужно, но убедитесь, что вы устанавливаете только последнюю версию Windows SDK 10, а не несколько или 8.1.

У меня была похожая проблема после обновления моего VS2017. Проект построен хорошо; но много «ошибок», когда код был поднят в редакторе. Даже попробовал переустановить VS. Я смог решить эту проблему, установив для параметра «Игнорировать стандартные пути включения» значение «Да». Попытка построить решение с большим количеством ошибок. Вернулся и установил опцию на Нет. После восстановления моя проблема ушла.

Если вы не хотите использовать Windows SDK для Windows 10 (например, вы можете работать над проектом с открытым исходным кодом, решение которого не принимается вами), вы можете решить эту проблему в проекте Windows SDK 8.1 с помощью навигационный Tools -> Get Tools and Features. -> Individual Compontents tab и установка отдельных компонентов «Windows 8.1 SDK» (в составе SDK, библиотек и сред) и «Windows Universal CRT SDK» (в разделе «Компиляторы», средства сборки и среды выполнения):

У меня была такая же проблема при создании VS 2013 Project с помощью Visual Studio 2017 IDE.
Решением было установить правильный «Platformtoolset v120 (Visual Studio 2013)». Для этого должен быть установлен Windows SDK 8.1.
Если вы хотите использовать Platformtoolset v141 (Visual Studio 2017), необходимо установить Windows SDK 10.
Platformtoolset может быть выбран в диалоге свойств проекта: General -> Platformtoolset

526 просмотра

1 ответ

103 Репутация автора


Я пытаюсь использовать графическую библиотеку (SFML) для C ++, и у меня возникли проблемы. Я использую Visual Studio 2017. Я посмотрел много уроков на Youtube и получаю ту же ошибку с каждым, что пытаюсь. Я не могу найти решение, так как люди говорят «папки должны быть вместе», что я уже сделал: Вот ошибки, которые я получаю:

E1696 не может открыть исходный файл "stdafx.h" c: Users George source repos Game Game main.cpp 1

E1696 не может открыть исходный файл "SFML / Graphics.hpp" c: Users George source repos Game Game main.cpp 2

Код, который я запускаю (скопированный, с дополнительным):

Раньше в коде не было stdafx.h или std пространства имен, поэтому мне пришлось добавить их, потому что у меня были другие ошибки. Я был бы очень признателен за любую помощь. Спасибо

Ответы (1)

103 Репутация автора

Разобрался несколько дней назад, но забыл опубликовать, как я это исправил. Я скачал 32-битную версию SFML. В свойствах необходимо убедиться, что в нем написано: «Active (win32)» или что-то в этом роде. У меня был мой на "x64", поэтому он не работал. Надеюсь, что это помогло кому-то еще с той же проблемой 🙂


Я пытаюсь использовать графическую библиотеку (SFML) для C ++, и у меня возникли проблемы. Я использую Visual Studio 2017 Я наблюдал много учебников Youtube, и получить ту же ошибку с каждым я стараюсь. Я не могу найти решение, как люди говорят «папки должны быть вместе» , которые я уже сделал: Вот ошибки я получаю:

E1696 не может открыть исходный файл stdafx.h C: Users George источник Repos Game Game main.cpp 1

E0065 ожидается «;» C: Users George источник Repos Game Game main.cpp 5

E1696 исходный файл не может открыть SFML / Graphics.hpp C: Users George источник Repos Game Game main.cpp 2

Код я бег (скопировано с дополнительным):

Перед тем, код не имеют stdafx.h или патезрасе, так что я должен был добавить их, потому что у меня были другие ошибки. Я бы очень признателен за любую помощь. благодаря

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