掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.26115

fprintfの出力について
投稿者---べた(2006/02/14 20:13:23)


fprintfを使用してファイルに出力をしています。
char型の1バイトの変数を「%c」で、出力しているのですが、
1バイトの値を設定して出力したときは、問題ないのですが、
1バイトの値ではなく、NULL「'\0'」を設定して出力すると
処理は、問題ないのですが、出力されたファイルがおかしく
なるのです。

viで開いてみると、
「"test.csv" 1 line, 16 characters (1 null)」
のメッセージが表示されるのです。
また、diffを実行すると、
# diff test.csv tst.c
Binary files test.csv and tst.c differ
となり正しく動きません。

どこがいけないのでしょうか。

環境は、
UNIX:Solaris8、UNIX-C
コンパイル:gcc

#include <stdio.h>

main()
{
    FILE *fp ;
    char str1[]="12345";
    char chr1;
    char str2[]="abcde";
    char chr2;

    chr1 = '1';
    chr2 = '\0';

    fp=fopen("test.csv","w");
    fprintf(fp,"%s,%c,%s,%c\n",str1,chr1,str2,chr2);
    fclose(fp);
}


以下のようなデファインの使い方を見かけたのですが、
どういう意味なのでしょうか。
全角スペースに、要素の[0]、[1]がついているのですが
これは、何を意味しているのですか。
このようにするとどう見えるのですか。
#define isZenSP(p) (p[0]==" "[0] && p[1]==" "[1])


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:fprintfの出力について 26116 REE 2006/02/14 20:35:54


No.26116

Re:fprintfの出力について
投稿者---REE(2006/02/14 20:35:54)


>fprintfを使用してファイルに出力をしています。
>char型の1バイトの変数を「%c」で、出力しているのですが、
>1バイトの値を設定して出力したときは、問題ないのですが、
>1バイトの値ではなく、NULL「'\0'」を設定して出力すると
>処理は、問題ないのですが、出力されたファイルがおかしく
>なるのです。

別におかしくありません。
'\0'を含むファイルは、一般的にはバイナリファイルと呼ばれます。
よって、テキストエディタなどのテキストファイルを扱うプログラムでは使えない事もあります。


>以下のようなデファインの使い方を見かけたのですが、
>どういう意味なのでしょうか。
>全角スペースに、要素の[0]、[1]がついているのですが
>これは、何を意味しているのですか。

結果から言うと
全角スペースの1バイト目、2バイト目を表します。
分かりやすく半角文字で書くと、
"abcd"[0] は 'a'、"abcd"[1] は 'b'となります。

こうなる理由は、文字列リテラルは文字配列だからです。

>このようにするとどう見えるのですか。
>#define isZenSP(p) (p[0]==" "[0] && p[1]==" "[1])

pの一文字目が全角スペースかどうかを判定していますね。



この投稿にコメントする

削除パスワード

No.26117

Re:fprintfの出力について
投稿者---べた(2006/02/14 23:34:50)


chr2='1';
を入れたたのと同じようにするには、
char2='\0';
はどうすればいいのですか。


この投稿にコメントする

削除パスワード

No.26118

Re:fprintfの出力について
投稿者---nop(2006/02/15 01:07:56)


>chr2='1';
>を入れたたのと同じようにするには、
>char2='\0';
>はどうすればいいのですか。

「あなたが何を出力したいのか?」によります。
そもそも、何故「'\0'」を出力しているのですか?


この投稿にコメントする

削除パスワード

No.26121

Re:fprintfの出力について
投稿者---べた(2006/02/15 09:42:31)


>
>「あなたが何を出力したいのか?」によります。
>そもそも、何故「'\0'」を出力しているのですか?

半角スペースかそれ以外かを判断し、
半角スペースの時は、ブランクで、
半角スペース以外の時は、設定されていた値を出力。

ブランクなので、NULLして出力しようとしています。


この投稿にコメントする

削除パスワード

No.26123

Re:fprintfの出力について
投稿者---REE(2006/02/15 10:10:33)


>半角スペースかそれ以外かを判断し、
>半角スペースの時は、ブランクで、
>半角スペース以外の時は、設定されていた値を出力。
>
>ブランクなので、NULLして出力しようとしています。

一般的には、半角スペース=ブランクです。
半角スペースなら、'\0'ではなく、' 'です。



この投稿にコメントする

削除パスワード

No.26126

Re:fprintfの出力について
投稿者---nop(2006/02/15 10:27:51)


>半角スペースかそれ以外かを判断し、
>半角スペースの時は、ブランクで、
>半角スペース以外の時は、設定されていた値を出力。
>
>ブランクなので、NULLして出力しようとしています。

「ブランク」は、「何も出力されない」と言う解釈で宜しいですか?
そうであれば、出力そのものを行わない様にif文などで分岐して下さい。
# ちなみに、私なら以下の様に書くかも…
#
## char  buf[2] = {0};
## buf[0] = hoge;  /* 該当データの設定 */
## if( /* ブランクにするか判定 */ )
## {
##     /* ブランクに設定 */
##     buf[0] = '\0';
## }
## printf( "%s\n", buf );



この投稿にコメントする

削除パスワード

No.26135

Re:fprintfの出力について
投稿者---べた(2006/02/15 17:37:45)


>「ブランク」は、「何も出力されない」と言う解釈で宜しいですか?
>そうであれば、出力そのものを行わない様にif文などで分岐して下さい。
ブランクは、何も出さない、出力されないです。

><pre># ちなみに、私なら以下の様に書くかも…
>#
>## char buf[2] = {0};
>## buf[0] = hoge; /* 該当データの設定 */
>## if( /* ブランクにするか判定 */ )
>## {
>## /* ブランクに設定 */
>## buf[0] = '\0';
>## }
>## printf( "%s\n", buf );</pre>
一つの手ですね。
変数のサイズにこだわらなければ、期待したファイルになりまね。


この投稿にコメントする

削除パスワード

No.26120

Re:fprintfの出力について
投稿者---kz3(2006/02/15 09:15:43)


>>全角スペースに、要素の[0]、[1]がついているのですが
>>これは、何を意味しているのですか。
>
>結果から言うと
>全角スペースの1バイト目、2バイト目を表します。
>分かりやすく半角文字で書くと、
>"abcd"[0] は 'a'、"abcd"[1] は 'b'となります。
>
>こうなる理由は、文字列リテラルは文字配列だからです。

補足です。
文字列リテラリは式の中でその文字列へのポインタに読みかえられます。
つまり " "[0] や "abcd"[0] といった書き方は、

#include <stdio.h> int main( void ) { char *str = "abcd"; printf( "%c\n" , *(str + 0) ); printf( "%c\n" , str[1] ); printf( "%c\n" , *("abcd" + 2) ); printf( "%c\n" , "abcd"[3] ); return 0; }

と同じ意味合いになる。

ということでいいのかな。
参考書籍:C言語ポインタ完全制覇
偶然このホームページで紹介されていましたが、買って損はないと思います。

#ただ " "[0] な書き方は初めて見ました。


この投稿にコメントする

削除パスワード

No.26125

「蛇足」
投稿者---nop(2006/02/15 10:18:23)


>#ただ " "[0] な書き方は初めて見ました。

個人的にはN進数文字列への変換で使います。
# 「*str++ = "01"[x%2];」の様な感じで。

蛇足ですが、「0[" "]」とも書けます。
# 「0[" "]」は「*(0+" ")」のシンタックスシュガーな為。


この投稿にコメントする

削除パスワード

No.26127

Re:「蛇足」
投稿者---RAPT(2006/02/15 11:51:30)


文字リテラルに operator[] を使うことはあるけども、
# "日月火水木金土"[wday * 2]
# とか。

" "[0], " "[1] で文字比較する使い方は初めてみました。
普通なら、strncmp() 使うので。

> #define isZenSP(p) (p[0]==" "[0] && p[1]==" "[1])
  #define isZenSP(p) (strncmp(p, " ", 2) == 0)

CRT使いたくない/使えない場合なら仕方ないけど、まさかとは思うが、
strncmp() 関数の存在/使い方を知らないだけだったら脱力。



この投稿にコメントする

削除パスワード

No.26131

Re:「蛇足」
投稿者---kz3(2006/02/15 15:31:52)


nopさん:
    > 個人的にはN進数文字列への変換で使います。
    > # 「*str++ = "01"[x%2];」の様な感じで。

RAPTさん:
    > # "日月火水木金土"[wday * 2]
    > # とか。

そんな使い方が・・・とても参考になりました。ありがとうございます。

# 余所見していたら"リテラリ"( 正しくはリテラル )になってました。





この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