fopen
, _wfopen
Membuka file. Versi yang lebih aman dari fungsi-fungsi ini yang melakukan lebih banyak validasi parameter dan kode kesalahan pengembalian tersedia; lihat fopen_s
, _wfopen_s
.
Sintaks
FILE *fopen(
const char *filename,
const char *mode
);
FILE *_wfopen(
const wchar_t *filename,
const wchar_t *mode
);
Parameter
filename
Nama file.
mode
Jenis akses yang diaktifkan.
Nilai hasil
Masing-masing fungsi ini mengembalikan penunjuk ke file yang terbuka. Nilai penunjuk null menunjukkan kesalahan. Jika filename
atau mode
adalah NULL
atau string kosong, fungsi-fungsi ini memicu handler parameter yang tidak valid, yang dijelaskan dalam Validasi parameter. Jika eksekusi diizinkan untuk melanjutkan, fungsi-fungsi ini kembali NULL
dan diatur errno
ke EINVAL
.
Untuk informasi selengkapnya, lihat errno
, _doserrno
, _sys_errlist
, dan _sys_nerr
.
Keterangan
Fungsi fopen
membuka file yang ditentukan oleh filename
. Secara default, string sempit filename
ditafsirkan menggunakan halaman kode ANSI (CP_ACP
). Di aplikasi Windows Desktop, aplikasi dapat diubah ke halaman kode OEM (CP_OEMCP
) dengan menggunakan SetFileApisToOEM
fungsi . Anda dapat menggunakan AreFileApisANSI
fungsi untuk menentukan apakah filename
ditafsirkan menggunakan ANSI atau halaman kode OEM default sistem. _wfopen
adalah versi fopen
karakter lebar ; _wfopen
argumen adalah string karakter lebar. Jika tidak, _wfopen
dan fopen
berulah identik. Hanya menggunakan _wfopen
tidak memengaruhi kumpulan karakter berkode yang digunakan dalam aliran file.
fopen
menerima jalur yang valid pada sistem file pada titik eksekusi; fopen
menerima jalur dan jalur UNC yang melibatkan drive jaringan yang dipetakan selama sistem yang menjalankan kode memiliki akses ke drive yang dibagikan atau dipetakan pada saat eksekusi. Saat Anda membuat jalur untuk fopen
, pastikan drive, jalur, atau berbagi jaringan tersedia di lingkungan eksekusi. Anda dapat menggunakan garis/
miring () atau garis miring terbalik (\
) sebagai pemisah direktori di jalur.
Selalu periksa nilai yang dikembalikan untuk melihat apakah pointer adalah NULL sebelum Anda melakukan operasi lain pada file. Jika terjadi kesalahan, variabel errno
global diatur, dan dapat digunakan untuk mendapatkan informasi kesalahan tertentu. Untuk informasi selengkapnya, lihat errno
, _doserrno
, _sys_errlist
, dan _sys_nerr
.
Secara default, status global fungsi ini dicakup ke aplikasi. Untuk mengubahnya, lihat Status global di CRT.
Dukungan Unicode
fopen
mendukung aliran file Unicode. Untuk membuka file Unicode, berikan ccs=encoding
bendera yang menentukan pengodean yang diinginkan ke fopen
, sebagai berikut.
FILE *fp = fopen("newfile.txt", "rt+, ccs=UTF-8");
Nilai yang diizinkan untuk ccs
pengodean adalah UNICODE
, UTF-8
, dan UTF-16LE
.
Saat file dibuka dalam mode Unicode, fungsi input menerjemahkan data yang dibaca dari file ke dalam data UTF-16 yang disimpan sebagai jenis wchar_t
. Fungsi yang menulis ke file yang dibuka dalam mode Unicode mengharapkan buffer yang berisi data UTF-16 yang disimpan sebagai jenis wchar_t
. Jika file dikodekan sebagai UTF-8, maka data UTF-16 diterjemahkan ke dalam UTF-8 saat ditulis. Konten yang dikodekan UTF-8 file diterjemahkan ke dalam UTF-16 saat dibaca. Upaya untuk membaca atau menulis jumlah byte ganjil dalam mode Unicode menyebabkan kesalahan validasi parameter. Untuk membaca atau menulis data yang disimpan dalam program Anda sebagai UTF-8, gunakan mode teks atau file biner alih-alih mode Unicode. Anda bertanggung jawab atas terjemahan pengodean yang diperlukan.
Jika file sudah ada dan dibuka untuk dibaca atau ditambahkan, maka tanda urutan byte (BOM) apa pun dalam file menentukan pengodean. Pengodean BOM lebih diutamakan daripada pengodean yang ditentukan oleh ccs
bendera. Pengodean ccs
hanya digunakan ketika tidak ada BOM yang ada atau file adalah file baru.
Catatan
Deteksi BOM hanya berlaku untuk file yang dibuka dalam mode Unicode (yaitu, dengan meneruskan ccs
bendera).
Tabel berikut ini meringkas mode yang digunakan untuk berbagai ccs
bendera yang diberikan ke fopen
dan Tanda Urutan Byte dalam file.
Pengodean yang digunakan berdasarkan bendera ccs dan BOM
ccs bendera |
Tidak ada BOM (atau file baru) | 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 |
File yang dibuka untuk ditulis dalam mode Unicode memiliki BOM yang ditulis kepada mereka secara otomatis.
Jika mode
untuk a, ccs=encoding
beberapa encoding
nilai, fopen
pertama-tama mencoba membuka file dengan menggunakan akses baca dan tulis. Jika tindakan ini berhasil, fungsi membaca BOM untuk menentukan pengodean untuk file. Jika gagal, fungsi menggunakan pengodean default untuk file. Dalam kedua kasus, fopen
buka kembali file menggunakan akses tulis-saja. (Perilaku ini hanya berlaku untuk "a"
mode, bukan untuk "a+"
mode.)
Pemetaan rutin teks generik
TCHAR.H Rutin |
_UNICODE dan _MBCS tidak ditentukan |
_MBCS Didefinisikan |
_UNICODE Didefinisikan |
---|---|---|---|
_tfopen |
fopen |
fopen |
_wfopen |
String mode
karakter menentukan jenis akses yang diminta untuk file, sebagai berikut.
mode |
Access |
---|---|
"r" |
Buka untuk membaca. Jika file tidak ada atau tidak dapat ditemukan, fopen panggilan gagal. |
"w" |
Membuka file kosong untuk ditulis. Jika file yang diberikan ada, isinya akan dihancurkan. |
"a" |
Terbuka untuk menulis di akhir file (menambahkan) tanpa menghapus penanda end-of-file (EOF) sebelum data baru ditulis ke file. Membuat file jika tidak ada. |
"r+" |
Terbuka untuk membaca dan menulis. File harus ada. |
"w+" |
Membuka file kosong untuk membaca dan menulis. Jika file ada, isinya akan dihancurkan. |
"a+" |
Terbuka untuk membaca dan menambahkan. Operasi penampingan mencakup penghapusan penanda EOF sebelum data baru ditulis ke file. Penanda EOF tidak dipulihkan setelah penulisan selesai. Membuat file jika tidak ada. |
Ketika file dibuka dengan menggunakan "a"
jenis akses atau "a+"
jenis akses, semua operasi tulis terjadi di akhir file. Penunjuk file dapat diposisikan ulang dengan menggunakan fseek
atau rewind
, tetapi selalu dipindahkan kembali ke akhir file sebelum operasi tulis dilakukan. Oleh karena itu, data yang ada tidak dapat ditimpa.
"a"
Mode tidak menghapus penanda EOF sebelum ditambahkan ke file. Setelah penambahan terjadi, perintah MS-DOS TYPE hanya menampilkan data hingga penanda EOF asli dan bukan data apa pun yang ditambahkan ke file. Sebelum ditambahkan ke file, "a+"
mode menghapus penanda EOF. Setelah menambahkan, perintah MS-DOS TYPE menunjukkan semua data dalam file. "a+"
Mode ini diperlukan untuk menambahkan ke file stream yang dihentikan denganCTRL
+ penanda Z EOF.
"r+"
Ketika jenis akses , , "w+"
atau "a+"
ditentukan, pembacaan dan penulisan diaktifkan (file dikatakan terbuka untuk "pembaruan"). Namun, ketika Anda beralih dari membaca ke menulis, operasi input harus menemukan penanda EOF. Jika tidak ada EOF, Anda harus menggunakan panggilan intervensi ke fungsi pemosisian file. Fungsi penempatan file adalah fsetpos
, , fseek
dan rewind
. Ketika Anda beralih dari menulis ke membaca, Anda harus menggunakan panggilan intervensi ke atau fflush
ke fungsi penempatan file.
Selain nilai sebelumnya, karakter berikut dapat ditambahkan untuk mode
menentukan mode terjemahan untuk karakter baris baru.
mode Pengubah |
Mode terjemahan |
---|---|
t |
Buka dalam mode teks (diterjemahkan). Kombinasi umpan baris kembali pengangkutan (CR-LF) diterjemahkan ke dalam umpan baris tunggal (LF) pada karakter input dan LF diterjemahkan ke kombinasi CR-LF pada output. Selain itu, CTRL+Z ditafsirkan sebagai karakter akhir file pada input. |
b |
Buka dalam mode biner (tidak diterjemahkan) ; terjemahan yang melibatkan karakter carriage-return dan line feed ditekan. |
Dalam mode teks, CTRL
+Z ditafsirkan sebagai karakter EOF pada input. Dalam file yang dibuka untuk membaca/menulis dengan menggunakan "a+"
, fopen
periksaCTRL
+ Z di akhir file dan menghapusnya, jika memungkinkan. Ini dihapus karena menggunakan fseek
dan ftell
untuk berpindah dalam file yang berakhir denganCTRL
+ Z dapat menyebabkan fseek
perilaku salah di dekat akhir file.
Dalam mode teks, kombinasi umpan baris kembali pengangkutan (CRLF) diterjemahkan ke dalam karakter umpan baris tunggal (LF) pada input, dan karakter LF diterjemahkan ke kombinasi CRLF pada output. Ketika fungsi Stream-I/O Unicode beroperasi dalam mode teks (default), aliran sumber atau tujuan diasumsikan sebagai urutan karakter multibyte. Oleh karena itu, fungsi stream-input Unicode mengonversi karakter multibyte menjadi karakter lebar (seolah-olah dengan panggilan ke mbtowc
fungsi). Untuk alasan yang sama, fungsi stream-output Unicode mengonversi karakter lebar menjadi karakter multibyte (seolah-olah dengan panggilan ke wctomb
fungsi).
Jika t
atau b
tidak diberikan dalam mode
, mode terjemahan default ditentukan oleh variabel _fmode
global . Jika t
atau b
diawali ke argumen, fungsi gagal dan mengembalikan NULL
.
Untuk informasi selengkapnya tentang cara menggunakan mode teks dan biner di Unicode dan multibyte stream-I/O, lihat Teks dan file mode biner I/O dan I/O aliran Unicode dalam mode teks dan biner.
Opsi berikut dapat ditambahkan untuk mode
menentukan lebih banyak perilaku.
mode Pengubah |
Perilaku |
---|---|
x |
Memaksa fungsi gagal jika filename sudah ada. Hanya dapat digunakan dengan penentu "w" atau "w+". |
c |
Aktifkan bendera penerapan untuk yang terkait filename sehingga konten buffer file ditulis langsung ke disk jika atau fflush _flushall dipanggil. |
n |
Reset bendera penerapan untuk yang terkait filename dengan "tanpa penerapan." Bendera ini adalah default. Ini juga mengambil alih bendera penerapan global jika Anda menautkan program Anda dengan COMMODE.OBJ. Default bendera penerapan global adalah "tanpa penerapan" kecuali Anda secara eksplisit menautkan program Anda dengan COMMODE. OBJ (lihat Opsi tautan). |
N |
Menentukan bahwa file tidak diwariskan oleh proses turunan. |
S |
Menentukan bahwa penembolokan dioptimalkan untuk, tetapi tidak dibatasi, akses berurutan dari disk. |
R |
Menentukan bahwa penembolokan dioptimalkan untuk, tetapi tidak dibatasi, akses acak dari disk. |
T |
Menentukan file yang tidak ditulis ke disk kecuali tekanan memori memerlukannya. |
D |
Menentukan file sementara yang dihapus ketika penunjuk file terakhir ditutup. |
ccs=encoding |
Menentukan set karakter yang dikodekan untuk digunakan (salah satu dari UTF-8 , UTF-16LE , atau UNICODE ) untuk file ini. Biarkan tidak ditentukan jika Anda ingin pengodean ANSI. Bendera ini dipisahkan dari bendera yang mendahuluinya dengan koma (, ). Misalnya: FILE *f = fopen("newfile.txt", "rt+, ccs=UTF-8"); |
Karakter yang valid untuk mode
string yang digunakan dan fopen
_fdopen
sesuai dengan oflag
argumen yang digunakan di _open
dan _sopen
, sebagai berikut.
Karakter dalam mode string |
Nilai yang setara oflag untuk _open /_sopen |
---|---|
a |
_O_WRONLY | _O_APPEND (biasanya _O_WRONLY | _O_CREAT | _O_APPEND ) |
a+ |
_O_RDWR | _O_APPEND (biasanya _O_RDWR | _O_APPEND | _O_CREAT ) |
r |
_O_RDONLY |
r+ |
_O_RDWR |
w |
_O_WRONLY (biasanya _O_WRONLY | _O_CREAT | _O_TRUNC ) |
w+ |
_O_RDWR (biasanya _O_RDWR | _O_CREAT | _O_TRUNC ) |
b |
_O_BINARY |
t |
_O_TEXT (Diterjemahkan) |
x |
_O_EXCL |
c |
Tidak |
n |
Tidak |
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 |
Jika Anda menggunakan rb
mode, Anda tidak perlu mem-port kode Anda, dan jika Anda berharap untuk membaca sebagian besar file besar atau tidak khawatir tentang performa jaringan, Anda mungkin juga mempertimbangkan apakah akan menggunakan file Win32 yang dipetakan memori sebagai opsi.
Mengenai T
dan D
:
T
menghindari penulisan file ke disk selama tekanan memori tidak memerlukannya. Untuk informasi selengkapnya, lihatFILE_ATTRIBUTE_TEMPORARY
di Konstanta atribut file, dan juga posting blog ini Hanya sementara.D
menentukan file reguler yang ditulis ke disk. Perbedaannya adalah dihapus secara otomatis saat ditutup. Anda dapat menggabungkanTD
untuk mendapatkan kedua semantik.
Opsi c
, , R
n
, S
t
, , T
, dan D
mode
adalah ekstensi Microsoft untuk fopen
dan _wfopen
tidak boleh digunakan saat Anda menginginkan portabilitas ANSI.
Persyaratan
Fungsi | Header yang diperlukan |
---|---|
fopen |
<stdio.h> |
_wfopen |
<stdio.h> atau <wchar.h> |
_wfopen
adalah ekstensi Microsoft. Untuk informasi selengkapnya tentang kompatibilitas, lihat Kompatibilitas.
Opsi c
, , t
n
, S
R
, , T
, dan D
mode
adalah ekstensi Microsoft untuk fopen
dan _fdopen
tidak boleh digunakan di mana portabilitas ANSI diinginkan.
Contoh 1
Program berikut membuka dua file. Ini menggunakan fclose
untuk menutup file pertama dan _fcloseall
untuk menutup semua file yang tersisa.
// 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
Contoh 2
Program berikut membuat file (atau menimpa file jika ada), dalam mode teks yang memiliki pengodean Unicode. Kemudian menulis dua string ke dalam file dan menutup file. Output adalah file bernama _wfopen_test.xml
, yang berisi data dari bagian output.
// 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;
}
Lihat juga
Streaming I/O
Interpretasi urutan karakter multibyte
fclose
, _fcloseall
_fdopen
, _wfdopen
ferror
_fileno
freopen
, _wfreopen
_open
, _wopen
_setmode
_sopen
, _wsopen
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk