Aracılığıyla paylaş


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 EINVALayarlanırerrno.

Daha fazla bilgi için bkz. errno, _doserrno, _sys_errlistve _sys_nerr.

Açıklamalar

fopen işlevi tarafından filenamebelirtilen 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 fopenbir 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 fopenyollar 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_errlistve _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ı fopenbelirten bir ccs=encoding bayrak geçirin.

FILE *fp = fopen("newfile.txt", "rt+, ccs=UTF-8");

Kodlama için ccs izin verilen değerler , UTF-8ve UTF-16LEşeklindedirUNICODE.

Bir dosya Unicode modunda açıldığında, giriş işlevleri dosyadan okunan verileri türü wchar_tolarak depolanan UTF-16 verilerine çevirir. Unicode modunda açılan bir dosyaya yazan işlevler, türü wchar_tolarak 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 rewindkullanı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 , fseekve 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 modeverilmediyse, varsayılan çeviri modu genel değişkeni _fmodetarafı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-8UTF-16LEbelirtir. 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ın FILE_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ştirebilirsiniz TD .

c, , n, R, S, , t, Tve 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, Tve 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.xmlbir 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