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

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

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

Re[8]: 設定ファイルから読み込み


(過去ログ 41 を表示中)

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

■21626 / inTopicNo.1)  設定ファイルから読み込み
  
□投稿者/ kaoru (22回)-(2008/07/06(Sun) 17:49:14)

分類:[C#] 

いつもお世話になります。C# 2008 ExpressEditionをXPで使用しています。
まる二日悩んでいるのですが、どうしても設定ファイルから読み込んだメールアドレスその他を使ってメール送信をできません。アドバイスいただければと。

設定ファイルは下記の通り。

sendmail.ini
To=tomail@send.ne.jp
SendLoginID=kaoru
SmtpHost=mail.smtp.ne.jp
SmtpPort=587
SmtpUser=username@mail.smtp.ne.jp
SmtpPassword=password

プログラムは下記の通り。

using System.IO ; // for File, StreamReader
using System.Text ; // for Encoding
using System;
using System.Collections.Generic;
using System.Linq;

private void read_file(string file_name)
{
static string To;
static string SendLoginID;
static string SmtpHost;
static string SmtpPort;
static string SmtpUser;
static string SmtpPassword;

if (!File.Exists(sendmail.ini)) return ; // ファイルの有無をチェック

try
{
StreamReader reader = new StreamReader("sendmail.ini", Encoding.GetEncoding("Shift_JIS")) ;
string A ;
while ((A = reader.ReadLine()) != null)
{

//設定ファイル読み込み
string[] field = reader.ReadLine().Split('=');
if (field[0] == "To") To = field[1];
if (field[0] == "SendLoginID") SendLoginID = field[1];
if (field[0] == "SmtpHost") SmtpHost = field[1];
if (field[0] == "SmtpPort") SmtpPort = field[1];
if (field[0] == "SmtpUser") SmtpUser = field[1];
if (field[0] == "SmtpPassword") SmtpPassword = field[1];
}
reader.Close() ;
}
catch (IOException) { } //例外処理
}

これで、To以下にsendmail.iniの各項目を入れて、あとは、

string to = To;
string from = SendLoginID;
string subject = "テスト";
string body = "テストです。";

MailMessage message = new MailMessage(from, to, subject, body);
message.BodyEncoding = Encoding.GetEncoding("iso-2022-jp");

というような形で送信できると思っているのですが…。
ご教示いただければと思います。

引用返信 編集キー/
■21627 / inTopicNo.2)  Re[1]: 設定ファイルから読み込み
□投稿者/ れい (688回)-(2008/07/06(Sun) 17:56:28)
No21626 (kaoru さん) に返信
> いつもお世話になります。C# 2008 ExpressEditionをXPで使用しています。
> まる二日悩んでいるのですが、どうしても設定ファイルから読み込んだメールアドレスその他を使ってメール送信をできません。アドバイスいただければと。

どうできないのでしょうか?
できないにしても
エラーが出るとか違うアドレスに送られてしまうとか、
いろいろありますよね。


引用返信 編集キー/
■21629 / inTopicNo.3)  Re[2]: 設定ファイルから読み込み
□投稿者/ kaoru (23回)-(2008/07/06(Sun) 19:09:08)
No21627 (れい さん) に返信
れいさん。おっしゃるとおりです。このソースを使う以前は、固定的にメールアドレスをソースで指定しているのですが、その場合には、添付メールで送信できました。
その次の段階として、ファイルからアドレスを読み取って送信しようとしているのですが、このソースを組み込んだ場合、ビルドに失敗して、まずexeを作れない状況です。

手順と状況ですが、次のようにしました。このソースを、メールを送信する直前の部分に貼り込みました。
すると、大量にエラー。
エラー 1 } が必要です。
エラー 2 型、名前空間の定義、またはファイルの終わりが必要です。
エラー 3 名前空間にフィールドやメソッドのようなメンバを直接含めることはできません。
エラー 4 クラス、デリゲート、列挙型、インターフェイス または構造体が必要です。
エラー 5 型、名前空間の定義、またはファイルの終わりが必要です。
エラー 6 修飾子 'static' がこの項目に対して有効ではありません。
エラー 7 修飾子 'static' がこの項目に対して有効ではありません。
エラー 8 修飾子 'static' がこの項目に対して有効ではありません。
エラー 9 修飾子 'static' がこの項目に対して有効ではありません。
エラー 10 修飾子 'static' がこの項目に対して有効ではありません。
エラー 11 修飾子 'static' がこの項目に対して有効ではありません。

