#c #function #implementation #tesseract
#c #функция #реализация #тессеракт
Вопрос:
Я пытаюсь создать проект с использованием Tesseract в чем-то другом, кроме Visual Studio, но, похоже, нет никакой документации о том, как это сделать.
Проблема, с которой я сейчас сталкиваюсь, заключается в том, что файл scanutils.cpp вызывает функцию open(char *, int, mode_t), и это нигде не определено. Возможно, это функция Unix, которая ускользнула или должна быть расположена где-то на моей машине?
Спасибо.
Редактировать: я обнаружил, что функция open включает использование файла fcntl.h в Unix, но ее версия, которая у меня есть (C Builder), не включает функцию open. Я мог бы просто определить функцию open в своем собственном файле, как в Unix, но это кажется немного опрометчивым. Есть предложения?
Ответ №1:
В инструментах Microsoft функция open()
заменяется на _open()
, определенная в io.h
. Здесь (MSDN) вы можете найти более подробную информацию об этом.
Ответ №2:
open()
это функция Posix, которая обычно переносит open
системный вызов в соответствующие системы. Это довольно «низкоуровневая» функция, которая очень специфична для платформы.
Переносимая функция C, которая обеспечивает эквивалентную функциональность fopen()
, в том смысле, что результат open()
такой же, как FILE * fp = fopen(...); int fd = fileno(fp);
— здесь fd
целое число, возвращаемое базовым open()
вызовом.
Стандартные функции C fwrite()
и fread()
сопоставляются с функциями Posix read()
и write()
, кстати.
Старайтесь максимально использовать стандартные функции и FILE*
структуры данных C для максимальной переносимости. При необходимости вы всегда можете получить дескриптор файла Posix через fileno()
.
Комментарии:
1. Отлично. Спасибо. В коде использовались флаги O_CREATE , O_TRUNC и O_WRONLY, и я полагаю, что fopen делает то же самое по умолчанию.
2. @user912447: Не совсем.
fopen()
имеет стандартный набор флагов (которые вы можете посмотреть в руководстве), которые соответствуют определеннымopen
флагам. Ноopen
предлагает гораздо больший и более точно настроенный набор флагов для всех видов поведения, специфичного для Posix. Опять же, проверьте руководство,man 2 open
.
Ответ №3:
open()
является стандартной функцией UNIX.
Комментарии:
1. Без реализации в Windows? Я спрашиваю, потому что обычно код tesseract, который предназначен только для unix, обернут в #ifdef и предлагает альтернативу Windows. В противном случае он не будет компилироваться в Visual Studio, что, я знаю, так и есть.