掲示板利用宣言

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

 私は

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

掲示板2

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

No.25950

ファイル書き込みにて文字化け?
投稿者---HN(2006/02/02 09:58:20)


OS:WINDOWSXP
コンパイラ:MICROSOFTVISUALC++
下記コードでファイルに文字を書き込むと書き込んだ文字の後に
フフフフフフフフフフフフという文字がついてきます。
これはどうすれば解決出来ますでしょうか?

#include<stdio.h>
#include<fcntl.h>
#include<io.h>
int main(void){


    char input[100];
    int fileno;
    fgets(input,sizeof(input),stdin);
    fileno=open("../test.txt",O_RDWR);
    write(fileno,input,sizeof(input));
    return 0;
}

よろしくお願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ファイル書き込みにて文字化け? 25951 あかま 2006/02/02 10:07:14
<子記事> Re:ファイル書き込みにて文字化け? 25954 Blue 2006/02/02 10:15:04
<子記事> Re:ファイル書き込みにて文字化け? 25955 HN 2006/02/02 10:38:01


No.25951

Re:ファイル書き込みにて文字化け?
投稿者---あかま(2006/02/02 10:07:14)


>下記コードでファイルに文字を書き込むと書き込んだ文字の後に
>フフフフフフフフフフフフという文字がついてきます。
input[100]に10文字しか読み込んでないのに100文字全部書き込んだらどうなります?
読み込んだ一行分だけ書き込むにはfputsなどを使います。


writeなどの低水準関数を使わないで、fwriteなど先頭に"f"のつく関数を使うことをおすすめします。


この投稿にコメントする

削除パスワード

No.25954

Re:ファイル書き込みにて文字化け?
投稿者---Blue(2006/02/02 10:15:04)


> write(fileno,input,sizeof(input));
この使い方であると、
input配列のデータを100バイトファイルに書き込めという命令になります。

C言語では変数宣言だけでは初期化が行われません。
よって、input配列には何らかのゴミが入っている状態です。

fgets関数でinput配列に文字列をを取得すると、例えば

ABC

と入力されると、

input[ 0 ] = 'A';
input[ 1 ] = 'B';
input[ 2 ] = 'C';
input[ 3 ] = '\n';
input[ 4 ] = '\0';

という状態になります。
よって、input[ 5 ] 〜 input[ 99 ] にはゴミが入ったままです。
(それが今回は半角の'フ'という文字であっただけ。)

解決方法は、変数宣言時に

char input[ 100 ] = { 0 };

とするか、memset関数を使うかのどちらかになります。
(文字列のみを書き込みたいならば、sizeof(input)ではなくstrlen(input)ですけど)



この投稿にコメントする

削除パスワード

No.25955

Re:ファイル書き込みにて文字化け?
投稿者---HN(2006/02/02 10:38:01)


sizeof・・データサイズの取得
strlen・・文字数の取得

というのを忘れていました。確かに100バイト分読み込むんだと入力が5文字とかだとゴミが書き込まれますね。納得しました。ありがとうございました


この投稿にコメントする

削除パスワード

No.25956

Re:ファイル書き込みにて文字化け?
投稿者---RAPT(2006/02/02 12:57:09)


ちなみに、VC++でDebugモードで実行すると、未初期化の変数は、
2進数の 11001100 で初期化されます。
これが半角カナの  に相当します。



この投稿にコメントする

削除パスワード

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