Stdio h c как подключить visual studio
БлогNot. Лекции по C/C++: работа с файлами (stdio.h)
Лекции по C/C++: работа с файлами (stdio.h)
В лекции рассмотрен классический способ работы с файлами в C/C++, основанный на библиотеке stdio.h (она же cstdio ) и доступе к данным через структуру FILE . Альтернативный современный механизм работы с файлами в языке C++ на основе потоков и библиотек <fstream> , <ifstream> , <ofstream> будет изучен в следующей лекции.
Базовые функции для работы с файлами описаны в библиотеке stdio.h . Вся работа с файлом выполняется через файловую переменную - указатель на структуру типа FILE , определённую в стандартной библиотеке:
Открыть файл можно функцией fopen , имеющей 2 параметра:
Параметр имя_файла может содержать относительный или абсолютный путь к открываемому файлу:
1) "data.txt" - открывается файл data.txt из текущей папки
Важно: при запуске exe-файла "текущая папка" – та, где он находится; при отладке в IDE папка может быть иной, например, в Visual Studio при открытом консольном решении с именем Console файл следует разместить в папке Console/Console , а при запуске исполняемого файла не из IDE – в папке Console/Debug .
2) "f:\\my.dat" - открывается файл my.dat из головной папки диска f:
3) имя файла запрашивается у пользователя:
Параметр режим_доступа определяет, какие действия будут разрешены с открываемым файлом, примеры его возможных значений:
1) "rt" - открываем для чтения текстовый файл;
2) "r+b" - открываем для произвольного доступа (чтение и запись) бинарный файл;
3) "at" – открываем текстовый файл для добавления данных в конец файла;
4) "w" - открываем файл для записи без указания того, текстовый он или бинарный.
Фактически, указание "r" или "t" не накладывает каких-либо ограничений на методы, которые мы будем применять для чтения или записи данных.
После открытия файла следует обязательно проверить, удалась ли эта операция. Для этого есть 2 основных подхода:
1) стандартный обработчик ferror (см. пособиe, п.8.7);
2) сравнить указатель, который вернула fopen , с константой NULL ( nullptr ) из стандартной библиотеки:
Пример. Приложение проверяет, удалось ли открыть файл из текущей папки, имя файла запрашивается у пользователя (Visual Studio)
Важно! Функции, возвращающие указатель, в том числе, fopen , считаются небезопасными в ряде новых компиляторов, например, Visual Studio 2015. Если их использование приводит не просто к предупреждению, а к генерации ошибок, есть 2 основных способа решения проблемы:
1) в соответствии с рекомендациями компилятора, заменить старые названия функций на их безопасные версии, например, strcpy на strcpy_s и fopen на fopen_s . При этом может измениться и способ вызова функций, например,
Если используется предкомпиляция, то можно определить этот макрос в заголовочном файле stdafx.h .
Выбор способа чтения или записи данных зависит от того, какой должна быть структура файла.
- fscanf - для чтения
- fprintf - для записи
Первым параметром этих функций указывается файловая переменная, в остальном работа совпадает со стандартными scanf и printf .
Пример. Файл text.txt в текущей папке приложения имеет следующий вид:
Прочитаем его как последовательность вещественных чисел.
1. Функции семейства scanf возвращают целое число - количество значений, которые успешно прочитаны в соответствии с указанным форматом. В реальных приложениях эту величину следует проверять в коде:
2. На "восприятие" программой данных может влиять установленная в приложении локаль. Например, если до показанного кода выполнен оператор результат работы кода может измениться (для русской локали разделителем целой и дробной части числа является запятая, а не точка).
3. Очередное чтение данных изменяет внутренний файловый указатель. Этот указатель в любой момент времени, пока файл открыт, показывает на следующее значение, которое будет прочитано. Благодаря этому наш код с "бесконечным" while не зациклился.
4. Код показывает, как читать из файла заранее неизвестное количество значений – это позволяет сделать стандартная функция feof (проверка, достигнут ли конец файла; вернёт не 0, если прочитано всё).
5. Распространённый в примерах из Сети код вида
в ряде компиляторов может породить неточности при интерпретации данных. Например, этот код может прочитать как последнее значение завершающий перевод строки в файле, благодаря чему последнее прочитанное значение "удвоится".
В качестве примера форматной записи в файл сохраним массив a из 10 целочисленных значений в файле с именем result.txt по 5 элементов в строке:
Важно! Ввод/вывод функциями библиотеки stdio.h буферизован, то есть, данные "пропускаются" через область памяти заданного размера, обмен данными происходит не отдельными байтами, а "порциями". Поэтому перед чтением данных желательно очищать буфер от возможных "остатков" предыдущего чтения методом fflush , а после записи данных следует обязательно закрывать файл методом fclose , иначе данные могут быть потеряны. Заметим, что консольный ввод/вывод "обычными" методами scanf и printf также буферизован.
- fgetc и fputc - для посимвольного чтения и посимвольной записи данных;
- fgets и fputs - для чтения и записи строк с указанным максимальным размером.
Как и в случае с функциями для чтения форматированных данных, у всех этих методов имеются аналоги для работы со стандартным вводом/выводом.
Пример. Читая файл, определить длину каждой строки в символах. Для решения задачи воспользуемся тем фактом, что строки завершаются символом "перевод строки" ( '\n' ). Предполагается, что файл уже открыт для чтения.
Важно! Из-за особенностей реализации fgetc , без последней проверки за телом цикла код мог "не обратить внимания", например, на последнюю строку файла, состоящую только из пробелов и не завершающуюся переводом строки.
Пример. Читаем построчно файл с известной максимальной длиной строки. Предполагается, что файл уже открыт для чтения.
Важно! Без дополнительной обработки прочитанные из файла строки при выводе будут содержать лишние пустые строки между строками данных. Это происходит потому, что функция fgets читает строку файла вместе с символом перевода строки (точней, под Windows - с парой символов \r\n , интерпретируемых как один), а puts добавляет к выводимой строке ещё один перевод строки.
- void *buffer - нетипизированный указатель на место хранения данных;
- size_t (unsigned) size - размер элемента данных в байтах.
- size_t count - максимальное количество элементов, которые требуется прочитать (записать);
- FILE *stream - указатель на структуру FILE
Пример. Целочисленный массив a запишем в двоичный файл.
Учитывая, что данные массива хранятся в последовательно идущих адресах памяти, цикл for для записи мы могли заменить одним оператором:
Подход к чтению данных с помощью fread аналогичен. Например, если файл уже открыт для чтения в режиме "rb":
- функции fgetpos и ftell позволяют выполнить чтение текущей позиции указателя в файле;
- функции fseek и fsetpos позволяют осуществить переход к нужной позиции в файле.
Пример. Определить размер файла в байтах, предположим, что файл уже открыт в режиме чтения или произвольного доступа.
Материал для чтения из пособия: пп. 8.6-8.11. Обратите внимание на таблицы с описанными прототипами функций ввода/вывода.
Рекомендуемые задачи: базовое задание включает две задачи, первая из которых предполагает обработку файла как текстовых данных, вторая – как бинарных. В качестве дополнительной третьей задачи может быть предложена реализация одной из задач 1, 2, содержащая консольный интерфейс и меню.
Я пытаюсь создать решение в Visual Studio Community 2017, но я продолжаю получать ошибку"не удается открыть файл include: 'stdio.h' ". Я прочитал несколько подобных вопросов, но все еще не могу решить эту проблему. Похоже на С stdio.h файл вызывается в stdafx.h. Ниже приведены более подробные сведения. Есть предложения? (Я еще не могу вставлять изображения, поэтому, пожалуйста, нажмите на ссылки для скриншотов.)
: 'С stdio.h': нет такого файла или каталога. Полная Ошибка:
детали устранения неполадок / вещи, которые я пробовал:
- свойства конфигурации > каталоги VC++
Include Directories $(VC_IncludePath);$(WindowsSDK_IncludePath); - скриншот: Обозреватель решений (файлы в проекте)
код stdafx.cpp:
код stdafx.h:
столкнулся с проблемой отсутствует stdlib.h и stdio.h (и, возможно, больше) после установки сообщества VS2017 на новый компьютер и переноса решения с VS2013 на VS2017.
теперь мои проекты строят без проблемы.
обратите внимание,что вам может потребоваться сделать проект стартовым проектом для переориентации.
существует три способа решить эту проблему.
Переустановите Visual Studio
Это также сработало для меня, потому что я понял, что, возможно, что-то не так с моим Windows SDK. Я использовал Windows 10, но с Windows SDK 8.1. Вы можете иметь эту проблему.
действия: открыть установщик Visual Studio > нажмите на трехстрочную строку меню > Удалить > перезагрузить компьютер > открыть установщик Visual Studio > Установите то, что вы хотите, но убедитесь, что вы устанавливаете только последнюю версию Windows SDK 10, а не несколько или 8.1.
на случай, если вы не хотите поднимать 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" (под Comiplers, инструментами сборки и временем выполнения):
У меня была аналогичная проблема после обновления моего VS2017. Проект построен хорошо, но много ошибок, когда код был воспитан в Редакторе. Даже попытался переустановить VS. Я смог решить его, установив параметр "игнорировать стандартные пути включения" в Yes. Попытка построить решение с большим количеством ошибок. Вернулся и установил параметр нет. После восстановления моя проблема исчезла.
У меня была та же проблема с созданием проекта VS 2013 с Visual Studio 2017 IDE. Решением было установить правильный " Platformtoolset v120 (Visual Studio 2013). Для этого должен быть установлен Windows SDK 8.1. Если вы хотите использовать Platformtoolset v141 (Visual Studio 2017), должен быть Windows SDK 10. Platformtoolset можно выбрать в диалоговом окне свойств проекта: общие - > Platformtoolset
Д ля начала, необходимо установить программное обеспечение. В принципе не важно, каким ПО вы будете пользоваться, также как не важна и операционная система. Но в течение всего курса я буду приводить примеры на MS Visula Studio 2012 Express Edition. Visual Studio 2012 Express Edition бесплатный и его за глаза хватит для изучения всего курса. Кроме того, как показала практика, он гораздо строже относится к коду и даёт более полноценное описание ошибок и предупреждений. При изучении языка можно использовать Borland (он же CodeGEAR, он же Embarcadero и т.д.), Dev Cpp, MinGW, или gcc, или что вы ещё захотите.
Пример для MS Visual Studio
1. Открываем IDE, заходим Файл | Создать проект.
2. Выбираем консольное приложение и даём ему имя. В данном случае first_program
4. Ставим галочку "Пустой проект".
5. После чего получаем пустую структуру проекта. Добавим новый элемент: правый клик мыши по папке
"Файлы исходного кода" | Добавить | Создать элемент.
Добавляем новый cpp файл, но сохраняем его с расширением .c
Я назвал файл main.c Всё, готово, можно писать программу. Пропустите шаги для других платформ.
Borland
У меня установлен только Code Gear C++Builder 2007, но в остальных (и предыдущих) релизах всё делается также.
1. Создадим новый проект File | New | Other.
2. Добавляем консольное приложение
3. Выбираем язык си
4. Получаем готовый проект. Его необходимо сохранить с тем именем, которое захотите. До тех пор сам проект и все файлы будут иметь имена по умолчанию. Вы можете удалить то, что Borland по умолчанию прописал в тексте программы.
Пример для cc/gcc для терминала
О ткройте ваш любимый текстовый редактор и скопируйте туда код программы.
Если вы сохранили программу в файле с именем hello.c, то наберите в терминале команду
cc hello.c -o hello
либо
gcc hello -o hello
При этом, очевидно, вы должны находиться в папке с программой. gcc создаст исполняемый файл с именем hello. Запустите его, и он выведет Hello, World!
./hello
Иногда могут возникнуть проблемы с правами доступа. Проверьте, что у вас исполняемый файл, иначе дайте себе привелегии на запуск.
chmod 760 hello
Если у вас несколько файлов, то необходимо будет перечислить имена всех си файлов по порядку. Например, если у вас есть ещё два файла simple.h и simple.c, то нужно прописать
cc hello.c simple.c -o hello
Код программы
Принято в первой программе выводить Hello, World! на экран.
Запустите программу ( Run | Run или F9 для борланда, Построение | Построить решение или F5 для MS) Программа выведет Hello, World! и будет ждать, когда вы нажмёте на любую клавишу.
Рассмотрим код подробнее. Первые две строки
директивы компилятору на подключение стандартных библиотек stdio (Standard Input Output - стандартная библиотека ввода вывода) и conio (Console Input Output - стандартная библиотека консоли вывода вывода). Расширение .h указывает, что это заголовочные файлы (header files). Компилятор копирует код библиотек conio и stdio, и даёт возможность использовать функции, описанные в этих библиотеках.
Это функция main. Она отличается от остальных функций, которые вы можете определить тем, что является точкой входа - с неё начинается выполнение программы.
Функция main имеет два параметра - число параметров argc и массив переданных параметров argv. Эти аргументы необязательные, поэтому можно их не писать. Об их использовании поговорим позже. Функция main должна возвращать целое число. Если это 0, то функция отработала без ошибок. В современном стандарте си можно не возвращать 0, и описать функцию как void main. Наша программа теперь выглядит совсем просто. Строка выводит строку Hello, World! на экран монитора. ожидает нажатия на клавишу.
Давайте сделаем что-нибудь посложнее, чтобы научиться добавлять новые файлы в программу. Сейчас для вас важно научиться добавлять новые файлы, если часть кода останется непонятной, это не беда.
1. Создайте новый заголовочный файл в папке "Заголовочные файлы", назовите его simple.h
2. Создайте новый файл simple.c в папке "Файлы исходного кода".
3. Добавьте в simple.h
Здесь мы объявили новую функцию doSomething. У неё отсутствует тело, оно будет описано в файле simple.c. Здесь же мы подключаем и библиотеки stdio и conio
Добавьте в simple .c
Мы включаем в файл simple.c заголовочный файл. Он пишется в двойных кавычках, потому что это не файл из стандартной библиотеки. Файлы стандартной библиотеки обычно располагаются в папке include самой IDE. Если поместить туда наши файлы, то их тоже можно будет объявлять в угловых скобках. В двойных кавычках можно также прописывать абсолютные пути к файлам. Так как мы уже включили библиотеки conio и stdio в .h файле, то они "видны" и в .c файле.
Далее, в main.c
Мы подключаем только заголовочный файл. Содержимое simple.c будет добавлено автоматически. Собираем проект (F5 или F9, или что там у вас за среда. ) Если у вас всё заработало то отлично, вы научились добавлять новые файлы в проект.
Детали системы:
Windows 10
Visual Studio Community 2017 v.15.2 (26430.6)
— Установленная разработка рабочего стола с C ++ (Снимок экрана: Список установки )
Шаг 1: Я написал знаменитую программу Hello World на C ++.
Шаг 2: Я нажал на Построить> Построить решение.
Проблема: ‘Stdio.h’: Данный файл или каталог отсутствует. Полная ошибка:
Детали по устранению неполадок / Вещи, которые я пробовал:
- Свойства конфигурации> Каталоги VC ++
Include Directories $(VC_IncludePath);$(WindowsSDK_IncludePath); - Снимок экрана: 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 или патезрасе, так что я должен был добавить их, потому что у меня были другие ошибки. Я бы очень признателен за любую помощь. благодаря
Указывает препроцессору включить содержимое указанного файла в точку, где отображается директива.
Синтаксис
Remarks
Путь-Spec — это имя файла, которому при необходимости может предшествовать Спецификация каталога. Имя файла должно указывать на существующий файл. Синтаксис инструкции path-Spec зависит от операционной системы, в которой компилируется программа.
2) в каталогах открытых в данный момент файлов включения в порядке, в котором они были открыты. Поиск начинается в каталоге родительского включаемого файла, а затем выполняется в каталогах всех включаемых файлов-прародителей.
3) вдоль пути, указанного в каждом /I параметре компилятора.
1) вдоль пути, указанного в каждом /I параметре компилятора.
Как только препроцессор найдет файл с заданным именем, поиск останавливается. При заключении полной, неоднозначной спецификации пути для включаемого файла между двойными кавычками ( " " ) препроцессор выполняет поиск только по этой спецификации пути и игнорирует стандартные каталоги.
Если включаемые файлы являются вложенными и при компиляции происходит в командной строке, поиск в каталоге начинается в каталоге родительского файла. Затем он переходит по каталогам всех файлов «бабушке». Таким образом, поиск начинается относительно каталога, в котором находится исходный файл, обрабатываемый в текущий момент. Если файл не найден, Поиск перемещается в каталоги, заданные параметром компилятора /I (дополнительные каталоги включаемых файлов) . Наконец, выполняется поиск каталогов, заданных INCLUDE переменной среды.
в среде разработки Visual Studio INCLUDE переменная среды игнорируется. Вместо них используются значения, указанные в свойствах проекта для каталогов включения. дополнительные сведения о настройке каталогов включения в Visual Studio см. в разделе включаемые каталоги и дополнительные каталоги включаемыхданных.
В приведенном ниже примере демонстрируется включение файлов с помощью угловых скобок:
В этом примере в исходную программу добавляется содержимое файла с именем stdio.h . Угловые скобки приводят препроцессору для поиска в каталогах, заданных INCLUDE переменной среды для stdio.h , после того, как он выполняет поиск в каталогах, заданных /I параметром компилятора.
В следующем примере демонстрируется включение файлов, заданных в кавычках:
В примере добавляется содержимое файла, указанного defs.h в исходной программе. Кавычки означают, что препроцессор сначала попытается найти этот файл в каталоге, содержащем родительский исходный файл.
Только для систем Майкрософт
Чтобы найти исходные файлы для включения, препроцессор сначала выполняет поиск в каталогах, заданных /I параметром компилятора. Если /I параметр отсутствует или неисправен, препроцессор использует INCLUDE переменную среды для поиска всех включаемых файлов в угловых скобках. INCLUDE Переменная среды и /I параметр компилятора могут содержать несколько путей, разделенных точкой с запятой ( ; ). Если в качестве части /I параметра или переменной среды отображается несколько каталогов INCLUDE , препроцессор ищет их в том порядке, в котором они отображаются.
Представим себе следующую команду:
приводит к тому, что препроцессор ищет в каталоге D:\msvc\include\ включаемые файлы, например stdio.h . Ниже еще один пример:
Эта инструкция действуют точно так же. Если найти файл в обоих наборах каталогов не удастся, возникает неустранимая ошибка компилятора.
Если имя файла указано полностью для включаемого файла с путем, содержащим двоеточие (например, F:\MSVC\SPECIAL\INCL\TEST.H ), препроцессор следует за путем.
Читайте также: