fopen、_wfopen临时
文件名。
啟用的訪問類型。
這些函數(shù)均返回指向打開文件的指針。?一個(gè) null 指針值指示錯(cuò)誤。?如果?filename?或?mode?為?NULL?或空字符串,這些函數(shù)將觸發(fā)無(wú)效參數(shù)處理程序(如參數(shù)驗(yàn)證所述)。?如果允許執(zhí)行繼續(xù),則這些函數(shù)返回?NULL?并將?errno?設(shè)置為?EINVAL。
有關(guān)更多信息,請(qǐng)參見?errno、_doserrno、_sys_errlist 和 _sys_nerr。
備注fopen?函數(shù)打開?filename?指定的文件。?_wfopen?是?fopen?的寬字符版本;_wfopen?的參數(shù)是寬字符串。?除此以外,_wfopen?和?fopen?的行為完全相同。?僅使用?_wfopen?不會(huì)影響在文件流中使用的編碼字符集。
fopen?接受執(zhí)行時(shí)在文件系統(tǒng)上有效的路徑;fopen?還接受 UNC 路徑和包含映射的網(wǎng)絡(luò)驅(qū)動(dòng)器的路徑(前提是執(zhí)行代碼的系統(tǒng)在執(zhí)行時(shí)能夠訪問共享或映射的驅(qū)動(dòng)器)。?為?fopen?構(gòu)造路徑時(shí),請(qǐng)確保驅(qū)動(dòng)器、路徑或網(wǎng)絡(luò)共享在執(zhí)行環(huán)境中可用。?可使用斜杠 (/) 或反斜杠 (\) 作為路徑中的目錄分隔符。
對(duì)文件執(zhí)行任何進(jìn)一步操作前,請(qǐng)始終檢查返回值以確定指針是否為 NULL。?如果發(fā)生錯(cuò)誤,系統(tǒng)將設(shè)置全局變量?errno,此變量可用于獲取特定錯(cuò)誤信息。?有關(guān)更多信息,請(qǐng)參見?errno、_doserrno、_sys_errlist 和 _sys_nerr。
Unicode 支持
fopen?支持 Unicode 文件流。?若要打開 Unicode 文件,請(qǐng)將指定所需編碼的?ccs?標(biāo)志傳遞到?fopen,如下所示。
fopen(&fp, "newfile.txt", "rt+,?ccs=?encoding?");
允許使用的?encoding?值為?UNICODE、UTF-8?和?UTF-16LE。
如果文件已存在并已打開以進(jìn)行讀取或追加,字節(jié)順序標(biāo)記 (BOM)(如果文件中有)將確定編碼。?BOM 編碼優(yōu)先于?ccs?標(biāo)志指定的編碼。?只有在沒有 BOM 或文件是新文件時(shí),才使用?ccs?編碼。
| BOM 檢測(cè)僅適用于在 Unicode 模式下(即通過傳遞?ccs?標(biāo)志)打開的文件。 |
下表匯總的模式用于傳遞到文件中的?fopen?和字節(jié)順序標(biāo)記的各種?ccs?標(biāo)志。
基于 ccs 標(biāo)志和 BOM 使用的編碼| UNICODE | UTF-16LE | UTF-8 | UTF-16LE |
| UTF-8 | UTF-8 | UTF-8 | UTF-16LE |
| UTF-16LE | UTF-16LE | UTF-8 | UTF-16LE |
在 Unicode 模式下打開以進(jìn)行寫入的文件將自動(dòng)寫入 BOM。
如果?mode?為“a, ccs=<encoding>”,fopen?將先嘗試使用讀取和寫入訪問權(quán)限打開文件。?如果成功,此函數(shù)將讀取 BOM 以確定文件的編碼;如果失敗,此函數(shù)將使用文件的默認(rèn)編碼。?無(wú)論何種情況,fopen?隨后均將通過只寫訪問權(quán)限打開文件。(這僅適用于?a?模式,不適用于?a+?模式。)
一般文本例程映射| _tfopen | fopen | fopen | _wfopen |
字符串?mode?指定為文件請(qǐng)求的訪問類型,如下所示。
"r"打開以便讀取。?如果文件不存在或找不到,fopen?調(diào)用將失敗。
打開用于寫入的空文件。?如果給定文件存在,則其內(nèi)容會(huì)被銷毀。
在文件末尾打開以進(jìn)行寫入(追加),在新數(shù)據(jù)寫入到文件之前不移除文件末尾 (EOF) 標(biāo)記。?創(chuàng)建文件(如果文件不存在)。
打開以便讀取和寫入。?文件必須存在。
打開用于讀取和寫入的空文件。?如果文件存在,則其內(nèi)容會(huì)被銷毀。
打開以進(jìn)行讀取和追加。?追加操作包括在新數(shù)據(jù)寫入文件之前移除 EOF 標(biāo)記。?寫入完成后,EOF 標(biāo)記不會(huì)還原。?創(chuàng)建文件(如果文件不存在)。
使用?"a"?訪問類型或?"a+"?訪問類型打開文件時(shí),所有寫入操作均將在文件末尾進(jìn)行。?使用?fseek?或?rewind?可重新定位文件指針,但在執(zhí)行任何寫入操作前,文件指針將始終被移回文件末尾。?因此,無(wú)法覆蓋現(xiàn)有數(shù)據(jù)。
在 EOF 標(biāo)記追加到文件之前,"a"?模式不會(huì)將其移除。?在追加后,MS-DOS TYPE 命令只顯示原始 EOF 標(biāo)記之前的數(shù)據(jù),不顯示追加到文件的任何數(shù)據(jù)。?EOF 標(biāo)記追加到文件之前,"a+"?模式不會(huì)將其移除。?在追加后,MS-DOS TYPE 命令顯示文件中的所有數(shù)據(jù)。?需使用?"a+"?模式才能附加到通過 CTRL+Z EOF 標(biāo)記終止的流文件。
指定?"r+"、"w+"?或?"a+"?訪問類型時(shí),允許讀取和寫入(文件將處于打開狀態(tài)以進(jìn)行“更新”)。?但是,當(dāng)你從讀取切換到寫入時(shí),輸入操作必須遇到 EOF 標(biāo)記。?如果沒有 EOF,必須使用對(duì)文件定位函數(shù)的干預(yù)調(diào)用。?文件定位函數(shù)是?fsetpos、fseek?和?rewind。?從寫入切換到讀取時(shí),必須使用對(duì)?fflush?或文件定位函數(shù)的干預(yù)調(diào)用。
除了前面的值以外,可將以下字符追加到?mode?以指定換行符的轉(zhuǎn)換模式。
t在文本(轉(zhuǎn)換)模式下打開。?在此模式下,CTRL+Z 將在輸入時(shí)解釋為 EOF 字符。?在使用?"a+"?打開以進(jìn)行讀取/寫入的文件中,fopen?將檢查文件末尾的 CTRL+Z 并將其移除(如果可能)。?這是因?yàn)槭褂?fseek?和?ftell?在以 CTRL+Z 結(jié)尾的文件中移動(dòng)時(shí),可能導(dǎo)致?fseek?在文件末尾附近錯(cuò)誤運(yùn)行。
在文本模式下,輸入時(shí),回車-換行組合將轉(zhuǎn)換為單一的換行,輸出時(shí),換行字符將轉(zhuǎn)換為回車-換行組合。?當(dāng) Unicode 流 I/O 函數(shù)在文本模式(默認(rèn)設(shè)置)下運(yùn)行時(shí),源或目標(biāo)流將假定為一系列多字節(jié)字符。?因此,Unicode 流輸入函數(shù)將多字節(jié)字符轉(zhuǎn)換為寬字符(就像調(diào)用?mbtowc?函數(shù)一樣)。?出于同一原因,Unicode 流輸出函數(shù)將寬字符轉(zhuǎn)換為多字節(jié)字符(就像調(diào)用?wctomb?函數(shù)一樣)。
b在二進(jìn)制(未轉(zhuǎn)換)模式下打開;不進(jìn)行涉及回車和換行字符的轉(zhuǎn)換。
如果?t?或?b?在?mode?中未給出,則默認(rèn)轉(zhuǎn)換模式由全局變量?_fmode?定義。?如果?t?或?b?是該參數(shù)的前綴,則函數(shù)將失敗并返回?NULL。
有關(guān)如何在 Unicode 和多字節(jié)流 I/O 中使用文本和二進(jìn)制模式的更多信息,請(qǐng)參見文本和二進(jìn)制模式文件 I/O?和?文本和二進(jìn)制模式下的 Unicode 流 I/O。
c啟用關(guān)聯(lián)?filename?的提交標(biāo)志,以便在調(diào)用?fflush?或?_flushall?時(shí)將文件緩沖區(qū)的內(nèi)容直接寫入磁盤。
將關(guān)聯(lián)?filename?的提交標(biāo)志重置為“no-commit”。這是默認(rèn)設(shè)置。?如果將程序顯式鏈接到 COMMODE.OBJ,它還將重寫全局提交標(biāo)志。?除非將程序顯式鏈接到 COMMODE.OBJ,全局提交標(biāo)志默認(rèn)為“no-commit”(請(qǐng)參見鏈接選項(xiàng))。
指定文件不由子進(jìn)程繼承。
指定緩存針對(duì)(但不限于)從磁盤的順序訪問進(jìn)行優(yōu)化。
指定緩存針對(duì)(但不限于)從磁盤的隨機(jī)訪問進(jìn)行優(yōu)化。
將文件指定為臨時(shí)。?如果可能,它不會(huì)刷新到磁盤。
將文件指定為臨時(shí)。?最后一個(gè)文件指針關(guān)閉時(shí),它將被刪除。
指定要使用的編碼字符集(UTF-8、UTF-16LE?或?UNICODE)。?如果需要 ANSI 編碼,請(qǐng)不要指定此字符集。
在?fopen?和?_fdopen?中使用的?mode?字符串的有效字符對(duì)應(yīng)于在?_open?和?_sopen?中使用的?oflag?參數(shù)。
| a | _O_WRONLY | _O_APPEND?(通常為?_O_WRONLY | _O_CREAT | _O_APPEND) |
| a+ | _O_RDWR | _O_APPEND?(通常為?_O_RDWR | _O_APPEND | _O_CREAT?) |
| r | _O_RDONLY |
| r+ | _O_RDWR |
| w | _O_WRONLY?(通常為?_O_WRONLY | _O_CREAT | _O_TRUNC) |
| w+ | _O_RDWR?(通常為?_O_RDWR | _O_CREAT | _O_TRUNC) |
| b | _O_BINARY |
| t | _O_TEXT |
| c | 無(wú) |
| n | 無(wú) |
| 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 |
如果你使用?rb?模式、不必移植代碼、希望讀取大文件中的大部分內(nèi)容或不擔(dān)心網(wǎng)絡(luò)性能,你可能還要考慮是否使用內(nèi)存映射的 Win32 文件方式。
要求| fopen | <stdio.h> |
| _wfopen | <stdio.h> 或 <wchar.h> |
有關(guān)兼容性的更多信息,請(qǐng)參見兼容性。
c?、n、t、S、R、T?和?Dmode?選項(xiàng)是?fopen?和?_fdopen?的 Microsoft 擴(kuò)展,不應(yīng)在需要 ANSI 可移植性時(shí)使用。
示例以下程序打開兩個(gè)文件。它使用?fclose?關(guān)閉第一個(gè)文件,使用?_fcloseall?關(guā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 insteadprintf( "The file 'crt_fopen.c' was not opened\n" );elseprintf( "The file 'crt_fopen.c' was opened\n" );// Open for write if( (stream2 = fopen( "data2", "w+" )) == NULL ) // C4996printf( "The file 'data2' was not opened\n" );elseprintf( "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 ); } <span id="mt112" class="sentence" data-guid="36160afb7487ebf03eb3d7b8c058e6e0" data-source="" the="" file="" 'crt_fopen.c'="" was="" opened"="" xml:space="preserve">文件“crt_fopen.c”已打開 文件“data2”已打開 由 _fcloseall 所關(guān)閉的文件數(shù)量為:1以下程序在具有 Unicode 編碼的文本模式下創(chuàng)建文件(或在文件存在時(shí)覆蓋文件)。然后,它將兩個(gè)字符串寫入文件并關(guān)閉文件。?輸出是名為 _wfopen_test.xml 的文件,其中包含輸出部分中的數(shù)據(jù)。
// 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 50int 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 等效項(xiàng)總結(jié)
以上是生活随笔為你收集整理的fopen、_wfopen临时的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: xshell进入桌面_Xshell怎么远
- 下一篇: 想要成为软件开发中的王者,需要明白的 2