そこで、staticを削除したところ、エラーは上の5つに減りましたが、どれもどのように解決したらよいか、よくわからない、という状況です。

次に、貼り込み位置が悪いのかと、private{ }の外にしてみました。この場合、クラス? がわかれてしまうので、privateでは、項目を参照できなくなると考え、privateをpublicに変えてみました。

エラー 1 型または名前空間名 'ini' は名前空間 'project' に存在しません。アセンブリ参照が不足しています。
その他、いろいろやってみましたが、このあたりで、現在とまどっています。つまり整理すると、

(1)ファイルから読み込んだ値を参照する場合、貼り込み位置は、

namespace project
{
public partial class Form1 : Form
public Form1()
{
}

●ここA●

private void
{
●ここB●
}

……
}

の「ここA」でよいのかどうか? ここBに貼ると、上のようにエラーが出るので、BよりはAのほうがよさそうですが…、それでよいのかどうか。まあこれは次の(2)を解決でき、送信できれば、特に問題ではないですね。

(2)「型または名前空間名 'ini' は名前空間 'project' に存在しません。アセンブリ参照が不足しています。」にどう対応したらよいか?
というのがもっとも聞きたいことになります。
以上、よろしくアドバイスお願いします。

引用返信 編集キー/
■21630 / inTopicNo.4)  Re[3]: 設定ファイルから読み込み
□投稿者/ なちゃ (139回)-(2008/07/06(Sun) 19:20:16)
そもそもそのまま張り込むのは無理だと思いますが、どこから持ってきたソースですか?
ソースの内容を理解したら組み込めるとは思いますが。

ただ処理内容もちょっとおかしいしトラブりそうなソースですね…


引用返信 編集キー/
■21631 / inTopicNo.5)  Re[4]: 設定ファイルから読み込み
□投稿者/ kaoru (24回)-(2008/07/06(Sun) 20:03:27)
No21630 (なちゃ さん) に返信
なちゃさん。コメントありがとうございます。
植田政美、チーム・エムツー『ひと目でわかるVisual C# 2008アプリケーション開発入門』(日経BPソフトプレス)の8章のファイルの読み込みにあるソースを元にしたものです。
そのあといま、ひょっとしてこれってCSVファイルの読み込みに近いのかもと思って、http://www.atmarkit.co.jp/fdotnet/dotnettips/487csvparser/csvparser.htmlを参考に、

using System;
using Microsoft.VisualBasic.FileIO;

class CSVParser {
static void Main() {

TextFieldParser parser = new TextFieldParser("PileHatena.ini", System.Text.Encoding.GetEncoding("Shift_JIS"));

using (parser) {
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters("="); // 区切り文字はイコール

// parser.HasFieldsEnclosedInQuotes = false;
// parser.TrimWhiteSpace = false;

while (!parser.EndOfData) {
string[] row = parser.ReadFields(); // 1行読み込み

foreach (string field in row) {
string[] field = reader.ReadLine().Split('=');
if (field[0] == "To") To = field[1];
if (field[0] == "SendLoginID") SendLoginID = field[1];
if (field[0] == "SmtpHost") SmtpHost = field[1];
if (field[0] == "SmtpPort") SmtpPort = field[1];
if (field[0] == "SmtpUser") SmtpUser = field[1];
if (field[0] == "SmtpPassword") SmtpPassword = field[1];

}
MessageBox.WriteLine();
reader.Close() ;
}
catch (IOException) { } //例外処理
}
}
}

のようにしてみましたが、これまたエラーがたくさん。
え〜と、ごく大ざっぱなgawk的な理解では、ファイルを読んだあと、区切り文字を設定して、フィールドごとに変数に読み込む、という風に考えています。
引用返信 編集キー/
■21634 / inTopicNo.6)  Re[5]: 設定ファイルから読み込み
□投稿者/ Azulean (157回)-(2008/07/06(Sun) 21:04:34)
最初から色々とやろうと考えず、まずは自分のコードを動かすことを考えて下さい。
動くようになってから応用を考えましょう。

