使用FGETWC()和FREAD()

问题描述 投票:0回答:2

当从

FILE
流读取广泛的角色时,可以互换使用?
fgetwc()
诱惑,假设
fread()

可能会这样起作用:

fgetwc()

尽管如此,我怀疑这种实施可能会在大型Endian系统上失败。
	

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; }
c file-io wchar-t
2个回答
2
投票
多人字符

(如今,通常是UTF-8序列),并将其转换为

fgetwc
。同样,wchar_t采用一个
fputwc
并将其写出为多重序列。
如果您想实际读取或写入
wchar_t
单位,则需要使用
wchar_t

fread

,并且如果the the the the the the the the the the the the the the the the the the the the Special的字节之一可能会以二进制模式打开文件在文本文件中处理。
fwrite
wchar_t
被认为是面向字节的,因此不能将其与宽面向I/O.
混合。

注:显然,FGETWC和FPUTWC的Windows库实现确实读取和写入

fread

单位
如果该文件以二进制模式打开。在文本模式下打开文件时,该行为如上所述。请参阅
MMSDN文档


可以互换使用?

不容易

一旦发生狭窄或宽的读/写入,流的方向

0
投票
wide

narrow

字符。
fwrite
是一个狭窄的功能。其他:

wchar_t


fgetwc()

是宽阔的。其他:fread(). 使用fread()

fgetc, fgets, fprintf, fputc, fputs, fread, fscanf, fwrite, getc, getchar, printf, putc, putchar, puts, scanf, ungetc, vfprintf, vfscanf, vprintf, and vscanf

改变方向。

最不可能混合狭窄/宽功能,其他错误可能发生。
fgetwc()

是一个单独的问题。 OP's

fgetws, getwc, getwchar, fwscanf, wscanf, vfwscanf, vwscanf, fputwc, fputws, putwc, putwchar, fwprintf, wprintf, vfwprintf, vwprintf

没有考虑到方向,也没有肯定可以很好地处理endian问题。
    
我认为

fwide()

内部表示,不是为外部使用而设计的。  据我所知,它们通常在不同系统之间的便携。  (例如,正如OP指出的那样,可能存在字节订购问题。)
我认为这就是为什么Rici的答案指出,“显而易见的”函数读取(分别写入)宽字符实际上,将(可能是多键)字符读成一个(分别,将宽字符作为一个可能是一个可能的字符多重字符)
另一方面,在编程时,可以理解的是,一个人想了解二进制表示形式,尤其是在射击麻烦时。  RICI的答案指出了一个人可能会如何倾倒,甚至以后,也可以使用相同的系统
,负载,内部表示,测试,调试。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.