fopen_s
, _wfopen_s
Bir dosya açar. 'nin fopen
_wfopen
bu sürümleri, CRT'deki Güvenlik özellikleri bölümünde açıklandığı gibi güvenlik geliştirmelerine sahiptir.
Sözdizimi
errno_t fopen_s(
FILE** pFile,
const char *filename,
const char *mode
);
errno_t _wfopen_s(
FILE** pFile,
const wchar_t *filename,
const wchar_t *mode
);
Parametreler
pFile
Açılan dosyanın işaretçisini alan dosya işaretçisinin işaretçisi.
filename
Açılacak dosyanın adı.
mode
İzin verilen erişim türü.
Dönüş değeri
Başarılı olursa sıfır; hatayla ilgili bir hata kodu. Bu hata kodları hakkında daha fazla bilgi için bkz. errno
, _doserrno
, _sys_errlist
ve _sys_nerr
.
Hata koşulları
pFile |
filename |
mode |
Dönüş Değeri | İçeriği pFile |
---|---|---|---|---|
NULL |
herhangi bir | herhangi bir | EINVAL |
Değişme -den |
herhangi bir | NULL |
herhangi bir | EINVAL |
Değişme -den |
herhangi bir | herhangi bir | NULL |
EINVAL |
Değişme -den |
Açıklamalar
fopen_s
ve _wfopen_s
işlevleri paylaşım için bir dosyayı açamaz. Dosyayı paylaşmanız gerekiyorsa, uygun paylaşım modu sabitiyle veya _wfsopen
kullanın_fsopen
; örneğin, okuma/yazma paylaşımı için kullanın_SH_DENYNO
.
fopen_s
işlevi tarafından filename
belirtilen dosyayı açar. _wfopen_s
geniş karakterli bir sürümüdür fopen_s
ve bağımsız _wfopen_s
değişkenleri geniş karakterli dizelerdir. _wfopen_s
ve fopen_s
aynı şekilde davranır, aksi takdirde.
fopen_s
yürütme noktasında dosya sisteminde geçerli olan yolları kabul eder; Eşlenen ağ sürücülerini içeren UNC yolları ve yolları, kodu yürüten sistemin yürütme sırasında paylaşım veya eşlenen ağ sürücüsüne erişimi olduğu sürece tarafından kabul edilir fopen_s
. için fopen_s
yollar oluştururken, yürütme ortamında sürücülerin, yolların veya ağ paylaşımlarının kullanılabilirliği hakkında varsayımlarda bulunmayın. Yoldaki dizin ayırıcıları olarak eğik çizgi (/) veya ters eğik çizgi (\) kullanabilirsiniz.
Bu işlevler parametrelerini doğrular. , pFile
filename
veya mode
null işaretçiyse, bu işlevler Parametre doğrulamasında açıklandığı gibi geçersiz bir parametre özel durumu oluşturur.
Dosyada başka işlemler yapmadan önce işlevin başarılı olup olmadığını görmek için her zaman dönüş değerini denetleyin. Bir hata oluşursa, hata kodu döndürülür ve genel değişken errno
ayarlanır. Daha fazla bilgi için bkz. errno
, _doserrno
, _sys_errlist
ve _sys_nerr
.
Varsayılan olarak, bu işlevin genel durumunun kapsamı uygulama olarak belirlenmiştir. Bunu değiştirmek için bkz . CRT'de Genel durum.
Unicode desteği
fopen_s
Unicode dosya akışlarını destekler. Yeni veya var olan bir Unicode dosyasını açmak için, için istenen kodlamayı fopen_s
belirten bir ccs
bayrak geçirin, örneğin:
fopen_s(&fp, "newfile.txt", "w+, ccs=UNICODE");
bayrağının ccs
izin verilen değerleri , UTF-8
ve UTF-16LE
şeklindedirUNICODE
. için ccs
fopen_s
değer belirtilmezse ANSI kodlamasını kullanır.
Dosya zaten varsa ve okuma veya ekleme için açılmışsa, dosyada varsa bayt sırası işareti (BOM) kodlamayı belirler. BOM kodlaması, bayrağı tarafından belirtilen kodlamadan ccs
önceliklidir. Kodlama ccs
yalnızca ürün reçetesi olmadığında veya dosya yeni bir dosya olduğunda kullanılır.
Not
ÜRÜN reçetesi algılama yalnızca Unicode modunda açılan dosyalar için geçerlidir; yani bayrağını ccs
geçirerek.
Aşağıdaki tabloda, dosyadaki ürün reçetelerine ve fopen_s
verilen çeşitli ccs
bayrak değerlerinin modları özetlenir.
Bayrak ve ürün reçetesine ccs
göre kullanılan kodlamalar
ccs bayrak |
Ürün reçetesi yok (veya yeni dosya) | BOM: UTF-8 | BOM: UTF-16 |
---|---|---|---|
UNICODE |
UTF-8 |
UTF-8 |
UTF-16LE |
UTF-8 |
UTF-8 |
UTF-8 |
UTF-16LE |
UTF-16LE |
UTF-16LE |
UTF-8 |
UTF-16LE |
Unicode modunda yazmak üzere açılan dosyalara otomatik olarak yazılmış bir ürün reçetesi vardır.
, veya "a, ccs=UTF-16LE"
fopen_s
ise "a, ccs=UTF-8"
mode
"a, ccs=UNICODE"
, önce dosyayı hem okuma erişimi hem de yazma erişimiyle açmaya çalışır. Başarılı olursa, işlev dosyanın kodlamasını belirlemek için BOM'u okur; başarısız olursa, işlev dosya için varsayılan kodlamayı kullanır. Her iki durumda da dosyayı fopen_s
salt yazma erişimiyle yeniden açar. (Bu davranış yalnızca moda uygulanır a
, a+
.)
Karakter dizesi mode
, dosya için istenen erişim türünü aşağıdaki gibi belirtir.
mode |
Access |
---|---|
"r" |
Okuma için açılır. Dosya yoksa veya bulunamıyorsa, fopen_s çağrı başarısız olur. |
"w" |
Yazmak için boş bir dosya açar. Verilen dosya varsa, içeriği yok edilir. |
"a" |
Dosyaya yeni veriler yazılmadan önce dosya sonu (EOF) işaretçisini kaldırmadan dosyanın sonuna (ekleme) yazma için açılır. Yoksa dosyayı oluşturur. |
"r+" |
Hem okuma hem de yazma için açılır. Dosya mevcut olmalıdır. |
"w+" |
Hem okuma hem de yazma için boş bir dosya açar. Dosya varsa, içeriği yok edilir. |
"a+" |
Okuma ve ekleme için açılır. Ekleme işlemi, dosyaya yeni veriler yazılmadan önce EOF işaretçisinin kaldırılmasını içerir. EOF işaretçisi, yazma işlemi tamamlandıktan sonra geri yüklenmez. Yoksa dosyayı oluşturur. |
Bir dosya veya "a+"
erişim türü kullanılarak "a"
açıldığında, tüm yazma işlemleri dosyanın sonunda gerçekleşir. Dosya işaretçisi veya rewind
kullanılarak fseek
yeniden konumlandırılabilir, ancak var olan verilerin üzerine yazılmaması için herhangi bir yazma işlemi gerçekleştirilmeden önce her zaman dosyanın sonuna geri taşınır.
Mod, "a"
dosyaya eklemeden önce EOF işaretçisini kaldırmaz. Ekleme işlemi gerçekleştikten sonra, MS-DOS TYPE
komutu yalnızca özgün EOF işaretçisine kadar olan verileri gösterir ve dosyaya eklenen verileri göstermez. Mod, "a+"
dosyaya eklemeden önce EOF işaretçisini kaldırır. Ekledikten sonra, MS-DOS TYPE
komutu dosyadaki tüm verileri gösterir. Mod"a+"
, Z EOF işaretçisiyle sonlandırılan CTRL
+bir akış dosyasına eklemek için gereklidir.
, "w+"
veya "a+"
erişim türü belirtildiğinde "r+"
hem okuma hem de yazma işlemlerine izin verilir. (Dosyanın "güncelleştirme" için açık olduğu söylenir.) Ancak, okumadan yazmaya geçiş yaptığınızda, giriş işlemi bir EOF işaretçisi ile karşılaşmalıdır. EOF işaretçisi yoksa, dosya konumlandırma işlevine yönelik bir araya gelen çağrı kullanmanız gerekir. Dosya konumlandırma işlevleri , fseek
ve rewind
'tirfsetpos
. Yazmadan okumaya geçiş yaptığınızda, dosya konumlandırma işlevine veya dosya konumlandırma işlevine fflush
bir araya gelen çağrı kullanmanız gerekir.
C11'den başlayarak, üzerine yazmak yerine dosya varsa işlevin başarısız olmasına neden olmak için öğesine veya "w+"
ekleyebilirsiniz."x"
"w"
Önceki değerlere ek olarak, yeni satır karakterleri için çeviri modunu belirtmek üzere aşağıdaki karakterler mode
eklenebilir:
mode Değiştirici |
Çeviri modu |
---|---|
t |
Metin (çevrilmiş) modunda açın. Satır başı besleme (CR-LF) birleşimleri girişte tek satırlı akışlara (LF) ve LF karakterleri çıkışta CR-LF birleşimlerine çevrilir. CTRL+Z, girişte dosya sonu karakteri olarak yorumlanır. |
b |
İkili (çevrilmemiş) modda aç; satır başı ve satır besleme karakterleri içeren çeviriler gizleniyor. |
Metin (çevrilmiş) modunda Z, CTRL
+girişte dosya sonu karakteri olarak yorumlanır. ile "a+"
fopen_s
okuma/yazma için açılan dosyalar için, dosyanın sonunda bir CTRL
+Z olup olmadığını denetler ve mümkünse dosyayı kaldırır. Ve kullanarak fseek
ftell
Z ileCTRL
+ biten bir dosya içinde hareket etmek, dosyanın sonuna doğru düzgün davranmamasına neden fseek
olabileceğinden kaldırılır.
Ayrıca metin modunda satır başı/satır besleme (CRLF) birleşimleri girişteki tek satır besleme (LF) karakterlerine, LF karakterleri ise çıkıştaki CRLF birleşimlerine çevrilir. Unicode akış G/Ç işlevi metin modunda (varsayılan) çalıştığında, kaynak veya hedef akışın çok baytlı karakter dizisi olduğu varsayılır. Unicode akış girişi işlevleri, çok baytlı karakterleri geniş karakterlere dönüştürür (işlev çağrısı mbtowc
gibi). Aynı nedenle, Unicode akış çıkış işlevleri geniş karakterleri çok baytlı karakterlere dönüştürür (işleve wctomb
yapılan bir çağrı gibi).
t
veya b
içinde mode
verilmediyse, varsayılan çeviri modu genel değişkeni _fmode
tarafından tanımlanır. veya b
bağımsız değişkenine ön ekliyse t
işlev başarısız olur ve döndürürNULL
.
Unicode ve çok baytlı akış G/Ç'de metin ve ikili mod kullanma hakkında daha fazla bilgi için bkz . Metin ve ikili mod dosya G/Ç ve metin ve ikili modlarda Unicode akış G/Ç.
mode Değiştirici |
Davranış |
---|---|
c |
dosya arabelleğinin içeriğinin veya çağrılırsa fflush _flushall doğrudan diske yazılabilmesi için ilişkili filename için işleme bayrağını etkinleştirin. |
n |
"İşleme yok" ile ilişkili filename için işleme bayrağını sıfırlayın. Bu bayrak varsayılandır. Ayrıca programınızı ile COMMODE.OBJ bağlarsanız genel işleme bayrağını geçersiz kılar. Programınızı COMMODE.OBJ açıkça bağlamadığınız sürece genel işleme bayrağı varsayılan olarak "işleme yok" olur (bkz . Bağlantı seçenekleri). |
N |
Dosyanın alt işlemler tarafından devralınmadığını belirtir. |
S |
Önbelleğe almanın diskten sıralı erişim için iyileştirildiğini ancak bununla sınırlı olmadığını belirtir. |
R |
Önbelleğe almanın diskten rastgele erişim için iyileştirildiğini ancak bununla sınırlı olmadığını belirtir. |
T |
Bellek baskısı gerektirmediği sürece diske yazılmamış bir dosya belirtir. |
D |
Son dosya işaretçisi kapatıldığında silinen geçici bir dosya belirtir. |
ccs=UNICODE |
Bu dosya için kullanılacak kodlanmış karakter kümesi olarak UNICODE belirtir. ANSI kodlaması istiyorsanız belirtilmemiş bırakın. |
ccs=UTF-8 |
Bu dosya için kullanılacak kodlanmış karakter kümesi olarak UTF-8'i belirtir. ANSI kodlaması istiyorsanız belirtilmemiş bırakın. |
ccs=UTF-16LE |
Bu dosya için kullanılacak kodlanmış karakter kümesi olarak UTF-16LE'yi belirtir. ANSI kodlaması istiyorsanız belirtilmemiş bırakın. |
ve içinde fopen_s
_fdopen
kullanılan dize için mode
geçerli karakterler aşağıda gösterildiği gibi ve _sopen
içinde _open
kullanılan bağımsız değişkenlere oflag
karşılık gelir.
Dizedeki mode karakterler |
için eşdeğer oflag değer _open /_sopen |
---|---|
a |
_O_WRONLY | _O_APPEND (genellikle _O_WRONLY | _O_CREAT | _O_APPEND ) |
a+ |
_O_RDWR | _O_APPEND (genellikle _O_RDWR | _O_APPEND | _O_CREAT ) |
R |
_O_RDONLY |
r+ |
_O_RDWR |
w |
_O_WRONLY (genellikle _O_WRONLY | _O_CREAT | _O_TRUNC ) |
w+ |
_O_RDWR (genellikle **_O_RDWR | _O_CREAT | _O_TRUNC ) |
b |
_O_BINARY |
t |
_O_TEXT (çevrilmiş) |
c |
Hiçbiri |
n |
Hiçbiri |
D |
_O_TEMPORARY |
R |
_O_RANDOM |
S |
_O_SEQUENTIAL |
T |
_O_SHORTLIVED |
ccs=UNICODE |
_O_WTEXT |
ccs=UTF-8 |
_O_UTF8 |
ccs=UTF-16LE |
_O_UTF16 |
c
, , n
, R
, S
, , t
, T
ve D
mode
seçenekleri ve için fopen_s
_wfopen_s
Microsoft uzantılarıdır ve ANSI taşınabilirliği istediğinizde kullanılmamalıdır.
Modu kullanıyorsanız rb
, kodunuzu taşımanız gerekmiyorsa, dosyanın büyük bir kısmını okumayı bekliyorsanız veya ağ performansını önemsemiyorsanız bellekle eşlenen Win32 dosyaları da bir seçenek olabilir.
ve ile ilgili T
D
:
T
bellek baskısı gerektirmediği sürece dosyayı diske yazmaktan kaçınıyor. Daha fazla bilgi için Dosya özniteliği sabitleri bölümüne bakınFILE_ATTRIBUTE_TEMPORARY
ve ayrıca bu blog gönderisi Yalnızca geçicidir.D
diske yazılan normal bir dosyayı belirtir. Aradaki fark, kapatıldığında otomatik olarak silinmesidir. Her iki semantiği de almak için birleştirebilirsinizTD
.
Gereksinimler
İşlev | Gerekli başlık | C++ üst bilgisi |
---|---|---|
fopen_s |
<stdio.h> |
<cstdio> |
_wfopen_s |
<stdio.h> veya <wchar.h> |
<cstdio> |
C çalışma zamanı kitaplığındaki standartlar uyumluluğu ve adlandırma kuralları hakkında daha fazla bilgi için bkz . Uyumluluk.
Genel metin yordamı eşlemeleri
<tchar.h> olağan |
_UNICODE ve _MBCS tanımlanmadı |
_MBCS tanımlanan |
_UNICODE tanımlanan |
---|---|---|---|
_tfopen_s |
fopen_s |
fopen_s |
_wfopen_s |
Kitaplıklar
C çalışma zamanı kitaplıklarının tüm sürümleri.
Örnek
// crt_fopen_s.c
// This program opens two files. It uses
// fclose to close the first file and
// _fcloseall to close all remaining files.
#include <stdio.h>
FILE *stream, *stream2;
int main( void )
{
errno_t err;
// Open for read (will fail if file "crt_fopen_s.c" doesn't exist)
err = fopen_s( &stream, "crt_fopen_s.c", "r" );
if( err == 0 )
{
printf( "The file 'crt_fopen_s.c' was opened\n" );
}
else
{
printf( "The file 'crt_fopen_s.c' was not opened\n" );
}
// Open for write
err = fopen_s( &stream2, "data2", "w+, ccs=UTF-8" );
if( err == 0 )
{
printf( "The file 'data2' was opened\n" );
}
else
{
printf( "The file 'data2' was not opened\n" );
}
// Close stream if it isn't NULL
if( stream )
{
err = fclose( stream );
if ( err == 0 )
{
printf( "The file 'crt_fopen_s.c' was closed\n" );
}
else
{
printf( "The file 'crt_fopen_s.c' was not closed\n" );
}
}
// All other files are closed:
int numclosed = _fcloseall( );
printf( "Number of files closed by _fcloseall: %u\n", numclosed );
}
The file 'crt_fopen_s.c' was opened
The file 'data2' was opened
Number of files closed by _fcloseall: 1
Ayrıca bkz.
Akış G/Ç
fclose
, _fcloseall
_fdopen
, _wfdopen
ferror
_fileno
freopen
, _wfreopen
_open
, _wopen
_setmode