動くようにする過程とその後のいじり方でどういうものかを理解していくことが大切かなと。
言語のルールみたいなものを分かっていないと引っかかることが多く、説明するのも大変です。

基本的なところから押さえていくことをお薦めします。
引用返信 編集キー/
■21635 / inTopicNo.7)  Re[6]: 設定ファイルから読み込み
□投稿者/ kaoru (25回)-(2008/07/06(Sun) 23:07:58)
2008/07/06(Sun) 23:09:23 編集(投稿者)

No21634 (Azulean さん) に返信
みなさん、コメントありがとうございます。基本はともあれ、次のような形で、1行ごとにデータを読めるようになりました。
で、あとは行ごとに別々にとり出せればそれで足りるのですが、それはどうしたらよいでしょう?
ためしにstをst[1]としたところ、

エラー 1 'System.Windows.Forms.MessageBox.Show(string)' に最も適しているオーバーロード メソッドには無効な引数がいくつか含まれています。
エラー 2 引数 '1': 'char' から 'string' に変換できません。
となり、うまくいきませんでした。

string[] list;
string _line;
System.IO.StreamReader reader = new System.IO.StreamReader ("config.ini", System.Text.Encoding.GetEncoding("Shift_JIS")) ;
while ((_line = reader.ReadLine()) != null) {
list = _line.Split('=');
foreach (string st in list) {
MessageBox.Show(st);
}
}
reader.Close() ;

引用返信 編集キー/
■21636 / inTopicNo.8)  Re[7]: 設定ファイルから読み込み
□投稿者/ Azulean (158回)-(2008/07/06(Sun) 23:48:39)
2008/07/06(Sun) 23:58:49 編集(投稿者)

> で、あとは行ごとに別々にとり出せればそれで足りるのですが、それはどうしたらよいでしょう?
> ためしにstをst[1]としたところ、
「ためしに」は大いに結構ですが、それの意味するところを考えましょう。

少なくとも以下の点は動作を理解する上で考えて欲しいところかな?
・ReadLineは何をするメソッドですか?
・_lineにはどういったものが入りますか?
・listにはどういったものが入りますか?
・stにはどういったものが入りますか?
・st[1]は何を意味しますか?
・while(〜)の行からreader.Close()の前の行まではどのようなことになっていますか?

それを理解した上で、お望みの「行ごとに別々に取り出す」といった結果はどうすれば得られるか考えていきましょう。


#よく考えると、iniの読み込みならこの路線じゃなくても良かったような気がする。
引用返信 編集キー/
■21637 / inTopicNo.9)  Re[7]: 設定ファイルから読み込み
□投稿者/ ま (65回)-(2008/07/06(Sun) 23:56:41)
No21635 (kaoru さん) に返信
> 2008/07/06(Sun) 23:09:23 編集(投稿者)
> 
> ■No21634 (Azulean さん) に返信
>基本はともあれ

?? 基本は ?? 先が長いから基本はとりあえず先延ばしかな?

> で、あとは行ごとに別々にとり出せればそれで足りるのですが、それはどうしたらよいでしょう?
> ためしにstをst[1]としたところ、

マップ使いましょう。

public class IniFileReader {
   マップ map = new マップ();
   public IniFileReader(string filename) {
      read(filename);
   }
   private void read(string filename) {
      //ファイルおーぷん
      //1行読んで
      // "=" で分割して
      // 左辺を キーに、右辺を値で マップ map に格納する
      //全部格納したらファイル閉じる
   }
   public string getValue(string keyname) {
      //マップ map に keyname を与えて 値を取り出す
      //取り出した値を返す
      //存在しないキーを渡されたら Exeception なり、なんなりと。
   }
   public string ToString() {
      //デバッガのウォッチ窓で覗けるように、map の中身を全部列挙するのね。
      //ここでは、stringbuilder ってくらすが役に立つかも。
   }
}

こーゆークラス作ってみたらいいんじゃねーかな。

フォームクラスにベタでガリガリ書いていくのもいいけど、それは慣れてからで。
時間が無さそうな気配はなんとなく文面から読み取れそうだけど、ここはぐっと
我慢かな。

awk すらっと書けちゃう人がこんなもんで悩むなんておかしい。




引用返信 編集キー/
■21638 / inTopicNo.10)  Re[3]: 設定ファイルから読み込み
□投稿者/ れい (689回)-(2008/07/07(Mon) 00:49:35)
No21629 (kaoru さん) に返信
> ■No21627 (れい さん) に返信
> れいさん。おっしゃるとおりです。このソースを使う以前は、固定的にメールアドレスをソースで指定しているのですが、その場合には、添付メールで送信できました。
> その次の段階として、ファイルからアドレスを読み取って送信しようとしているのですが、このソースを組み込んだ場合、ビルドに失敗して、まずexeを作れない状況です。

コンパイルエラーですね。

> そこで、staticを削除したところ、エラーは上の5つに減りましたが、どれもどのように解決したらよいか、よくわからない、という状況です。
> (1)ファイルから読み込んだ値を参照する場合、貼り込み位置は、
> (2)「型または名前空間名 'ini' は名前空間 'project' に存在しません。アセンブリ参照が不足しています。」にどう対応したらよいか?
> 以上、よろしくアドバイスお願いします。

以下、私のアドバイスです。

今までの投稿内容を見る限り、プログラムやアルゴリズムに対する基本的理解が足りないようです。
kaoruさんが行き詰っている点は基礎を学べば簡単に解決できる問題です。

やろうとしていることは難しいことではありませんが、
それでもkaoruさんの投稿内容から推測するに、今のkaoruさんではかなり高いハードルだと思います。

プログラミングの入門書、入門サイトなどを参考に、
基礎から勉強したほうがよいと思います。

ひとつひとつのエラーについて原因と解決策を説明することも可能ですが、
私にはその意義が見出せません。
この掲示板を用いての説明よりも、図などを駆使したプログラムの入門書を読んだほうが、
よっぽど早く、正確に学習できることでしょう。

ここで質問して回答を待つより、
近所の書店にでも言って立ち読みしたほうが解決には近いかと思います。
引用返信 編集キー/
■21639 / inTopicNo.11)  Re[4]: 設定ファイルから読み込み
□投稿者/ kaoru (27回)-(2008/07/07(Mon) 01:40:46)
おつきあいいただきありがとうございます。ほんとに感謝します。
ご推察の通り、わたしがC#を始めたのは、6月17日。せいぜいまだ半月程しかたってません。それに較べて、gawkは17年くらいは使っているので、gawkでできることとC#でできないこととの差があまりにも大きいことは自分でもよくわかっております。
おっしゃるとおり、基礎からやれというのは、きわめて重要だろうとは思っていますが、その基礎が、いまいちぴんとこない。いま作りたいアプリケーション、それのファーストバージョンは、C#からバッチファイルでgawkを呼び出すという、かなりなんつーか、C#の皮をかぶったバッチファイルという状況でした。
設定のためにウィンドウを出すところなんて、wshも使ってますし。それでも、できることはすでに充分あって、それに較べて、クラスだのなんだのという動かない物の概念を一から覚えるというのは、途方もなく遠回りに思えてならないのです。
もちろん、基礎は重要です。それは充分に理解していますが、動くものを作れて、動いた! と実践的にやってみることのほうの楽しさにわたしはひかれるし、振り返ってみると、受験にしろ勉強にしろ、いつもそうやって覚えてきたのだと。
それはもちろん基礎をやらなくてよいというわけではないですし、いつか、そのいつかというのは、ある程度動かしてみて、何がどうなのか、というのがわかってからでも、充分だろうと考えています。

さてところが、試しにリリースしようと思ったら、gawk以外にも複数のアプリケーション、すなわち添付メールの送信とか、nkfとか、base64とかsendmailとか、それぞれ個別にライセンスがあり、それをクリアするのはなかなか難しい、と考えざるを得ませんでした。作っているソフトは、かなり大規模なもので、動作実績は約1年になるのですが、なにしろ自分で作って自分で動かしているので、リリースできるような状況ではない、というのが現状です。
それでそれならいっそこれを機会に、ぜんぶ(できるところは)すくなくとも、他のアプリケーションに依存する部分だけは、C#にして、ライセンスも問題なくして(まあソースは見たじゃんというのは別として)、その大規模なソフトの一部分を、パーツにわけてリリースしていこうと考えている、というのが現在のところです。
それでわずか2週間ほどですが、メーラーを一から作るのに較べて(つくったわけですが)、わずか10行ほどで添付メールを作れる効率のよさで、いや〜C#おもしろいじゃんと、はまっているところです。
ま。そんな感じ。
で、基礎をやれというのは、たぶんおっしゃることは充分にわかっていて、なお確信犯的にやっていないので、そんなんじゃだめだ、といわれればそりゃあもう、スタイルが違うとしかいいようがないのですけど、それはしばらくおいて、ということであります。

ご質問の件。
・ReadLineは何をするメソッドですか? 行を読むメソッドです。
・_lineにはどういったものが入りますか? stringなので文字列が入り、whileでnullまでくり返しているので、順次1行分の文字列が入ります。
・listにはどういったものが入りますか? _lineを、=で分割(Split)したものなので、To とか、mail@send.ne.jpとかの一覧です。
・stにはどういったものが入りますか? その個別の文字列群。
・st[1]は何を意味しますか? Toを意味する、と思ってます。このあたりが怪しい感じ。
・while(〜)の行からreader.Close()の前の行まではどのようなことになっていますか? それのくり返し。くり返しってことは、…。というあたりがすこしグレー。
………。う〜む。

れいさん。おっしゃるとおり、プログラムやアルゴリズムに対する基本的理解もなにも、なんにもないです。おっしゃるように、しかしながら、それとおなじことを、gawk、wsh、バッチファイル、などで書いてきたことを考えれば、まずは単に移植するだけなので、それがどの程度必要なのか、切実に響かない、というところです。
ちなみに、入門書として適当かどうかはわかりませんが、

ひと目でわかるVisual C# 2008アプリケーション開発入門
これからはじめるVisual C#2008
プログラムを作ろう! Visual C# 2008 Express Edition入門

の3冊を購入して座右の書としております。
しかしながら、この3冊とも索引があまりにも貧弱で、たとえばわたしのしたいことに対する索引がなく、その索引を作りながら読み進めているところで、本としては限界があると思います。

プログラムを作ろう! Visual C# 2008 Express Edition入門
は題材としてゲームを作るのですが、わたしはゲームにまったく興味がなく、ゲームを作るという作業のなかにファイルの読み書きとか、というような基礎的な項目がひとつながりのストーリーとして入っている、ということを認めるのはやぶさかではないのですが、あまりに低レベルなゲームの画面を見ていると、それだけでげんなりしてしまって、興味が続きません。

ひと目でわかるVisual C# 2008アプリケーション開発入門
は、それに較べると作るのがスケジュール帳なので、すこしわたしの作りたいものに近く、その点では参考にしやすいのですが、こちらも索引の貧弱さは目を覆うばかりで、探して学ぶ、というのには不向きだと考えざるを得ません。
また、この本は、1冊かけていわゆるアルゴリズムや設計からアプリケーションまで作ってしまうので、それぞれの項目が貧弱で、もうちょっと詳しく書いてほしい、というところが微妙に抜け落ちていて、理解を妨げます。

これからはじめるVisual C#2008
は、厚手の本で、コンソールアプリケーションにボリュームの約半分を割くなど、かなりバランスの不明瞭な本で、探す技術を見つけることがむずかしい、と感じます。だいたいコンソールアプリケーションの作り方と、ウィンドウアプリケーションの作り方との違いもわかってないですし。

あ、あと、マイクロソフトの体験ビデオの第1回目を40分ほど見ました。あれは勉強になりましたが、前半は一度見れば充分な起動や保存方法で、やはり密度が薄いのが難点。

その他Webサイトも一通りは目を通しました。msdnは、サンプルソースがぜんたいに長くて、丁寧だが理解はむずかしい、という状況にあります。

