C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: ファイル操作に関する質問


(過去ログ 43 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■23002 / inTopicNo.1)  ファイル操作に関する質問
  
□投稿者/ toshi (1回)-(2008/08/06(Wed) 19:40:56)

分類:[C#] 

ファイル操作に関する質問をさせていただきます。

テキストファイル(C++ で組まれたソースコード)について、ある特定の行から一行ずつ上へ読み込む
方法が知りたいのですが教えてください。
もしくは、ファイルを末尾から先頭へ向かって一行ずつ読み込む方法がありましたら教えてください。
よろしくお願い致します。

【開発環境】
・Microsoft Visual C# 2005

【詳細】
メソッドの上にあるコメント部分を特定するプログラムを作成しています(以下の【例:読み込むソースコード】参照)。
StreamReaderのreadLineを使用して(上から下へ)一行ずつ読み込んで
メソッド行を特定する部分につては作成しています。
メソッド行から一行ずつ上へ読み込む方法が知りたいのですが教えてください。

今現在は、以上のような方法が検討できていない為、メソッド行が見つかるまでreadLineで読み込んだ文字列を
ローカルなストリングの変数へ追加して行き、一行ずつ戻りながらメソッドのコメント部分を特定させています。
ソースコードが膨大になるとその分ローカルなストリングの変数のデータ量が増えるため、他に良いやり方が
あれば教えてください。

【例:読み込むソースコード】
//##Comment Start
//Comment 1
//Comment 2
//Comment 3
unsl ClassName::MethodName (unsl parameter, bool *parameter2, ...)
{
※「//##〜」がメソッドのコメント開始位置

以上よろしくお願い致します。

引用返信 編集キー/
■23005 / inTopicNo.2)  Re[1]: ファイル操作に関する質問
□投稿者/ 紅の豚118 (6回)-(2008/08/06(Wed) 21:18:06)
No23002 (toshi さん) に返信
> テキストファイル(C++ で組まれたソースコード)について、ある特定の行から一行ずつ上へ読み込む
> 方法が知りたいのですが教えてください。
> もしくは、ファイルを末尾から先頭へ向かって一行ずつ読み込む方法がありましたら教えてください。
> よろしくお願い致します。

うーん。逆から読む方法ってあるんでしょうか??

一応後述のソースを考えたのですが、これだとこの辺りが満たせそうにないです。。。すいません。
>ソースコードが膨大になるとその分ローカルなストリングの変数のデータ量が増えるため、他に良いやり方が
>あれば教えてください。

List<string> targetCol = new List<string>();
targetColに読み取ったテキストをいれる();
//リバース。
IEnumerable<string> reverse = targetCol.Reverse<string>();
//逆になっているものを順番にとりだす
foreach (string target in reverse)
{
this.label1.Text += target + "\r\n";
}
引用返信 編集キー/
■23006 / inTopicNo.3)  Re[1]: ファイル操作に関する質問
□投稿者/ れい (727回)-(2008/08/06(Wed) 21:26:39)
No23002 (toshi さん) に返信
> テキストファイル(C++ で組まれたソースコード)について、ある特定の行から一行ずつ上へ読み込む
> 方法が知りたいのですが教えてください。
> もしくは、ファイルを末尾から先頭へ向かって一行ずつ読み込む方法がありましたら教えてください。
> よろしくお願い致します。

Windowsのファイルストリームは前から後ろへ読むように作られていますので、逆に読むのは大変です。
ストリームのサイズを取得して、後ろのほうを部分的読み込み、逆順に並び替えるのが最も簡単だと思います。

> 今現在は、以上のような方法が検討できていない為、メソッド行が見つかるまでreadLineで読み込んだ文字列を
> ローカルなストリングの変数へ追加して行き、一行ずつ戻りながらメソッドのコメント部分を特定させています。
> ソースコードが膨大になるとその分ローカルなストリングの変数のデータ量が増えるため、他に良いやり方が
> あれば教えてください。

変数に追加するときに、その行が必要な行かどうかをあらかじめ確認すれば記録用のメモリ領域は減らせます。
また、ファイルストリームであれば読み込み開始位置を指定することができるので、
行の先頭位置のみを記録すれば文字列分は減ります。
また、メソッドを同定したときに、そのストリーム位置がわかるはずですので、
そこから適当な量だけ前に戻って読むことで前の行を探すこともできます。
これはエンコーディングによっては面倒な場合もあります。

ですが、メモリに読み込んで問題になるほど大きいソースコードというのがあまり想像できません。
私の書いたコードをざっとみたところ、一番大きいファイルは10MByteでした。
それでも余裕で読み込めます。

あー。読み込むのに困るほど大きいソースコードだから解析するプログラムが必要なのですね…。
引用返信 編集キー/
■23014 / inTopicNo.4)  Re[2]: ファイル操作に関する質問
□投稿者/ ま (95回)-(2008/08/07(Thu) 01:38:23)
ファイル1行ずつ読んで
public class LineInfo {
   private int total;  //ファイル先頭からのこの行頭までのトータルバイト数
   private int length; //シーケンシャルリードするためのバイト数
   private boolean comment; "//Comment Start" が見つかった行のとき true
}
ようなクラスをArrayList に登録すればいいんじゃないかな。

全部読んで ArrayList が出来たらファイルを一旦閉じて、また開いて
ファイルポインタの移動だけで読み込み位置変更しながら読めばいいんじゃない?

改行コードも正確に判定しなくちゃならないからバイトリーダーで読むことになるかな。
行数多いと、マップ作る工数が馬鹿にならず、結局君の奴の方が速かったりすることも
あり後悔するかもしれませんね。。。

1バイトずつ読むと途方も無い時間かかるかもしれんからバッファリングしながら
読んでいくといいかも。


引用返信 編集キー/
■23017 / inTopicNo.5)  Re[1]: ファイル操作に関する質問
□投稿者/ オショウ (28回)-(2008/08/07(Thu) 09:47:27)
> テキストファイル(C++ で組まれたソースコード)について、ある特定の行から一行ずつ上へ読み込む
> 方法が知りたいのですが教えてください。
> もしくは、ファイルを末尾から先頭へ向かって一行ずつ読み込む方法がありましたら教えてください。
> よろしくお願い致します。

  MemoryStream使って、一旦メモリ上に読み込み、Seekをラップした
  1行読み込みのReadLine関数を新たに作れば・・・

  一行前とか一行後とかの移動先を見つけるのは、そう難しくない。

  処理時間は犠牲になるが、メモリ上に展開しているので、速いかと。

参考までに。

以上。
引用返信 編集キー/
■23039 / inTopicNo.6)  Re[2]: ファイル操作に関する質問
□投稿者/ toshi (2回)-(2008/08/07(Thu) 16:34:05)
>紅の豚さん、れいさん、まさん、オショウさん

色々なやり方教えていただいてありがとうございます。
教えて頂いたやり方試してみます。

今後ともよろしくお願い致します。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -