C言語関係掲示板

過去ログ

No.990 テキストファイルからのASCII文字削除

[戻る] [ホームページ]
No.12948

テキストファイルからのASCII文字削除
投稿者---WD(2004/02/25 11:38:02)


WDと申します。さっそくですが質問させていただきます。
私が製作しようと思っているプログラムは、テキストファイルから
文字を読み込んで、ASCII文字であれば弾いて、それ以外の文字であれば出力用のファイルに書き込むというものが作りたいのですが、うまくいきません。文字の判定は、うまくいっているようなのですが、テキストへの保存方法がうまくいっていません。
ちなみに入力テキストの中身はこんな感じです。
入力テキスト
<a hre="34.b1625/1??cm=TF1">会社名ホームページ公開a>
求めている出力テキスト
会社名ホームページ公開
こんな感じです。助言お願いします。
<pre>#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;ctype.h&gt;
int main(void)
{
FILE *fp_input;
FILE *fp_output;
int c = 0,i = 0;
unsigned char buf[1];

if ((fp_input = fopen(&quot;input.txt&quot;,&quot;r&quot;)) == NULL) { //ファイルのオープン
printf(&quot;ファイルが開けません\n&quot;);
return(1);
}
if ((fp_output = fopen(&quot;output.txt&quot;,&quot;w&quot;)) == NULL) { //ファイルのオープン
printf(&quot;ファイルが開けません\n&quot;);
return(1);
}
while ( (c=fgetc(fp_input)) != EOF) {
if(isascii(c) != 0){
buf[i] = c;
fputs(&amp;buf[i],fp_output);
}

}
fclose(fp_input);
fclose(fp_output);
return(0);
}
</pre>

No.12949

Re:テキストファイルからのASCII文字削除
投稿者---Cマニア(超初心者)(2004/02/25 13:46:51)


fputs関数の使い方が間違ってるような気がしますが・・・。
よろしければもう一度ソースをきれいに載せてもらいませんか?

No.12951

Re:テキストファイルからのASCII文字削除
投稿者---GGOOD(2004/02/25 14:01:01)


こんにちは。

ちょっと見せていただきましたが、
fputsじゃなくてfputcじゃないかな、と思いました。
それと、if(asascii(c) != 0) ←これではアスキー文字を返してしまいます。
というわけで、ソースを変更してみました。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
    
int main(void){
    FILE *fp_input;
    FILE *fp_output;
    int c = 0,i = 0;

    if ((fp_input = fopen("input.txt","r")) == NULL) { //ファイルのオープン
    printf("ファイルが開けません\n");
    return(1);
    }
    
    if ((fp_output = fopen("output.txt","w")) == NULL) { //ファイルのオープン
    printf("ファイルが開けません\n");
    return(1);
    }
    while ( (c=fgetc(fp_input)) != EOF) {
        if(isascii(c) == 0){ 
            fputc(c,fp_output);
        }
    }

    fclose(fp_input);
    fclose(fp_output);
    return(0);
}



windows95、BCC55で実行してみたところ、とりあえず抜き出しできていました。
ですが、元ファイルがShift-JISだと文字化けするかもしれません。
あと、このプログラムですと、改行文字も蹴ってしまいます。
改行文字を拾ってあげるように変更したほうがいいかもしれませんね。

No.12952

Re:テキストファイルからのASCII文字削除
投稿者---GGOOD(2004/02/25 14:21:24)


訂正です。

>int c = 0,i = 0;

int c = 0;

に変更して下さい。

No.12962

Re:テキストファイルからのASCII文字削除
投稿者---WD(2004/02/25 19:48:41)


返信ありがとうございます!試させていただきました。んーやはり難しいですね。シフトJISでは、私も文字化けしてしまいました。私も調べているのですがシフトJISの対処法とか知りませんか?

No.12963

Re:テキストファイルからのASCII文字削除
投稿者---おでん(2004/02/25 21:33:00)


>返信ありがとうございます!試させていただきました。んーやはり難しいですね。シフトJISでは、私も文字化けしてしまいました。私も調べているのですがシフトJISの対処法とか知りませんか?

シフトJISは、2バイト目が通常のASCIIコードとなる文字があります。
(“キ”→0x834Cなど)従って、一つ前に読み込んだデータがなんだったか
覚えておかなくてはなりません。
“0x83なら次の文字はASCIIではない”などの判断が必要となります。
http://www2.famille.ne.jp/~akio1998/l_x112.html あたりを参考にしてみてください

No.12950

Re:テキストファイルからのASCII文字削除
投稿者---nop(2004/02/25 13:55:25)


>while ( (c=fgetc(fp_input)) != EOF) {
> fputs(&amp;buf[i],fp_output);

文字単位の処理なので、出力には fputc() を使うべきでしょう。

No.12968

Re:テキストファイルからのASCII文字削除
投稿者---NykR(2004/02/25 23:49:14)


一バイトずつチェックしなくても、一文字ずつ調べればいいと思います。

#include <wchar.h>
#include <stdio.h>
#include <locale.h>

#ifndef isascii
#define isascii(c) ( ((c) & ~0x7f) == 0 )
                        /* アスキー文字は下位7ビット以外がセットされていない */
#endif

int main(void)
{
    wint_t wc;

    setlocale(LC_CTYPE, "");

    while ( (wc = getwchar()) != WEOF ) {
        if (isascii(wc)) {
            continue;
        }
        putwchar(wc);
    }
    return 0;
}