fopen
, _wfopen
Bir dosya açar. Bu işlevlerin daha fazla parametre doğrulaması gerçekleştiren ve hata kodları döndüren daha güvenli sürümleri mevcuttur; bkz. fopen_s
, _wfopen_s
.
Sözdizimi
FILE *fopen(
const char *filename,
const char *mode
);
FILE *_wfopen(
const wchar_t *filename,
const wchar_t *mode
);
Parametreler
filename
Dosya adı.
mode
Etkin erişim türü.
Dönüş değeri
Bu işlevlerin her biri açık dosyaya bir işaretçi döndürür. Null işaretçi değeri bir hatayı gösterir. Veya ise mode
veya boş bir dizeyse NULL
filename
, bu işlevler Parametre doğrulama bölümünde açıklanan geçersiz parametre işleyicisini tetikler. Yürütmenin devam etmesi için izin verilirse, bu işlevler döndürülerek NULL
olarak EINVAL
ayarlanırerrno
.
Daha fazla bilgi için bkz. errno
, _doserrno
, _sys_errlist
ve _sys_nerr
.
Açıklamalar
fopen
işlevi tarafından filename
belirtilen dosyayı açar. Varsayılan olarak, ansi kod sayfası ()CP_ACP
kullanılarak dar filename
bir dize yorumlanır. Windows Masaüstü uygulamalarında, işlevi kullanılarak OEM kod sayfası (CP_OEMCP
) olarak SetFileApisToOEM
değiştirilebilir. ANSI veya sistem varsayılan OEM kod sayfası kullanılarak yorumlanıp yorumlanmayacağını filename
belirlemek için işlevini kullanabilirsinizAreFileApisANSI
. _wfopen
, geniş karakterli fopen
bir sürümüdür; _wfopen
bağımsız değişkenler geniş karakterli dizelerdir. Aksi takdirde ve _wfopen
fopen
aynı şekilde davran. Yalnızca kullanmak _wfopen
, dosya akışında kullanılan kodlanmış karakter kümesini etkilemez.
fopen
yürütme noktasında dosya sisteminde geçerli olan yolları kabul eder; fopen
kodu yürüten sistemin yürütme sırasında paylaşım veya eşlenen sürücüye erişimi olduğu sürece eşlenmiş ağ sürücülerini içeren UNC yollarını ve yollarını kabul eder. için fopen
yollar oluştururken sürücülerin, yolların veya ağ paylaşımlarının yürütme ortamında kullanılabilir olduğundan emin olun. Yoldaki dizin ayırıcıları olarak eğik çizgi (/
) veya ters eğik çizgi (\
) kullanabilirsiniz.
Dosyada başka işlemler gerçekleştirmeden önce işaretçinin NULL olup olmadığını görmek için her zaman dönüş değerini denetleyin. Bir hata oluşursa, genel değişken errno
ayarlanır ve belirli hata bilgilerini almak için kullanılabilir. 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
Unicode dosya akışlarını destekler. Unicode dosyasını açmak için, aşağıdaki gibi için istenen kodlamayı fopen
belirten bir ccs=encoding
bayrak geçirin.
FILE *fp = fopen("newfile.txt", "rt+, ccs=UTF-8");
Kodlama için ccs
izin verilen değerler , UTF-8
ve UTF-16LE
şeklindedirUNICODE
.
Bir dosya Unicode modunda açıldığında, giriş işlevleri dosyadan okunan verileri türü wchar_t
olarak depolanan UTF-16 verilerine çevirir. Unicode modunda açılan bir dosyaya yazan işlevler, türü wchar_t
olarak depolanan UTF-16 verilerini içeren arabellekleri bekler. Dosya UTF-8 olarak kodlanmışsa UTF-16 verileri yazıldığında UTF-8'e çevrilir. Dosyanın UTF-8 kodlu içeriği okunduğunda UTF-16'ya çevrilir. Unicode modunda tek sayıda bayt okuma veya yazma girişimi parametre doğrulama hatasına neden olur. Programınızda UTF-8 olarak depolanan verileri okumak veya yazmak için Unicode modu yerine metin veya ikili dosya modu kullanın. Gerekli kodlama çevirisi sizin sorumluluğundadır.
Dosya zaten varsa ve okuma veya ekleme için açıldıysa, dosyadaki herhangi bir bayt sırası işareti (BOM) kodlamayı belirler. BOM kodlaması, bayrağı tarafından belirtilen kodlamadan önceliklidir ccs
. 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 dosyalara (yani bayrağı geçirerek ccs
) uygulanır.
Aşağıdaki tabloda, dosyada ve Bayt Sırası İşaretlerine verilen fopen
çeşitli ccs
bayraklar için kullanılan modlar özetlenir.
Ccs bayrağını ve BOM'u temel alan kodlamalar
ccs bayrak |
Ürün reçetesi yok (veya yeni dosya) | BOM: UTF-8 | BOM: UTF-16 |
---|---|---|---|
UNICODE |
UTF-16LE |
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.
Bir encoding
değer içinse mode
a, ccs=encoding
, fopen
önce hem okuma hem de yazma erişimini kullanarak dosyayı açmaya çalışır. Bu eylem 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, fopen
salt yazma erişimi kullanarak dosyayı yeniden açar. (Bu davranış mod için "a"
değil yalnızca mod için "a+"
geçerlidir.)
Genel metin yordamı eşlemeleri
TCHAR.H olağan |
_UNICODE ve _MBCS tanımlanmadı |
_MBCS tanımlanan |
_UNICODE tanımlanan |
---|---|---|---|
_tfopen |
fopen |
fopen |
_wfopen |
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 ç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 erişim türü 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 herhangi bir yazma işlemi gerçekleştirilmeden önce her zaman dosyanın sonuna geri taşınır. Bu nedenle, mevcut verilerin üzerine yazılamaz.
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. Dosyaya eklenmeden önce mod, "a+"
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 etkinleştirilir (dosyanın "güncelleştirme" için açık olduğu söylenir). Ancak, okumadan yazmaya geçtiğiniz zaman, giriş işlemi bir EOF işaretçisi ile karşılaşmalıdır. EOF 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.
Önceki değerlere ek olarak, yeni satır karakterleri için çeviri modunu belirtmek üzere aşağıdaki karakterler eklenebilir mode
.
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. Ayrıca, 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 modunda Z, CTRL
+girişte EOF karakteri olarak yorumlanır. kullanılarak "a+"
okuma/yazma için açılan dosyalarda, fopen
dosyanın sonunda ZCTRL
+ olup olmadığını denetler ve mümkünse kaldırır. Z ile CTRL
+biten bir dosyanın içinde ve kullanmak fseek
ftell
, dosyanın sonuna yakın bir şekilde hatalı şekilde davranmasına neden fseek
olabileceğinden kaldırılır.
Metin modunda satır başı besleme (CRLF) birleşimleri girişteki tek satırlı akış (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. Bu nedenle, 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 modları kullanma hakkında daha fazla bilgi için bkz . Metin ve ikili mod dosya G/Ç ve metin ve ikili modlarda Unicode akış G/Ç.
Daha fazla davranış belirtmek için aşağıdaki seçenekler sonuna mode
eklenebilir.
mode Değiştirici |
Davranış |
---|---|
x |
zaten varsa filename işlevi başarısız olacak şekilde zorlar. Yalnızca "w" veya "w+" tanımlayıcılarıyla kullanılabilir. |
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ı COMMODE.OBJ bağlarsanız genel işleme bayrağını geçersiz kılar. Programınızı COMMODE ile açıkça bağlamadığınız sürece genel işleme bayrağı varsayılan olarak "işleme yok" olur. OBJ (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=encoding |
Bu dosya için kullanılacak kodlanmış karakter kümesini (, veya UNICODE ) UTF-8 UTF-16LE belirtir. ANSI kodlaması istiyorsanız belirtilmemiş bırakın. Bu bayrak, önündeki bayraklardan virgülle (, ) ayrılır. Örneğin: FILE *f = fopen("newfile.txt", "rt+, ccs=UTF-8"); |
ve içinde _fdopen
fopen
kullanılan _sopen
_open
bağımsız değişkenlere oflag
karşılık gelen dize için mode
geçerli karakterler aşağıda gösterildiği gibi.
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ş) |
x |
_O_EXCL |
c |
Hiçbiri |
n |
Hiçbiri |
S |
_O_SEQUENTIAL |
R |
_O_RANDOM |
T |
_O_SHORTLIVED |
D |
_O_TEMPORARY |
ccs=UNICODE |
_O_WTEXT |
*ccs=UTF-8* |
_O_UTF8 |
ccs=UTF-16LE |
_O_UTF16 |
Modu kullanıyorsanız rb
kodunuzu taşımanız gerekmez ve büyük bir dosyanın çoğunu okumayı bekliyorsanız veya ağ performansı konusunda endişeleriniz yoksa, bellekle eşlenen Win32 dosyalarını bir seçenek olarak kullanıp kullanmayabileceğinizi de düşünebilirsiniz.
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
.
c
, , n
, R
, S
, , t
, T
ve D
mode
seçenekleri ve için fopen
_wfopen
Microsoft uzantılarıdır ve ANSI taşınabilirliği istediğinizde kullanılmamalıdır.
Gereksinimler
İşlev | Gerekli başlık |
---|---|
fopen |
<stdio.h> |
_wfopen |
<stdio.h> veya <wchar.h> |
_wfopen
bir Microsoft uzantısıdır. Uyumluluk hakkında daha fazla bilgi için bkz . Uyumluluk.
c
, , n
, t
, S
, , R
, T
ve D
mode
seçenekleri ve için fopen
_fdopen
Microsoft uzantılarıdır ve ANSI taşınabilirliğinin istendiği yerde kullanılmamalıdır.
Örnek 1
Aşağıdaki program iki dosya açar. İlk dosyayı kapatmak ve _fcloseall
kalan tüm dosyaları kapatmak için kullanırfclose
.
// crt_fopen.c
// compile with: /W3
// 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 )
{
int numclosed;
// Open for read (will fail if file "crt_fopen.c" does not exist)
if( (stream = fopen( "crt_fopen.c", "r" )) == NULL ) // C4996
// Note: fopen is deprecated; consider using fopen_s instead
printf( "The file 'crt_fopen.c' was not opened\n" );
else
printf( "The file 'crt_fopen.c' was opened\n" );
// Open for write
if( (stream2 = fopen( "data2", "w+" )) == NULL ) // C4996
printf( "The file 'data2' was not opened\n" );
else
printf( "The file 'data2' was opened\n" );
// Close stream if it is not NULL
if( stream)
{
if ( fclose( stream ) )
{
printf( "The file 'crt_fopen.c' was not closed\n" );
}
}
// All other files are closed:
numclosed = _fcloseall( );
printf( "Number of files closed by _fcloseall: %u\n", numclosed );
}
The file 'crt_fopen.c' was opened
The file 'data2' was opened
Number of files closed by _fcloseall: 1
Örnek 2
Aşağıdaki program, Unicode kodlaması olan metin modunda bir dosya oluşturur (veya varsa üzerine yazar). Ardından dosyaya iki dize yazar ve dosyayı kapatır. Çıktı, çıkış bölümündeki verileri içeren adlı _wfopen_test.xml
bir dosyadır.
// crt__wfopen.c
// compile with: /W3
// This program creates a file (or overwrites one if
// it exists), in text mode using Unicode encoding.
// It then writes two strings into the file
// and then closes the file.
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <wchar.h>
#define BUFFER_SIZE 50
int main(int argc, char** argv)
{
wchar_t str[BUFFER_SIZE];
size_t strSize;
FILE* fileHandle;
// Create an the xml file in text and Unicode encoding mode.
if ((fileHandle = _wfopen( L"_wfopen_test.xml",L"wt+,ccs=UNICODE")) == NULL) // C4996
// Note: _wfopen is deprecated; consider using _wfopen_s instead
{
wprintf(L"_wfopen failed!\n");
return(0);
}
// Write a string into the file.
wcscpy_s(str, sizeof(str)/sizeof(wchar_t), L"<xmlTag>\n");
strSize = wcslen(str);
if (fwrite(str, sizeof(wchar_t), strSize, fileHandle) != strSize)
{
wprintf(L"fwrite failed!\n");
}
// Write a string into the file.
wcscpy_s(str, sizeof(str)/sizeof(wchar_t), L"</xmlTag>");
strSize = wcslen(str);
if (fwrite(str, sizeof(wchar_t), strSize, fileHandle) != strSize)
{
wprintf(L"fwrite failed!\n");
}
// Close the file.
if (fclose(fileHandle))
{
wprintf(L"fclose failed!\n");
}
return 0;
}
Ayrıca bkz.
Akış G/Ç
Çok baytlı karakter dizilerinin yorumlanması
fclose
, _fcloseall
_fdopen
, _wfdopen
ferror
_fileno
freopen
, _wfreopen
_open
, _wopen
_setmode
_sopen
, _wsopen