で、読んでわからないんなら、作ってみるしかないかと、そういう状況にあって、基礎といわれても、むむむ。と、そういう感じです。
たとえば、「ま」さんにご示唆いただいたmapを試そうかと思うときに、この3冊の索引にはどこにもmapの項目がなく、参考になるものがない、と。そういう入門書って、やっぱり丁寧さに欠けていると思うのですよ。
いや、理解できないのを棚に上げてどうよとおっしゃるかもしれないけど、すくなくとも索引をいまの10倍くらい増やしたら、編集者の手間はかかるかもしれないけど、本としての使い勝手は飛躍的にアップすると思います。っていうか、編集者が手抜きしているとしか見えないです。
ま、そんなこんなで、入門書も随時参考にはしてはいますし、ソースを書く努力もしてますが、まだ成功体験が少なすぎて、萎え気味という感じ。
どうぞ基礎からやれとばかりおっしゃらず、しばらくおつきあいいただけたらと思う次第です。勝手ばかりで申しわけありません。

引用返信 編集キー/
■21640 / inTopicNo.12)  Re[5]: 設定ファイルから読み込み
□投稿者/ れい (690回)-(2008/07/07(Mon) 02:48:49)
2008/07/07(Mon) 02:49:34 編集(投稿者)

No21639 (kaoru さん) に返信
> の3冊を購入して座右の書としております。
> しかしながら、この3冊とも索引があまりにも貧弱で、たとえばわたしのしたいことに対する索引がなく、その索引を作りながら読み進めているところで、本としては限界があると思います。

その3冊がどんなものか知りませんが、
索引から調べて作ることに向いてるような本ではないということでしょう。
どんな分野でも入門書というのは丸々読みきることを念頭に作られていて、
索引を引いて調べる「辞書」のようなものではありません。

辞書のように使いたいのであればMSDNなどのリファレンスが相当しますが、
MSDNの内容が分からないのであれば基礎が足りないということですね。

> 途方もなく遠回りに思えてならないのです。

「学問に王道なし」なんて言葉がありますが、
基本的に知識というのは常にそんな感じです。
対価がすぐに得られないものが知識で、それで喜ぶのが知的欲求です。

> 充分だろうと考えています。

言い方とかはいろいろ違いますが、
私を含め数名が「基礎を」という内容でアドバイスしてますよね。
しかしそれでも基礎は後でよいと言い、

> で、基礎をやれというのは、たぶんおっしゃることは充分にわかっていて、なお確信犯的にやっていないので、そんなんじゃだめだ、といわれればそりゃあもう、スタイルが違うとしかいいようがないのですけど、それはしばらくおいて、ということであります。

基礎の重要性は理解しているのと言うのですね。
とするとつまり、私を含め数名のアドバイスは聞くつもりがない、
「自分の信念・スタイルが正しいと信じる人」だということですね。

ならば私にできるアドバイスは殆どありません。
応援するくらいでしょうか。
貴方の神、信念を否定することは私にはできませんので。

って、そういえば私は同じスタイルですね:D

プログラムに関しては入門書・入門サイトを読んだことも、基礎をしっかり勉強したこともないです。
少なくとも私は「いま基礎を勉強してるんだ」なんて思ったことはないですね。
作りたいものを作る過程でいろいろ調べるだけで。

#そんな基礎の無い私から見ても基礎が足りないように見えますが。

同じスタイルのよしみということで、がんばってアドバイスすると、
・もっと問題を細かく分ける
・高いハードルを超えようとしない
・開発効率に感動しない
・あれこれいじってみる
まぁその程度でしょうか。

前の投稿で書いたように
意義が思いつきませんので、個々の質問に関しては答えません。

茨の道を歩いているように思いますが、
がんばってください。
引用返信 編集キー/
■21641 / inTopicNo.13)  Re[5]: 設定ファイルから読み込み
□投稿者/ Azulean (159回)-(2008/07/07(Mon) 06:57:40)
2008/07/07(Mon) 06:59:02 編集(投稿者)

ご回答ありがとうございます。
気になった点のみ書きます。

> ・_lineにはどういったものが入りますか? stringなので文字列が入り、whileでnullまでくり返しているので、順次1行分の文字列が入ります。
順次なので、繰り返しの次に行ったときには中身が消えます。(while分で上書きしているので)
前の行について覚えておきたければ、自分でその仕組み(変数とロジック)を書く必要があるでしょう。

> ・st[1]は何を意味しますか? Toを意味する、と思ってます。このあたりが怪しい感じ。
StringクラスのCharsプロパティの呼び出しを省略したものと扱われます。
http://msdn.microsoft.com/ja-jp/library/system.string.chars.aspx
-----
> いや、理解できないのを棚に上げてどうよとおっしゃるかもしれないけど、すくなくとも索引をいまの10倍くらい増やしたら、編集者の手間はかかるかもしれないけど、本としての使い勝手は飛躍的にアップすると思います。っていうか、編集者が手抜きしているとしか見えないです。
大抵の入門書はリファレンスではありません。
頭から順番に学ぶためのものでしょう。
こんなときはどうするのと言うようなものをご希望であれば、逆引きのタイトルがついている本を立ち読みしてみてはいかがでしょうか。

> で、基礎をやれというのは、たぶんおっしゃることは充分にわかっていて、なお確信犯的にやっていないので、そんなんじゃだめだ、といわれればそりゃあもう、スタイルが違うとしかいいようがないのですけど、それはしばらくおいて、ということであります。
基礎をすっ飛ばし、その場を乗り切れればOKみたいな回答をお望みであれば、申し訳ありませんが、私は降ります。

引用返信 編集キー/
■21650 / inTopicNo.14)  Re[6]: 設定ファイルから読み込み
□投稿者/ ま (66回)-(2008/07/07(Mon) 11:46:08)
2008/07/07(Mon) 12:32:06 編集(投稿者)
>たとえば、「ま」さんにご示唆いただいたmapを試そうかと思うときに、この3冊の索引にはどこにもmapの項目
>がなく、参考になるものがない、と。そういう入門書って、やっぱり丁寧さに欠けていると思うのですよ。

マップって言葉がよくなかったのかな?
連想配列って言えばよかったですか?

//JavaScript(WSH) ではこんな感じですね。
function IniFileReader(fileName) {
   var ini = [];
   var fso = new ActiveXObject("scripting.FileSystemObject");

   var otf = fso.OpenTextFile(fileName);

   //abc=1.2.2 を読んで
   while ((var line = otf.ReadLine()) != null) {
       //ps[0]=abc, ps[1]=1.2.2 に分割して
       var ps = line.split("=");
       //ini["abc"] = "1.2.2" とする
       ini[ps[0]] = ps[1];
   
   }
   otf.Close();
   return ini;  
}
//例)
var opt_abc = IniFileReader("xxx.ini")["abc"];

これを、C# に直すんですね。

ちなみに、awk で書くとどうなるんですか?

awk で書いて出来たものを、C# に直すにはどことどこをいじればいいのか、なんて
考えながらやると上達はやいですよ。

//Java で書くとこんな感じ。
public class IniFileReader {
   Map map = new HashMap();
   public IniFileReader(String fileName) {
      read(fileName);
   }
   private void read(String fileName) {
      try {
         BufferedReader br = new BufferedReader(new File(fileName));
         String line = null;
         while ((line = br.readLine()) != null) {
            String[] ss = line.split("=");
            map.put(ss[0], ss[1]);
         }
         br.close();
      }
      catch(Exception e) {
         //何かの IO エラー
      }
   }
   public String getProperty(String keyName) {
      return map.get(keyName);
   }
}

//C# で書くとこんな感じ
public class IniFileReader
{
   Dictionary dic = new Dictionary();
   public IniFileReader(string filename)
   {
       read(filename);
   }
   private void read(string filename)
   {
       Reader r = new Reader(filename);
       while ((string line = r.ReadLine()) != null) {
          string[] ss = line.Split("=");
          dic.add(ss[0], ss[1]);      
       }
       r.Close();
   }
   public property string Property(stirng key)
   {
       get {
          return dic[key];
       }
   }
}

プロパティの部分は微妙にC#っぽく無いな・・・


