Мой код включает операции с файлами с использованием open() и связанных с ним функций. Но я сталкиваюсь с ошибкой «идентификатор не найден» для open(), хотя я включил необходимый заголовок (<fcntl.h>).
#include <fcntl.h>
#include <unistd.h>
#include <iostream>
int main() {
// Relevant code using open() function
int fd = open("file.txt", O_RDONLY);
if (fd == -1) {
perror("open");
return 1;
}
// Further operations involving file descriptors
close(fd); // Closing the file descriptor
return 0;
}
Насколько я понимаю, open() — это стандартная функция для файловых операций в UNIX-подобных системах, но, похоже, компилятор не может ее найти. Не могли бы вы помочь объяснить, почему может возникнуть эта ошибка и как ее устранить?
См. Learn.microsoft.com/en-us/cpp/c-runtime-library/reference/… вы не используете UNIX-подобную систему, вы используете Windows, поэтому вам нужно просмотреть документацию Microsoft.
@AlanBirtles Я просмотрел эту страницу и не увидел требования io.h. (Хотя иногда я слеп.)
@Peter-ReinstateMonica см. «Требования» внизу (довольно стандартно для документов Microsoft)
@AlanBirtles Ах, заголовки внизу. Имеет полный смысл, тем более, как правило ;-).
Спасибо, я последовал совету и включил предупреждение #pragma(disable: 4996), как было предложено, и это решило проблему с устаревшими функциями в <io.h>. Это помогло мне успешно скомпилировать и запустить код без появления предупреждений. Я благодарен за помощь!
Есть ли причина, по которой вы не используете производную ifstream? Смотрите std::ifstream::open().
Если вам необходимо использовать функции, не относящиеся к стандартному языку C++, вам следует проверить MSDN: Создание и открытие файлов





Windows и Visual C++ имеют собственную версию открытия/закрытия, требующую ведущего подчеркивания.
#define _CRT_SECURE_NO_WARNINGS
#include <io.h>
#include <fcntl.h>
#include <iostream>
int main() {
// Relevant code using open() function
int fd = _open("file.txt", _O_RDONLY);
if (fd == -1) {
perror("open");
return 1;
}
// Further operations involving file descriptors
_close(fd); // Closing the file descriptor
return 0;
}
Или даже лучше. Отбросьте определение _CRT_SECURE_NO_WARNINGS и используйте его, чтобы открыть файл:
auto err = _sopen_s(&fd, "d:/save2.txt", _O_RDONLY, _SH_DENYWR, 0);
if (err != 0) {
perror("open");
return 1;
}
Несмотря на то, что это одна из самых основных и распространенных функций C, open() «зависит от реализации»: это POSIX функция. Теперь POSIX — это попытка быть «переносимым», но в основном между различными вариантами Unix. Не каждая операционная система, программируемая на C, имеет собственные целочисленные «дескрипторы файлов»; это концепция *nix.
Другие операционные системы, включая ранние версии Windows NT (и, как мы видим, современную Windows), иногда обеспечивают ту или иную степень поддержки функций POSIX. Причина, несомненно, в том, чтобы помочь перенести с *nix-систем на эти целевые системы хотя бы такие программы, которые используют только базовые, простые в реализации функциональные возможности POSIX.
По-настоящему переносимый способ выполнения ввода-вывода — через стандартную библиотеку C (и, кроме того, для программ C++) (fopen(), ifstream()). Структура FILE, с которой работает стандартная библиотека C, «непрозрачна»: функции возвращают и получают указатели (или, в C++, ссылки), так что пользователь может игнорировать их внутреннюю структуру.
Почему же Microsoft объявляет устаревшим open() и заменяет его на _open()?
Стандарт C++ требует в 5.10 «Идентификаторы»:
Каждый идентификатор, начинающийся с подчеркивания, зарезервирован для реализации и может использоваться в качестве имени в глобальном пространстве имен.
Я не воспринимаю это как создание определяемых реализацией идентификаторов, которые не начинаются с подчеркивания, несовместимого; но пользователи могут справедливо удивиться столкновениям таких имен с именами, введенными реализацией. Следовательно, Microsoft изменила имя на _open(), имя, которое зарезервировано для реализаций. Старое имя вызывает предупреждение C4996, которое, похоже, превратилось в ошибку — чтобы этого избежать, нужно добавить #pragma warning(disable : 4996).
Наконец, документация для _open() содержит, как правильно заметил Алан Бертлз, необходимый заголовок io.h в разделе Требования.
Мне кажется в io.h, и надо сказать
#pragma warning(disable : 4996). («Это имя устарело, поскольку оно не соответствует правилам стандарта C для имен, специфичных для реализации».)