2017-02-02 27 views
0

當我通過fputc寫入一個大於255的值到文件中時會發生什麼?fputc和fgetc(C)的值大於255?

這裏是我的代碼:

inputFile = fopen("arx.txt", "wr"); 
int a = 253; 
for (int i = 0; i < 5; i++) { 
    printf("writing %d\n", a); 
    fputc(a++, inputFile); 
} 
int b = 2 * 253; 
for (int i = 0; i < 5; i++) { 
    printf("writing %d\n", b); 
    fputc(b++, inputFile); 
} 

,這就是我在文件中看到

ύώϊϋόύώ

我需要寫這些值來代替陣列的文件,我必須知道在fputcfgetc內發生了什麼。

任何幫助?

+3

閱讀文檔有幫助。來自['man fputc'](https://linux.die.net/man/3/fputc):* fputc()將字符c,**轉換爲無符號字符**,以進行流式處理。* –

+0

' 「wr」不是'fopen()'的標準模式字符串。 – chqrlie

+0

也許這可能對您有用:http://www.cprogramming.com/tutorial/unicode.html使用大於255的值時,您處於無符號字符範圍之外。因此,您將需要使用不是字符的值,而是使用一些較大的數據類型,例如短褲或整數。當然,要做到這一點,你將不得不避免正常的字符處理功能,因爲它們中的許多將與這些較大的值不兼容。 – SpencerD

回答

3

函數fputc寫入輸出流轉換爲類型unsigned char其參數。

因爲函數返回它寫的,你可以很容易地檢查寫

考慮下面的示範項目是什麼字符的字符

#include <stdio.h> 

int main(void) 
{ 
    int c1 = 257; 

    int c2 = fputc(c1, stdout); 

    printf("c2 = %d\n", c2); 

    return 0; 
} 

它的輸出是

c2 = 1 

要考慮到您指定了錯誤的功能打開模式"wr"。在這種情況下,行爲是不確定的。只需使用"w"即可。

+0

我發現標準在這一點上略有含糊。 C11§7.21.5。3 3表示這是未定義的行爲,但在腳註中繼續說道:「如果一個字符串以上述序列之一開頭,實現可能會選擇忽略剩餘的字符....」GCC似乎遵循這一點路徑。我們是否應該稱這種未定義的行爲或實現定義的行爲? –

+0

@DavidBowling AFAIK腳註不是規範性的。 –

+0

我想這是有道理的。所以它應該被稱爲UB,根據標準。但是海灣合作委員會然後不符合這裏?我必須承認,我發現這些腳註警告有點混亂。 –

2

fputc()將字節寫入其輸出流。在寫入文件之前,其第一個參數int轉換爲unsigned char。在8位字節的系統,該文件將包含此(十六進制轉儲):

00000000 fd fe ff 00 01 fa fb fc fd fe      ýþÿ..úûüýþ 

該如何內容您的系統上顯示,完全取決於您使用工具和環境,看看它

您不能輸出超出範圍unsigned char的Unicode代碼點到fputc()的文件,您必須以與您的系統兼容的方式對它們進行編碼。您可以使用今天廣泛使用的通用UTF-8編碼,或者更適合您所在地區的東西。您可能可以配置您的語言環境並使用C標準中記錄的寬字符輸入輸出功能,並在<wchar.h>fwide(),getwc()putwc()中定義。