- ベストアンサー
テキストファイルの文字を消す方法
Windows上で作ったテキストをLinuxで開くと「^M」の制御コードが見えてしまいます。 この制御コードの混じったテキストをプログラムで消そうとしているのですがいまいち、これといった方法が思いつきません。 普通テキストファイルの特定の文字(制御コードでなくとも)を消す場合どのようにするのでしょうか? 私の環境としては Windows2000 VC++ です。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは、No.1のarukamunです。 やはりフィルタープログラムでしたか。 フィルタープログラムはstdinからstdoutへ通す際にまさしくフィルターしてあげる事です。 一般的にフィルタープログラムで使う関数は getchar(); putchar(); の2個です。 但し、今回の様な改行コードがstdinからはうまく取り込めないようです。 (私の使っているコンパイラが悪いのかソースが悪いのか解りません。) ですので、フィルターでは無くて、ファイルコンバーターに近い方法を説明します。 #include <stdio.h> main(int argc,char *argv[]) { int ch ; FILE *rfp,*wfp ; if ( argc < 3 ) return ; rfp = fopen(argv[1],"rb"); wfp = fopen(argv[2],"wb"); do { ch = fgetc(rfp); if ( ch != 0x0d && ch != -1 ) fputc(ch,wfp); } while ( ch != -1 ); fclose(wfp); fclose(rfp); } このプログラムでは第一パラメータのファイルを第二パラメータのファイルにコンバートします。 とりあえず、0x0dを取り除くだけですが、サンプルとしては十分でしょう。 第一パラメータと第二パラメータが等しかったらバグります。(笑)
その他の回答 (2)
- hiroyapapa
- ベストアンサー率45% (17/37)
一般的には、 ・元のファイルをバッファに読み込む。(read(), fread()など) ・必要な変換をおこない、別のバッファに入れる。(ご質問のケースでは、特定の文字コードが現れたら取り除く。) ・変換後のバッファを、別のファイルに書き出す。 といったことをおこないます。(write(), fwrite()など) 読み込み→変換→書き出しの単位を、 ・1文字単位でおこなうのか、 ・1行単位でおこなうのか、 ・メモリが許す限りファイル単位でおこなうのか、 あなたの設計次第です。 unixのコマンドの伝統の観点から書き添えますと、 標準入力から読み込み、標準出力に書き出す、といったフィルターも好まれます。(パイプで接続できるからです。) 例) shell> filter < original.txt > converted.txt とか shell> hogehoge | filter | hagehage とかも可能になるから。 もちろん、 shell> filter -if original.txt -of converted.txt とかも出来るようにしておくと申し分ないですね。 参考まで。
- arukamun
- ベストアンサー率35% (842/2394)
こんにちは C言語の所で質問されているという事はフィルタプログラムを作ろうとしているのでしょうか。 それともCのファイルをLinuxへ持って行った時の改行コードの変換方法を質問されているのでしょうか。 Windows系、Unix系、Mac系、それぞれ改行コードが違います。 0x0A \n Unix系 0x0D 0x0A \r\n Windows系 0x0D \r Mac系 です。 FTPでファイル転送するのであれば、ASCIIになっていれば改行コードを勝手に変換してくれる物もあります。 また、C言語でフィルターを作るのであれば、上記の情報があれば、作れると思います。
お礼
ありがとうございます。 仰る通りフィルターのプログラムを作ろうとしておりますが少し一般的な質問として「テキストファイルの一部の文字を消す」という処理はどのようにするのかがいまいちわかりません。 もしお時間あればよろしくお願いします。