どるこむ仲間の掲示板! 過去ログ倉庫 | LOG:2001/09: | |
●2001年09月インデックス
●過去ログ検索トップ
■どるこむ仲間の掲示板へ
|
[3507] C言語。続き・・・・ (11 レス) 2001/09/09(Sun) 21:02:53 |
ぜふぃみあ さん |
Web: (none) | |
どうも、ぜふぃみあです。先日回答ありがとうございました。 今度はファイルでちょっと、トラぶってます・・・ 今現在、とあるテキスト形式のlogファイルの中からlledという文字列を含んだ 行を取り出し、1つのファイルにまとめる、ということをしているの ですが、取り出すところまでは良いのですが、書き込みでちょっとした 問題が生じます。txtエディターで見る文には、両者とも同じに見えます が、バイナリーエディターで開くと行の終わりが オリジナルが0D 0A で終わっているのに対し、まとめた方は 0D のみで終わっています。0Aが改行(\n)、0Dがリターンということは 分かったのですが、なぜこのような違いが生じてしまうのか分かりません。 問題が起こらなければ、とりあえずはこれでも良いのですが、このままでは 1つにまとめたファイルを読むと、最初に1行しか認識されなかったり、 挙動不審(文字"を探しても、見つけてくれない。coutを挟むと見つける)になったりと 手が着けられません。 プログラムは #include<fstream.h>をインクルードして#<stdio.h>もインクルード。 プログラム中で ifstream fi; ofstream fo; FILE *pipe = popen("find /usr/local/games/halflife/hlds_l/cstrike/logs -name '*.log' | sort" , "r"); このままでは、なぜか戻り値の最後に空白行ができるので while(fgets(buf,sizeof(buf),pipe)) { strcpy(buffer[pos],buf); buffer[pos][(strlen(buffer[pos])-1)] = '\0'; fio << buffer[pos] << '\n'; pos++; } ファイルを開きます。fo.open("xxxxx.log");fi.open("******"); 読み込みの最中に、補正をかけます。そして while(fi) { fi.getline(buf,255); for(int d = 0;d<strlen(buf);d++) { if((buf[d] == 'l') && (buf[d+1] == 'e') && (buf[d+2] == 'd') && (buf[d+3] == ' ')) { cout << buf; fo << buf; これにて、fo先に書き込むのですが、ここで変になります。(T^T) 何が原因か、6時間以上向かい合っているのですが全く分かりません。 どなたか・・・教えて下さい・・・O=(__;;; パタ... デバッグうまくなるこつ、ありますかね? 6時間がものすごく、もったいないです(TT) オリジナルの方がおかしくないですか。
リターンの所までで1行と見るから、改行が無視されているのでは無いでしょうか。 リターンだけで、改行がないままのファイルを開こうとするから、1行しか表示されない等の問題が発生すると思います。 多分、ずっと昔のドラム式のラインプリンタで印刷すると重ね打ちされるのだと思います。 書き込むときに強制的に改行コードを付加するとどうですか。 復帰改行のコードって無かったかな? そうなんですよね・・改行が無視されているみたいなんです。
しかしテストプログラムで int main() { char test[256],t; ofstream fo("test2.txt"); ifstream fi("L0901058.log"); while(fi) { fi.getline(test,256); fo << test; } } を作ると、これは正常にできます(ただのファイルのコピーです) しかし、なぜか今のプログラムではうまくいかないです・・・ input.cがファイルを読み込み、1つにまとめる物。 test9.cがまとめた物を見よう、という物です。 http://www23.cds.ne.jp/~zefimia/input.c/ http://www23.cds.ne.jp/~zefimia/test9.c/ なーーぜーーか、ソースレベルでは同じ事をやっているはずなのに 結果が違うんです・・・・ 画面に向かい合うこと、むむ・・8時間くらいかな・・・
やっと解決しました。 どうやら、ファイルのオープン。クローズに慣れておらず、2つも 3つもファイルを同時オープンしたのが、問題だったようです。 使い終わった物をすぐに閉じたら、うまくいきました。 BASICから移ったので、デバッグなんかそんなに難しくないかな と思ってたのが間違いでした。今回は良い勉強になりました。 これで、終わらせると意味がないので、とりあえず一つみなさんに お聞きしたいことがあるのですが プログラミング言語は、今この世の中にたくさんで回っていますが みなさんは何を使われていますか? C言語が今までオールラウンドだと思っていたのですが、JAVAアプレットは なにやら本を見ると、C言語よりも並列処理をうまくやる言語だとか perlはawk・sed・C などの便利なところだけを引き継いだ。 と書かれています。更にDelphyはコボルベース?だが、フリーソフト を見るとdelphyで書かれている物も多いし、VBもexcelがらみで 使っている人が多いです。今どれをやるのが良いのか、ということを 知りたいので、良かったら教えて下さい。 DelphiはPascalベースです。
Pascalのプログラマが多いのは基本的にBorlandの功績で、本格的なコンパイラで最初に価格破壊がなされたのが、TurboPascalだったからです。91年ぐらいの話でしょうか。 TurboCはその翌年だったかな。TurboPascalが後発だったら、Borland独自の市場(ホビーのPascalプログラマ)を開拓することは、できなかったかもしれません。 んで、お仕事でプログラムを作る場合、WindowsならばVisualC++が共通語なので、何よりもまずこれが使える必要があります。 そっから沙希^H^H先は、好き好きでよいと思います。WebならJavaとかcgiはPerlとか、傾向はありますが。 私が使えるのは、VisualC++(5/6)、BorlandC++(4/5)、C++Builder(1/4)、MASM/TASM他アセンブラ数種類、石化してますがJavaの知識が少々。BASICはS及びHu(爆)、N88、Quickだけで、Visualは触っていません。他は…大学でちょっとだけかじったfortran、Tcl/Tkあたりでしょうか。 7. YU 2001/09/09(Sun) 22:51:14
言語的に仕様が万能に近くても、実装 (スピード、サイズ) などの問題がどうしても出てくるので、結局、万能の言語というのは存在しません。
できるだけたくさんの言語を覚え、それぞれの特徴を把握して、状況に応じて使い分けるのが理想です。 あと、DelphyじゃなくてDelphiですね。 確か、環境によって改行コードの扱いが違うんですよね。
標準入出力関数(テキストモード)で \n を出力してみると、 UNIX 系では 0A が出力され、MAC-OS では 0D が出力され、 Windows/DOS系では 0D0A が出力されるという・・・。 明確に 0D0A を出力するには、バイナリモードで書き込み、 \r\n を出力するしかないかと・・・。 ちなみに、私は殆どC言語のみです。普通の人ならインラインアセンブラとか 使うところも強引にC言語で書いてます(笑) VBやアセンブラ(86)も使えない事は無いですが、やっぱCに統一 しましょうと言う事で・・・ 9. McBenie 2001/09/10(Mon) 01:21:56
何か一つ、自分の得意な(好きな)言語を深く追求して、
興味をもった他のプログラミング言語は手当たり次第(笑)、広く浅く習得しておくと 後々便利かも知れません。 私は今C++にべったり。STL使うとかなり楽なんですよね。 perlライクに連想配列とか使えるし・・・。 でも実行ファイルサイズが・・・速度が・・・ 10. 98@440BX互換機 2001/09/10(Mon) 10:18:41
Cといえばmain関数を極力小さく作成する、というポリシーを持ってる人が時々いますがここではどうなのかな。
私もそれに近いんですが、過去作ったものではmain関数が{}を除けば実際の処理が数行、プログラム全体は600〜700行、ってのがありました(笑) ちなみに私もメイン言語はC言語です。VC++も勉強したいんですが時間がないのがなんとも。 やはり、色々とやってみるのが良いみたいですね。
とりあえず、C言語、及びC++を初心者レベルだけでも クリアー使用と思います(^^ゞ main関数ですが・・・・小さくするのは良いと思うんですが 今回行き当たりばったりでやったので・・・膨れ上がりました(^^ゞ 精進せねば。 |