掲示板利用宣言

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

 私は

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

掲示板2

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

No.29645

行の終わりに文字化け?が出てしまいます
投稿者---カイカイ(2007/01/30 04:14:29)


こんにちは、初めて投稿させて頂きます。
現在ファイルを読み込んでその内容が印刷可能文字0x20から0x7Eならば文字を表示、それ以外なら空白を16文字1行表示というプログラムを組んでいたのですが、いざ実行してみると行の最後になんだかよく分からない文字がでてしまいます。自分なりに過去ログなど調べてみたのですがこれといったのがなくて質問させて頂きます。
環境はWin XP home2
   BorlandC++になります。
#include<stdio.h>
#include<ctype.h>
#define MAX 50

int main(int argc,char *argv[]);

int main(int argc,char *argv[])
{
    FILE *fp;
    int c,i;
    char buf[MAX];

    if(argc != 2){
        printf("使用法: %s FILE\n", argv[0]);
        return(-1);
                }
    if((fp=fopen(argv[1],"rb"))==NULL){
    printf("ファイル%sが見つかりません\n",argv[1]);
    return(-1);
                                     }
    i=0;
    while((c = fgetc(fp)) != EOF){
        
        if(isprint(c) != 0){
        buf[i] = c;
        i++;
                            }
        else{
        buf[i] = ' ';
        i++;
            }
        if(i % 16 == 0){
            puts(buf);
                for(i = 16;i >= 0;i--){
                    buf[i] = ' ';        
                                         }
            i = 0;
                }
        
                                }
            
        fclose(fp);
        return(0);
}



分かる方にはつまらない質問かと思いますが何卒よろしくお願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:行の終わりに文字化け?が出てしまいます 29646 kolona 2007/01/30 05:36:07
<子記事> Re:行の終わりに文字化け?が出てしまいます 29712 ルナレルナ 2007/02/06 11:01:47


No.29646

Re:行の終わりに文字化け?が出てしまいます
投稿者---kolona(2007/01/30 05:36:07)


>現在ファイルを読み込んでその内容が印刷可能文字0x20から0x7Eならば文字を表示、それ以外なら空白を16文字1行表示というプログラムを組んでいたのですが、いざ実行してみると行の最後になんだかよく分からない文字がでてしまいます。


    if(i % 16 == 0){
        puts(buf);
        for(i = 16;i >= 0;i--){
            buf[i] = ' ';        
        }
        i = 0;
    }

この部分は何をしているのでしょうか?
バッファのクリアを目的としているのだと思いますが、その場合は
buf[i] = '\0';

で初期化しないと次回からヌル文字が見つからず、メモリ上のあらぬ領域まで表示してしまいます。それが原因と思われます。
まあ、今回の場合は
buf[16]=0;
で十分だと思いますが。

それと、
if(i % 16 == 0){

if(i == 16 ){

で良いのではないでしょうか。
1行ずつ処理しているのだから剰余算でなくてもいいと思います。



この投稿にコメントする

削除パスワード

No.29711

Re:行の終わりに文字化け?が出てしまいます
投稿者---カイカイ(2007/02/06 01:37:55)


お礼が遅くなってしまいすみません。
教えていただいたことをヒントにどうにか完成させることができました。
本当にありがとうございます。


この投稿にコメントする

削除パスワード

No.29712

Re:行の終わりに文字化け?が出てしまいます
投稿者---ルナレルナ(2007/02/06 11:01:47)
http://park6.wakwak.com/~nougaki/mini_program/index.html


カイカイの文章を元にプログラミングすると、
下のような処理をするプログラムになる。

{
    while ((c = fgetc(fp)) != EOF)
        if (isprint(c))
            putchar(c);
        else
            puts("\n                \n");
}

実際に求めているのは、下のようなプログラムだと思う。

{
    for (i = 0; ((c = fgetc(fp)) != EOF; i++) {
        if (i % 16 == 0)
            putchar('\n');
            
        if (isprint(c))
            putchar(c);
        else
            putchar(' ');
    }
}

言葉の違いで、プログラムも違うものになる。



この投稿にコメントする

削除パスワード

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