2017-02-02 14 views
0

255より大きい値を(fputcを介して)ファイルに書き込むとどうなりますか?ここで 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、**をunsigned char **にキャストしてストリームに書き出します。* –

+0

' "wr"は 'fopen()'の標準モード文字列ではありません。 – chqrlie

+0

おそらくこれはあなたの役に立つかもしれません:http://www.cprogramming.com/tutorial/unicode.html値が> 255の場合、あなたはunsigned charの範囲外です。そのため、char型ではなく、short型やint型などのより大きなデータ型として値を扱う必要があります。もちろん、これを行うには、通常の文字処理関数を避けなければならないでしょう。その多くはこれらの大きな値と互換性がないからです。 – SpencerD

答えて

3

関数fputcは、その引数であるunsigned charに変換された出力ストリームに書き込みます。

機能は、それが書いた文字を返しますので、あなたは簡単に

を書かれたものを文字確認することができ、その出力は

c2 = 1 

ことを考慮している以下の実証プログラムに

#include <stdio.h> 

int main(void) 
{ 
    int c1 = 257; 

    int c2 = fputc(c1, stdout); 

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

    return 0; 
} 

を考えてみましょう誤った機能オープンモード"wr"を指定しました。この場合の動作は未定義です。ちょうど"w"を使用してください。

+0

この点では、標準がやや曖昧であることがわかります。 C11§7.21.5。3 3は、これが未定義の振る舞いだと言いますが、「文字列が上記のシーケンスのいずれかで始まる場合、実装は残りの文字を無視することを選択するかもしれません....」GCCはこれに従うようですパス。この定義されていない動作または実装定義の動作と呼ぶべきでしょうか? –

+0

@DavidBowling AFAIK脚注は標準ではありません。 –

+0

それは意味があると思います。標準によると、それはUBと呼ばれるべきです。しかし、GCCはここで順応しないのですか?私はこれらの種類の脚注の警告がちょっと混乱していることを認めます。 –

2

fputc()出力ストリームにバイトを書き込みます。最初の引数のintは、ファイルに書き込む前にunsigned charに変換されます。 8ビット・バイトのシステムでは、ファイルは、この(16進ダンプ)が含まれます:あなたのシステム上でこの内容が表示されに使用するツールや環境に完全に依存する方法

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

はそれ参照してください。 の範囲を超えてfputc()のファイルにUnicodeコードポイントを出力することはできません。システムと互換性のある方法でエンコードする必要があります。今日広く普及している一般的なUTF-8エンコーディング、またはあなたの地域に特化したものを使用することができます。ロケールを設定し、C標準で文書化された<wchar.h>fwide(),getwc()およびputwc()で定義されているワイド文字入出力関数を使用することができます。

関連する問題