まぁ、どーでもいいのですが、どの言語で書いても while 部分は大差ないですよね。
awk で書くと劇的にすっきりしちゃうのですか?


追記:awk では。

BEGIN {
   FS = "="
   MAP
   while ($0 != "") {
      MAP[$1] = $2
   }
   
}
function property(key) {
   return MAP[key]
}

こんな感じですかね。所要時間10分くらいです。たぶんダメダメでしょうけど。
http://homepage2.nifty.com/mozu/koza/awk_koza/awk_koza_13.html
ここで勉強しました。

ファイル読み込み自体を awk が代行してくれるって部分を考慮すると、肝心のロジック
だけ書けばいいので楽っちゃ楽ですね。でも while の部分はどの言語も似たりよったり
ですね。
もしかして、ワードプロセッサとしての awk を重宝しているあまり、Script 言語としての
 awk は実際には触っていないのではないですか?
ファイルを開くとか、文字列を正規表現以外で解析するとか、泥臭くて基本的な部分のこと
です。


引用返信 編集キー/
■21651 / inTopicNo.15)  Re[7]: 設定ファイルから読み込み
□投稿者/ Jitta on the way (130回)-(2008/07/07(Mon) 11:54:07)
http://www.atmarkit.co.jp/fdotnet/dotnettips/039inifile/inifile.html

ケータイから。タイプミスがあれば直して
引用返信 編集キー/
■21656 / inTopicNo.16)  Re[8]: 設定ファイルから読み込み
□投稿者/ kaoru (28回)-(2008/07/07(Mon) 14:05:20)
まずはご報告。とりあえずできました。
Azuleanさんの、whiteで入力文字が行ごとに消えていく、というのがヒントになり、whileをやめ、ついでに設定ファイルを行ごとにわけて一度にひとつのファイルからひとつだけ読む、ということで回避しました。ヒント感謝です。
れいさん。学問に王道なし、そりゃそうで、おっしゃることもすごくよくわかります。ただ、いただいた、もっと問題を細かく分ける、というアドバイス、さらにあれこれいじってみるというので、なんとかなりました。れいさん始めみなさんの基本の話は、聞く気がないということで気を悪くされるかもしれませんが…。すみません。近々長期で出かける予定であり、開発が継続できないので、かなり急いでいる、という事情がありますが、事情はともあれたしかにいま基本を聞く気はない、ということを責められるのでしたら、それはわたしに責任があります。ごめんなさい。
「ま」さん。ありがとうございます。ほんとにありがたい。ちなみにgawkで設定ファイルからメールを作成するスクリプトを書くとしたら、

BEGIN {FS="="}
/To/ {print "to:" $2}
/From/ {print "from:" $2}

などのようになると思います。/ /で条件を書けるので、読み込んだファイルの行を指定しなくてよい、というのがgawkの楽なところです。
また逆に行がわかっていれば、

BEGIN {FS="="}
NR==1 {print "to:" $2} #1行目をあて名にする
NR==2 {print "from:" $2} #2行目を送信元にする

などのように書くこともできます。
一時的に
NR==1 {sendto = $0}
のように、行全体を変数に入れて、あとで扱うこともできます。

ただ、おっしゃるように、gawkではファイルの入出力は非常にかんたんな反面、メールサーバーにログインする機能とかはないので、それでC#にトライしているということです。
さらにこれまたgawkの使い方はご推察のとおり、ワードプロセッサ的な比重はとても高いです。Script言語としての部分をどれほど使っているかは、たぶんご想像とそう離れていないかなと。20%くらい使っている、という状況でしょうか。if、forをようやく使えるくらいです。そういう意味では、今回のwhileも、なんとなく原因は薄ぼんやりとわかっていたのですが、という感じですね。
でも、ロジックさえ書けばよいので楽だなぁということがわかる程度にはわかるし、C#も基本的なロジックは、どの言語を使っても似たり寄ったりで、それならC#でやってみるか、という気になったのでした。
さてこんなことばかり書いている間に、次のことに取りかからないと…。
次は本文のテキストをメールの本文にする、ということで、テキストファイルの読み込みに取りかかります。

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -