_sopen_s
, _wsopen_s
Abre um arquivo para compartilhamento. Essas versões e _wsopen
têm aprimoramentos de _sopen
segurança, conforme descrito em Recursos de segurança no CRT.
Sintaxe
errno_t _sopen_s(
int* pfh,
const char *filename,
int oflag,
int shflag,
int pmode
);
errno_t _wsopen_s(
int* pfh,
const wchar_t *filename,
int oflag,
int shflag,
int pmode,
);
Parâmetros
pfh
O identificador de arquivo ou -1 se houver um erro.
filename
Nome do arquivo.
oflag
Os tipos de operações permitidas.
shflag
O tipo de compartilhamento permitido.
pmode
Configuração de permissão.
Valor retornado
Um valor retornado diferente de zero indica um erro; nesse caso, errno
é configurado com um dos seguintes valores.
errno valor |
Condição |
---|---|
EACCES |
O caminho determinado é um diretório ou o arquivo é somente leitura, mas foi realizada uma tentativa de operação de abertura para gravação. |
EEXIST |
Sinalizadores _O_CREAT e _O_EXCL foram especificados, mas filename já existe. |
EINVAL |
Argumento oflag , shflag ou pmode inválido, ou pfh ou filename é um ponteiro nulo. |
EMFILE |
Nenhum outro descritor de arquivo disponível. |
ENOENT |
Arquivo ou caminho não encontrado. |
Se um argumento inválido for passado para a função, o manipulador de parâmetro inválido será invocado, como descrito em Validação de parâmetro. Se a execução tiver permissão para continuar, errno
será definido como EINVAL
e EINVAL
será retornado.
Para obter mais informações sobre esses e outros códigos de retorno, confira errno
, _doserrno
, _sys_errlist
e _sys_nerr
.
Em caso de erro, -1 é retornado por pfh
(a menos que pfh
seja um ponteiro nulo).
Comentários
A função _sopen_s
abre o arquivo especificado por filename
e prepara o arquivo para leitura ou gravação compartilhada, como definido por oflag
e shflag
. A função _wsopen_s
é uma versão de caractere largo da função _sopen_s
; o argumento filename
para _wsopen_s
é uma cadeia de caracteres larga. Caso contrário, _wsopen_s
e _sopen_s
se comportam de forma idêntica.
Por padrão, o estado global dessa função tem como escopo o aplicativo. Para alterar isso, confira Estado global no CRT.
Mapeamentos de rotina de texto genérico
Rotina Tchar.h |
_UNICODE e _MBCS não definidos |
_MBCS definido |
_UNICODE definido |
---|---|---|---|
_tsopen_s |
_sopen_s |
_sopen_s |
_wsopen_s |
A expressão de número inteiro oflag
é formada combinando uma ou mais constantes de manifesto, que são definidas em <fcntl.h>
. Quando duas ou mais constantes formam o argumento oflag
, elas são combinadas com o operador OR bit a bit (|
).
Constante oflag |
Comportamento |
---|---|
_O_APPEND |
Move o ponteiro para o final do arquivo antes de cada operação de gravação. |
_O_BINARY |
Abre o arquivo no modo binário (sem conversão). (Confira fopen para ver uma descrição do modo binário.) |
_O_CREAT |
Cria um arquivo e o abre para gravação. Não terá efeito algum se o arquivo especificado por filename já existir. O argumento pmode é necessário quando _O_CREAT é especificada. |
_O_CREAT | _O_SHORT_LIVED |
Cria um arquivo temporário e, se possível, não libera para o disco. O argumento pmode é necessário quando _O_CREAT é especificada. |
_O_CREAT | _O_TEMPORARY |
Cria um arquivo temporário, que é excluído quando o último descritor de arquivo é fechado. O argumento pmode é necessário quando _O_CREAT é especificada. Para preservar o comportamento herdado para a compatibilidade do aplicativo, outros processos não são impedidos de excluir esse arquivo. |
_O_CREAT | _O_EXCL |
Retorna um valor de erro se o arquivo especificado por filename existir. Aplica-se somente quando usado com _O_CREAT . |
_O_NOINHERIT |
Impede a criação de um descritor de arquivo compartilhado. |
_O_RANDOM |
Especifica que o cache é otimizado para acesso aleatório do disco, mas não se restringe a isso. |
_O_RDONLY |
Abre um arquivo somente leitura. Não pode ser especificado com _O_RDWR ou _O_WRONLY . |
_O_RDWR |
Abre um arquivo para leitura e gravação. Não pode ser especificado com _O_RDONLY ou _O_WRONLY . |
_O_SEQUENTIAL |
Especifica que o cache é otimizado para acesso sequencial do disco, mas não se restringe a isso. |
_O_TEXT |
Abre um arquivo no modo de texto ANSI (traduzido). (Para saber mais, confira E/S de arquivo nos modos de texto e binário e fopen .) |
_O_TRUNC |
Abre um arquivo e o trunca para que ele fique com tamanho zero; o arquivo deve ter permissão de gravação. Não pode ser especificado com _O_RDONLY . A constante _O_TRUNC , usada com a constante _O_CREAT , abre um arquivo existente ou cria um. Observação: o sinalizador _O_TRUNC destrói o conteúdo do arquivo especificado. |
_O_WRONLY |
Abre um arquivo somente gravação. Não pode ser especificado com _O_RDONLY ou _O_RDWR . |
_O_U16TEXT |
Abre um arquivo no modo Unicode UTF-16. |
_O_U8TEXT |
Abre um arquivo no modo Unicode UTF-8. |
_O_WTEXT |
Abre um arquivo no modo Unicode. |
Para especificar o modo de acesso ao arquivo, você deve especificar _O_RDONLY
, _O_RDWR
ou _O_WRONLY
. Não há valor padrão para o modo de acesso.
Quando o arquivo é aberto no modo Unicode com a constante _O_WTEXT
, _O_U8TEXT
ou _O_U16TEXT
, as funções de entrada convertem os dados do arquivo em dados UTF-16 armazenados como tipo wchar_t
. Funções que gravam em arquivos abertos no modo Unicode esperam buffers que contenham dados UTF-16 armazenados como tipo wchar_t
. Se o arquivo estiver codificado como UTF-8, os dados em UTF-16 serão convertidos em UTF-8 no momento da gravação. O conteúdo codificado em UTF-8 do arquivo é convertido para UTF-16 quando ele é lido. Tentar ler ou gravar uma quantidade ímpar de bytes no modo Unicode gera um erro de validação de parâmetro. Para ler ou gravar dados armazenados em seu programa como UTF-8, use um modo de arquivo de texto ou binário em vez do modo Unicode. Você é responsável por toda a conversão de codificação necessária.
Se _sopen_s
for chamado com _O_WRONLY | _O_APPEND
(modo de acréscimo) e _O_WTEXT
, _O_U16TEXT
ou _O_U8TEXT
, ele primeiro tentará abrir o arquivo para leitura e gravação, lerá a BOM e, em seguida, reabrirá o arquivo somente para gravação. Se uma falha impedir de abrir o arquivo para leitura e gravação, ele será aberto somente para gravação e usará o valor padrão na configuração do modo Unicode.
O argumento shflag
é uma expressão constante formada por uma das constantes de manifesto a seguir, definidas em <share.h>
.
Constante shflag |
Comportamento |
---|---|
_SH_DENYRW |
Nega acesso de leitura e gravação a um arquivo. |
_SH_DENYWR |
Nega acesso de gravação a um arquivo. |
_SH_DENYRD |
Nega acesso de leitura a um arquivo. |
_SH_DENYNO |
Permite acesso de leitura e gravação. |
O argumento pmode
é sempre necessário, ao contrário de _sopen
. Ao especificar _O_CREAT
, se o arquivo não existir, pmode
especificará as configurações de permissão do arquivo, que serão definidas quando o novo arquivo for fechado pela primeira vez. Caso contrário, pmode
é ignorado. pmode
é uma expressão de inteiro que contém uma ou as duas constantes de manifesto _S_IWRITE
e _S_IREAD
, que são definidas em <sys\stat.h>
. Quando ambas as constantes são fornecidas, elas são combinadas com o operador OR bit a bit. O significado de pmode
é o seguinte.
pmode |
Significado |
---|---|
_S_IREAD |
Somente a leitura é permitida. |
_S_IWRITE |
Gravação permitida. (Na verdade, permite leitura e gravação.) |
_S_IREAD | _S_IWRITE |
Leitura e gravação permitidas. |
Se a permissão de gravação não for concedida, o arquivo será somente leitura. No sistema operacional Windows, todos os arquivos podem ser lidos, não sendo possível conceder permissão de somente gravação. Portanto, os modos _S_IWRITE
e _S_IREAD | _S_IWRITE
são equivalentes.
A função _sopen_s
aplica a máscara de permissão do arquivo ao argumento pmode
antes da definição das permissões. (Consulte _umask
.)
Requisitos
Função | Cabeçalho necessário | Cabeçalho opcional |
---|---|---|
_sopen_s |
<io.h> |
<fcntl.h> , <sys\types.h> , <sys\stat.h> , <share.h> |
_wsopen_s |
<io.h> ou <wchar.h> |
<fcntl.h> , <sys/types.h> , <sys/stat.h> , <share.h> |
_sopen_s
e _wsopen_s
são extensões da Microsoft. Para obter informações sobre compatibilidade, consulte Compatibilidade.
Exemplo
Confira o exemplo de _locking
.
Confira também
E/S de baixo nível
_close
_creat
, _wcreat
fopen
, _wfopen
_fsopen
, _wfsopen
_open
, _wopen