簡體   English   中英

使用 fgetwc() 和 fread() 的寬字符輸入

[英]Wide character input using fgetwc() and fread()

FILE stream讀取寬字符時, fgetwc()fread()可以互換使用嗎?

很容易假設fgetwc()可能像這樣工作:

wint_t fgetwc(FILE *src) {
  wchar_t c;
  size_t n_bytes = fread(&c, sizeof (wchar_t), 1, src);
  return (n_bytes == sizeof (wchar_t)) ? c : WEOF;
}

雖然,我懷疑這種實現在大端系統上可能會失敗。

fgetwc()fread()可以互換使用嗎?

不容易。


一旦發生窄或寬讀/寫,stream方向設置為讀取字符。

fread()是一個窄 function。其他: fgetc, fgets, fprintf, fputc, fputs, fread, fscanf, fwrite, getc, getchar, printf, putc, putchar, puts, scanf, ungetc, vfprintf, vfscanf, vprintf, and vscanf )

fgetwc()是一個廣泛的。 其他: fgetws, getwc, getwchar, fwscanf, wscanf, vfwscanf, vwscanf, fputwc, fputws, putwc, putwchar, fwprintf, wprintf, vfwprintf, vwprintf

使用fwide()freopen()改變方向。

最好不要混合窄/寬函數,否則可能會發生錯誤(編碼)。


endian是一個單獨的問題。 OP 的fgetwc()沒有考慮方向,也沒有很好地處理字節序問題。

fgetwc不會“讀取寬字符”。 它讀取一個多字節字符(如今,通常是一個 UTF-8 序列)並將其轉換為一個wchar_t 類似地, fputwc獲取一個wchar_t並將其作為多字節序列寫出。

如果您想實際讀取或寫入wchar_t單元,則需要使用freadfwrite ,並且您應該以二進制模式打開文件,以防wchar_t中的字節之一在文本文件中進行特殊處理。

freadfwrite被認為是面向字節的,因此它們不能與面向寬的 I/O 混合。


注意:顯然,如果文件以二進制模式打開,則 fgetwc 和 fputwc 的 Windows 庫實現會讀取和寫入wchar_t單元。 對於以文本模式打開的文件,其行為如上所述。 請參閱MSDN 文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM