fopen, _wfopen
Bir dosyayı açar. Bu işlevlerin daha güvenli sürümlerinde kullanılabilir; see fopen_s, _wfopen_s.
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şlevlerden her biri açık olan dosyaya bir işaretçi döndürür. Bir null işaretçi değeri bir hata gösterir. filename Veya mode olan NULL veya boş bir dize, bu işlevler açıklanan işleyici geçersiz parametre tetiklemek Parametre doğrulama. Yürütülmesine devam etmek için izin verilip verilmediğini, bu işlevler dönmek NULL ve errno için EINVAL.
Daha fazla bilgi için bkz. errno, _doserrno, _sys_errlist ve _sys_nerr.
Notlar
fopen İşlevi tarafından belirtilen dosyayı açar filename. _wfopengeniş karakter sürümü fopen; bağımsız _wfopen geniş karakter dizeleridir. Aksi halde, _wfopen ve fopen aynı şekilde davranır. Yalnızca kullanmak _wfopen dosya akışında kullanılan kodlanmış karakter kümesi üzerinde hiçbir etkisi yoktur.
fopengeçerli yürütme noktasında dosya sistemi yolları kabul eder; fopenunc yolları ve yollar içeren paylaşımına erişim kodu yürütür sistemi olduğu sürece eşleştirilmiş ağ sürücüleri veya sürücü yürütme zamanında eşlenen kabul eder. Yolları oluşturmak ne zaman fopen, sürücü, yol veya ağ paylaşımlarına yürütme ortamında kullanılabilir olacaktır emin olun. Bir yolu dizin ayırıcı olarak eğik çizgi (/) veya ters eğik çizgi (\) kullanabilirsiniz.
Her zaman dönüş değeri, herhangi bir dosya üzerinde daha fazla işlem gerçekleştirmeden önce işaretçi null olup olmadığını denetleyin. Bir hata oluşursa, genel değişkeni 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.
Unicode desteği
fopenUnicode dosya akışları destekler. Geçişi Unicode dosyası açmak için bir ccs için istenen kodlamayı belirtir bayrak fopengibi.
fopen(&fp, "newfile.txt", "rw, ccs=encoding");
Allowed values of encoding are UNICODE, UTF-8, and UTF-16LE.
Dosya zaten var ve okuma veya ekleme için açılmış, bayt sırası işareti (dosyasında sunmak, bom), kodlama belirler. Ürün Reçetesi kodlama tarafından belirtilen kodlama üzerinde öncelik kazanır ccs bayrağı. ccs Kodlaması yalnızca kullanılır hiçbir bom mevcut olduğunda veya dosya yeni bir dosyadır.
Not
Yalnızca ürün Reçetesi algılama geçerlidir Unicode modunda açılmış dosyalar için (diğer bir deyişle, bunun geçirerek ccs bayrağı).
Çeşitli için kullanılan modları aşağıdaki tabloda özetlenmiştir ccs bayrakları verilen fopen ve bayt sırası işaretleri dosyasında.
Bayrak ve ürün Reçetesi kodlamaları kullanılan temel alınarak ccs
ccsBayrak |
Hiçbir ürün Reçetesi (veya yeni bir dosya) |
ÜRÜN REÇETESİ: UTF-8 |
ÜRÜN REÇETESİ: 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 için açılan dosyalar otomatik olarak yazılmış bir ürün Reçetesi vardır.
mode Olan "a, ccs=<encoding>", fopen hem okuma ve yazma erişimiyle açmak önce dener. Bu işlem başarılı olursa, işlev için dosya kodlamasını belirlemek için ürün Reçetesi okur; Bu başarısız olursa, dosya için varsayılan kodlama işlevini kullanır. Her iki durumda da fopen dosyayı salt yazılır erişimi ile yeniden açın. (Bu geçerlidir a modu değil sadece a+ mod.)
Genel metin eşlemeleri yordamına girildi
TCHAR.H yordamına girildi |
_UNICODE & _mbcs tanımlanmamış |
Tanımlanan _mbcs |
Tanımlanan _UNICODE |
---|---|---|---|
_tfopen |
fopen |
fopen |
_wfopen |
Karakter dizesi mode gibi dosya için istenen erişim türünü belirtir.
"r"
Okuma için açılır. Dosya yok veya bulunamıyor, fopen çağrısı başarısız."w"
Yazmak için boş bir dosya açar. Verilen dosya varsa, içeriği yok edilir."a"
(Dosya sonu (eof) işareti dosyaya yeni veriler yazılmadan önce kaldırmadan ekleme) dosyanın sonundaki yazma için açar. Yoksa, dosyayı oluşturur."r+"
Hem okuma ve yazma için açar. Dosyanın varolması gerekir."w+"
Hem okumak ve yazmak için boş bir dosya açar. Dosya varsa, içeriği yok edilir."a+"
Ekleme ve okuma için açılır. Dosyaya yeni veriler yazılmadan önce ekleme işlemi eof işaretinin kaldırılması içerir. Yazma işlemi tamamlandıktan sonra eof imleç geri yüklenmiyor. Yoksa, dosyayı oluşturur.
Ne zaman bir dosya açıldığında kullanarak "a" erişim türüne veya "a+" erişim türü, tüm yazma işlemlerini dosyasının sonunda ortaya. Dosya işaretçisini kullanarak yeniden yerleştirilmesini fseek veya rewind, ancak herhangi bir işlem gerçekleştirilir yazmadan önce her zaman geri dosya sonuna taşınır. Bu nedenle, varolan verilerin üzerine yazılamaz.
"a" Mod dosyaya ekler önce eof işaretçisi kaldırmaz. Ekleme gerçekleştikten sonra ms-dos type komutu yalnızca özgün eof işaretçisi kadar veri ve dosyanın sonuna hiçbir veri gösterir. Dosyaya ekler önce "a+" eof imleç modunu kaldırabilirsiniz. Eklenmesinden sonra türü ms-dos komut dosyasındaki tüm verileri gösterir. "a+" Modu ctrl + z eof imi ile sonlandırılan bir akış dosya ekleme için gereklidir.
Zaman "r+", "w+", veya "a+" , hem okuma hem de yazma izin verilen erişim türü belirtilir (dosya açık "güncelleştirmesi" denir). Ancak, okuma yazma geçtiğinizde, giriş işlemi eof işaretçisi sorunlarla gerekir. eof yok ise, aradaki bir arama işlevi konumlandırma bir dosyaya kullanmanız gerekir. Dosya konumlandırma işlevleri fsetpos, fseek, ve rewind. İçin okuma yazma arasında geçiş yaptığınızda, aradaki bir arama ya da kullanma fflush veya bir dosyaya işlevi konumlandırma.
Önceki değerlere ek olarak, aşağıdaki karakterler için eklenebilir mode yeni satır karakterlerini çeviri modunu belirtmek için.
- t
Açık metin modu (çevrilmiş). Bu modda, ctrl + z bir giriş eof karakter olarak yorumlanır. Açılan dosyaları kullanarak okuma/yazma için "a+", fopen için ctrl + z dosyanın sonundaki denetler ve bunu, mümkünse kaldırır. Bu kullanarak çünkü yapılır fseek ve ftell , ctrl + z ile biter neden olabilecek bir dosya içinde taşımak için fseek dosya sonuna yakın hatalı davranmasına.
Metin modunda, satır başı return–linefeed birleşimleri giriş üzerinde tek satır beslemeleri halinde çevrilir ve çıktıyı şaryo return–linefeed birleşimleri için satır besleme karakterleri çevrilir. Ne zaman bir Unicode akış-ı/o işlevi metin modunda (varsayılan), kaynak çalışır veya hedef akış çok baytlı bir karakter dizisi olarak kabul edilir. Bu nedenle, çok baytlı karakterleri Unicode giriş akışı işlevler geniş karakterlerine dönüştürmek (olarak da bir çağrı, mbtowc işlevi). Aynı nedenden dolayı çok baytlı karakterler için Unicode çıkış akışı işlevler geniş karakterler dönüştürme (olarak da bir çağrı, wctomb işlevi).
- b
Açık (untranslated) ikili modda; başı ve satır besleme karakterleri kapsayan çevirileri görüntülenmez.
t Veya b verilmemiştir mode, genel değişkeni tarafından tanımlanan varsayılan çeviri modu _fmode. t Veya b bağımsız değişken, işlev başarısız olur ve döner öneki NULL.
Metin ve ikili modda Unicode ve çok baytlı akış-ı/o nasıl kullanılacağı hakkında daha fazla bilgi için bkz: Metin ve ikili mod dosya g/Ç ve Unicode ç metin ve ikili modları.
c
İlişkili tamamlama bayrağını etkinleştirmek filename dosyası arabellek içeriği, doğrudan diske yazılır, fflush veya _flushall olarak adlandırılır.n
Sıfırlamak için ilişkili tamamlama bayrak filename için "no-zorlamıştır." Bu varsayılandır. Ayrıca programınızı commode.obj ile bağlanıyorsanız genel tamamlama bayrağı geçersiz kılar. Açıkça commode programınızda bağlantı sürece genel tamamlama bayrağı "no-tamamlama" varsayılandır.OBJ (see Bağlantı seçenekleri).N
Dosya, alt işlemler tarafından devralınmadı belirtir.S
Önbelleğe alma için en iyi duruma getirilmiş, ancak sıralı erişim için diskten kısıtlı değil olduğunu belirtir.R
Önbelleğe alma için en iyi duruma getirilmiş, ancak rasgele erişim için diskten kısıtlı değil olduğunu belirtir.T
Bir dosyayı geçici belirtir. Değil aktarılmadan Mümkünse, diske.D
Bir dosyayı geçici belirtir. Son dosya işaretçisini kapatıldığında silinir.ccs=ENCODING
Kullanmak için kodlanmış karakter kümesini belirler (UTF-8, UTF-16LE, veya UNICODE) Bu dosya için. ANSI kodlamasını istiyorsanız belirtilmemiş bırakın.
Geçerli karakterler için mode kullanılan dize fopen ve _fdopen karşılık oflag içinde kullanılan bağımsız değişkenler kapıyı Aç ve _sopengibi.
Mod dizedeki karakter |
Eşdeğer oflag değerini _open/_sopen |
---|---|
a |
_O_WRONLY | _O_APPEND(usually _O_WRONLY | _O_CREAT | _O_APPEND) |
a+ |
_O_RDWR | _O_APPEND(usually _O_RDWR | _O_APPEND | _O_CREAT) |
r |
_O_RDONLY |
r+ |
_O_RDWR |
w |
_O_WRONLY(usually _O_WRONLY | _O_CREAT | _O_TRUNC) |
w+ |
_O_RDWR(usually _O_RDWR | _O_CREAT | _O_TRUNC) |
b |
_O_BINARY |
t |
_O_TEXT |
c |
None |
n |
None |
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 |
Kullanıyorsanız, rb modu, bağlantı noktası kodu ve çoğu, büyük boyutlu bir dosyayı okumak beklemeniz gerekmez veya ağ performansı hakkında endişe değil, bellek kullanmak için Win32 dosya bir seçenek olarak eşlenen olup olmadığını düşünebilirsiniz.
Gereksinimler
İşlev |
Gerekli başlık |
---|---|
fopen |
<stdio.h> |
_wfopen |
<stdio.h> veya <wchar.h> |
Uyumluluk hakkında daha fazla bilgi için bkz: Uyumluluk.
c, n, t, S, R, T, Ve Dmode seçenekleri için Microsoft uzantıları olan fopen ve _fdopen ve burada ANSI taşınabilirlik istendiğini kullanılmamalıdır.
Örnek
Aşağıdaki programı iki dosyaları açar. Kullandığı fclose ilk dosyayı kapatın ve _fcloseall kalan tüm dosyaları kapatın.
// 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 );
}
Aşağıdaki programı bir dosya oluşturur (veya varsa, bir yazar), Unicode kodlaması vardır, metin modunda. İki dizeyi dosyasına yazar ve dosyayı kapatır. Çıktı Çıktı bölümündeki verileri içeren _wfopen_test.xml adlı 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;
}
.NET Framework Eşdeğeri
System::IO::FileStream::FileStream