gpt4 book ai didi

c - fopen 一切 - 这可能吗?

转载 作者:太空狗 更新时间:2023-10-29 16:24:57 26 4
gpt4 key购买 nike

我曾经对 Windows 进行编程,但我想尝试制作一个跨平台的应用程序。如果您不介意的话,我还有一些问题:

问题一

有什么方法可以打开 UNICODE\ASCII 文件并使用裸 ANSI C 自动检测它的编码。MSDN 说 fopen() 可以在各种 UNICODE 格式(utf-8、utf-16、UNICODE BI\LI)之间切换,如果我将使用“ccs=UNICODE”标志。实验发现,从 UNICODE 到 ASCII 的切换并没有发生,但在尝试解决这个问题时,我发现文本 Unicode 文件有一些前缀,如 0xFFFE、0xFEFF 或 0xFEBB。

FILE *file;
{
__int16 isUni;
file = _tfopen(filename, _T("rb"));
fread(&(isUni),1,2,file);
fclose(file);
if( isUni == (__int16)0xFFFE || isUni == (__int16)0xFEFF || isUni == (__int16)0xFEBB)
file = _tfopen(filename, _T("r,ccs=UNICODE"));
else
file = _tfopen(filename, _T("r"));
}

那么,我能不能做出像这样跨平台的东西,而且不那么丑?

问题二

我可以在 Windows 中做类似的事情,但它在 Linux 中行得通吗?

file = fopen(filename, "r");
fwscanf(file,"%lf",buffer);

如果没有,那么是否有某种 ANSI C 函数可以将 ASCII 字符串转换为 Unicode?我想在我的程序中使用 Unicode 字符串。

问题三

此外,我需要将 Unicode 字符串输出到控制台。 windows有setlocale(*),linux怎么办?控制台似乎已经是 Unicode 了。

问题 4

一般来说,我想在我的程序中使用 Unicode,但我遇到了一些奇怪的问题:

f = fopen("inc.txt","rt");
fwprintf(f,L"Текст"); // converted successfully
fclose(f);
f = fopen("inc_u8.txt","rt, ccs = UNICODE");
fprintf(f,"text"); // failed to convert
fclose(f);

附言有没有关于跨平台编程的好书,比较windows和linux程序代码的?还有一些关于使用 Unicode 的方法的书,即实用方法。我不想沉浸在普通的 UNICODE BI\LI 历史中,我对特定的 C/C++ 库感兴趣。

最佳答案

问题一:

是的,您可以检测字节顺序标记,这是您发现的字节序列 - 如果您的文件有一个。
在 Google 和 stackoverflow 上搜索即可完成剩下的工作。至于“不那么丑”:你可以重构/美化你的代码,例如写一个确定BOM的函数,一开始就做,然后根据需要调用fopen或_tfopen。然后您可以再次重构它,并编写您自己的 fopen 函数。但它仍然会很丑。

问题二:

是的,但是 unicode 函数在 Linux 上的调用并不总是与在 Windows 上相同。
使用定义。也许写你自己的 TCHAR.H

问题三:

#include <locale.h>
setlocale(LC_ALL, "en.UTF-8")

man 3 设置语言环境

问题四:
只需使用 fwprintf。
另一个不是标准。

您可以使用 wxWidgets 工具包。
它使用 unicode,并使用在 Windows、Linux、Unix 和 Mac 上实现相同事物的类。

更好的问题是如何将 ASCII 转换为 Unicode,反之亦然。事情是这样的:

std::string Unicode2ASCII( std::wstring wstrStringToConvert )
{
size_t sze_StringLength = wstrStringToConvert.length() ;

if(0 == sze_StringLength)
return "" ;

char* chrarry_Buffer = new char[ sze_StringLength + 1 ] ;
wcstombs( chrarry_Buffer, wstrStringToConvert.c_str(), sze_StringLength ) ; // Unicode2ASCII, const wchar_t* C-String 2 mulibyte C-String
chrarry_Buffer[sze_StringLength] = '\0' ;
std::string strASCIIstring = chrarry_Buffer ;
delete chrarry_Buffer ;

return strASCIIstring ;
}


