LinuxC下wprintf和printf混用

2021-08-26 09:29:21 字數 1940 閱讀 5456

譯文部分

linux c下

printf 和wprintf混用,僅乙個有效果,另乙個寫返回-1.無errno資訊,但是寫失敗。

問題解答鏈結

標準解析鏈結

c流格式化和非格式的輸入輸出。是locale敏感的,可以寬字元或多位元組的轉換輸出。

和c++流不一樣,c++每個流關聯自己的locale,

所有的c流獲得相同的locale object,通過呼叫selocale載入。

此外,系統資訊需要通過裝置獲取(如,乙個posix的檔案描述符)。每個c流object遵循

1字元寬度:沒有設定,窄或寬

2緩衝區狀態:無緩衝區,行緩衝,完全緩衝

3緩衝區,用擴充套件或使用者提供的緩衝區

4i/o模式,輸入、輸出或更新(輸入和輸出)

5二進位制/文字模式 指示

6檔案結尾狀態 指示

7 錯誤狀態指示

8檔案位置指示(型別物件std::fpos_t),對於寬字元流還包括解析規定(型別物件std::mbstate_t)

9(c++17)使用 reentrant lock 防止多執行緒競爭流資料的讀、寫、定位、查詢位置

窄和寬取向

乙個新開啟的流沒有取向。第一次呼叫std::fwide或者其他的i/o函式建立取向:寬i/o函式設定流定寬,窄i/o函式使流定窄。

一旦設定,取向只能通過std::freopen改變。

窄i/o函式不可以呼叫定寬流,寬i/o函式不可以呼叫定窄流。

寬i/o函式使用std::mbrtowc和std::wcrtomb完成寬字元和多位元組字元的轉換。

和程式中的有效的多位元組字串不同,檔案中的多位元組字元可能潛入nulls並且不必以初始移入狀態開始或結束。

posix要求當前的載入的c語言環境的lc_ctype在此刻流object變為定寬,並會被後續的i/o流使用直到取向改變,

不理會後續呼叫的setlocale();

wprintf 和printf不能同時針對同乙個檔案。

wprintf是寬流,窄串在內部被轉為寬字元列印。

printf是窄流,寬字元在內部被轉為窄串列印。

wprinitf 字串格式包含非ascii寬字元,程式只有在執行時的本區lc_ctype型別 和編譯時本區lc_ctype型別一致時才能正常工作

/*

compile:gcc -wall c.c

run:./a.out

check:cat f.txt

fileencoding:utf-8

locale

stream-object

*/#include#include#include#include#includevoid setplocale(int category,const char*locale)

int main()

if ( !mbsinit(&mbst) )//獲得初始狀態--初始狀態不可更改

memset (&mbst,0,sizeof(mbst)); /* set to initial state */

wcsrtombs ( buffer, &p, 80, &mbst);

wprintf(l"wprintf char %s\n",buffer);

fflush(stdout);

freopen("f.txt","a+",stdout);//改變流取向

ret=printf(" printf char %s \n",buffer);

ret=printf(" printf wchar_t %ls",wcs);

eno=errno;

if(-1==ret)

return 0;}

/* wprintf example */

#include #includeint main()

Linux C下程序操作例項

ex5 14.c include include include define maxarg 10 每條命令所能使用的最大引數個數 define linsiz 80 每條命令的字元快取陣列 define cmdsiz 8 一次提交的最多的命令個數 extern char environ char q...

Linux C 陣列和指標

陣列的基本概念 定義及使用方法 字串的深入理解及相關字串操作庫函式 指標的基本概念 定義與使用方法 指標型別的引數和返回值 指標與陣列的關係 指向指標的指標和指標陣列 陣列的基本概念 簡單來說就是具有相同資料型別的若干變數的有序集合,是一種復合型別。陣列count的元素的儲存空間是相鄰的,陣列成員可...

Linux C 編譯和鏈結

linux系統中最常用的編譯器是g 這是來自free software foundation的gun c 編譯器。linux的多數版本都包含該編譯器,但並不一定總會安裝它。g 編譯器的工作方式很像標準unix編譯器。例如,下面的命令將生成可執行檔案a.out g spiffy.cxxg spiffy...