std::wstring ASCII2Unicode( std::string strStringToConvert )
{
size_t sze_StringLength = strStringToConvert.length() ;

if(0 == sze_StringLength)
return L"" ;

wchar_t* wchrarry_Buffer = new wchar_t[ sze_StringLength + 1 ] ;
mbstowcs( wchrarry_Buffer, strStringToConvert.c_str(), sze_StringLength ) ; // Unicode2ASCII, const. mulibyte C-String 2 wchar_t* C-String
wchrarry_Buffer[sze_StringLength] = L'\0' ;
std::wstring wstrUnicodeString = wchrarry_Buffer ;
delete wchrarry_Buffer ;

return wstrUnicodeString ;
}

编辑:下面是对 Linux (wchar.h) 上可用的 Unicode 函数的一些深入了解:

__BEGIN_NAMESPACE_STD
/* Copy SRC to DEST. */
extern wchar_t *wcscpy (wchar_t *__restrict __dest,
__const wchar_t *__restrict __src) __THROW;
/* Copy no more than N wide-characters of SRC to DEST. */
extern wchar_t *wcsncpy (wchar_t *__restrict __dest,
__const wchar_t *__restrict __src, size_t __n)
__THROW;

/* Append SRC onto DEST. */
extern wchar_t *wcscat (wchar_t *__restrict __dest,
__const wchar_t *__restrict __src) __THROW;
/* Append no more than N wide-characters of SRC onto DEST. */
extern wchar_t *wcsncat (wchar_t *__restrict __dest,
__const wchar_t *__restrict __src, size_t __n)
__THROW;

/* Compare S1 and S2. */
extern int wcscmp (__const wchar_t *__s1, __const wchar_t *__s2)
__THROW __attribute_pure__;
/* Compare N wide-characters of S1 and S2. */
extern int wcsncmp (__const wchar_t *__s1, __const wchar_t *__s2, size_t __n)
__THROW __attribute_pure__;
__END_NAMESPACE_STD

#ifdef __USE_XOPEN2K8
/* Compare S1 and S2, ignoring case. */
extern int wcscasecmp (__const wchar_t *__s1, __const wchar_t *__s2) __THROW;

/* Compare no more than N chars of S1 and S2, ignoring case. */
extern int wcsncasecmp (__const wchar_t *__s1, __const wchar_t *__s2,
size_t __n) __THROW;

/* Similar to the two functions above but take the information from
the provided locale and not the global locale. */
# include <xlocale.h>

extern int wcscasecmp_l (__const wchar_t *__s1, __const wchar_t *__s2,
__locale_t __loc) __THROW;

extern int wcsncasecmp_l (__const wchar_t *__s1, __const wchar_t *__s2,
size_t __n, __locale_t __loc) __THROW;
#endif


/* Special versions of the functions above which take the locale to
use as an additional parameter. */
extern long int wcstol_l (__const wchar_t *__restrict __nptr,
wchar_t **__restrict __endptr, int __base,
__locale_t __loc) __THROW;

extern unsigned long int wcstoul_l (__const wchar_t *__restrict __nptr,
wchar_t **__restrict __endptr,
int __base, __locale_t __loc) __THROW;

__extension__
extern long long int wcstoll_l (__const wchar_t *__restrict __nptr,
wchar_t **__restrict __endptr,
int __base, __locale_t __loc) __THROW;

__extension__
extern unsigned long long int wcstoull_l (__const wchar_t *__restrict __nptr,
wchar_t **__restrict __endptr,
int __base, __locale_t __loc)
__THROW;

extern double wcstod_l (__const wchar_t *__restrict __nptr,
wchar_t **__restrict __endptr, __locale_t __loc)
__THROW;

extern float wcstof_l (__const wchar_t *__restrict __nptr,
wchar_t **__restrict __endptr, __locale_t __loc)
__THROW;

extern long double wcstold_l (__const wchar_t *__restrict __nptr,
wchar_t **__restrict __endptr,
__locale_t __loc) __THROW;


/* Copy SRC to DEST, returning the address of the terminating L'\0' in
DEST. */
extern wchar_t *wcpcpy (wchar_t *__restrict __dest,
__const wchar_t *__restrict __src) __THROW;

/* Copy no more than N characters of SRC to DEST, returning the address of
the last character written into DEST. */
extern wchar_t *wcpncpy (wchar_t *__restrict __dest,
__const wchar_t *__restrict __src, size_t __n)
__THROW;
#endif /* use GNU */


/* Wide character I/O functions. */

#ifdef __USE_XOPEN2K8
/* Like OPEN_MEMSTREAM, but the stream is wide oriented and produces
a wide character string. */
extern __FILE *open_wmemstream (wchar_t **__bufloc, size_t *__sizeloc) __THROW;
#endif

#if defined __USE_ISOC95 || defined __USE_UNIX98
__BEGIN_NAMESPACE_STD

/* Select orientation for stream. */
extern int fwide (__FILE *__fp, int __mode) __THROW;


/* Write formatted output to STREAM.

This function is a possible cancellation point and therefore not
marked with __THROW. */
extern int fwprintf (__FILE *__restrict __stream,
__const wchar_t *__restrict __format, ...)
/* __attribute__ ((__format__ (__wprintf__, 2, 3))) */;
/* Write formatted output to stdout.

This function is a possible cancellation point and therefore not
marked with __THROW. */
extern int wprintf (__const wchar_t *__restrict __format, ...)
/* __attribute__ ((__format__ (__wprintf__, 1, 2))) */;
/* Write formatted output of at most N characters to S. */
extern int swprintf (wchar_t *__restrict __s, size_t __n,
__const wchar_t *__restrict __format, ...)
__THROW /* __attribute__ ((__format__ (__wprintf__, 3, 4))) */;

/* Write formatted output to S from argument list ARG.

This function is a possible cancellation point and therefore not
marked with __THROW. */
extern int vfwprintf (__FILE *__restrict __s,
__const wchar_t *__restrict __format,
__gnuc_va_list __arg)
/* __attribute__ ((__format__ (__wprintf__, 2, 0))) */;
/* Write formatted output to stdout from argument list ARG.

This function is a possible cancellation point and therefore not
marked with __THROW. */
extern int vwprintf (__const wchar_t *__restrict __format,
__gnuc_va_list __arg)
/* __attribute__ ((__format__ (__wprintf__, 1, 0))) */;
/* Write formatted output of at most N character to S from argument
list ARG. */
extern int vswprintf (wchar_t *__restrict __s, size_t __n,
__const wchar_t *__restrict __format,
__gnuc_va_list __arg)
__THROW /* __attribute__ ((__format__ (__wprintf__, 3, 0))) */;


/* Read formatted input from STREAM.

This function is a possible cancellation point and therefore not
marked with __THROW. */
extern int fwscanf (__FILE *__restrict __stream,
__const wchar_t *__restrict __format, ...)
/* __attribute__ ((__format__ (__wscanf__, 2, 3))) */;
/* Read formatted input from stdin.

This function is a possible cancellation point and therefore not
marked with __THROW. */
extern int wscanf (__const wchar_t *__restrict __format, ...)
/* __attribute__ ((__format__ (__wscanf__, 1, 2))) */;
/* Read formatted input from S. */
extern int swscanf (__const wchar_t *__restrict __s,
__const wchar_t *__restrict __format, ...)
__THROW /* __attribute__ ((__format__ (__wscanf__, 2, 3))) */;

# if defined __USE_ISOC99 && !defined __USE_GNU \
&& (!defined __LDBL_COMPAT || !defined __REDIRECT) \
&& (defined __STRICT_ANSI__ || defined __USE_XOPEN2K)
# ifdef __REDIRECT
/* For strict ISO C99 or POSIX compliance disallow %as, %aS and %a[
GNU extension which conflicts with valid %a followed by letter
s, S or [. */
extern int __REDIRECT (fwscanf, (__FILE *__restrict __stream,
__const wchar_t *__restrict __format, ...),
__isoc99_fwscanf)
/* __attribute__ ((__format__ (__wscanf__, 2, 3))) */;
extern int __REDIRECT (wscanf, (__const wchar_t *__restrict __format, ...),
__isoc99_wscanf)
/* __attribute__ ((__format__ (__wscanf__, 1, 2))) */;
extern int __REDIRECT_NTH (swscanf, (__const wchar_t *__restrict __s,
__const wchar_t *__restrict __format,
...), __isoc99_swscanf)
/* __attribute__ ((__format__ (__wscanf__, 2, 3))) */;
# else
extern int __isoc99_fwscanf (__FILE *__restrict __stream,
__const wchar_t *__restrict __format, ...);
extern int __isoc99_wscanf (__const wchar_t *__restrict __format, ...);
extern int __isoc99_swscanf (__const wchar_t *__restrict __s,
__const wchar_t *__restrict __format, ...)

关于c - fopen 一切 - 这可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6821102/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com