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

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

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

Re[8]: 文字の改行


(過去ログ 24 を表示中)

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

■10994 / inTopicNo.1)  文字の改行
  
□投稿者/ Alen (1回)-(2007/12/04(Tue) 00:00:06)
Alen さんの Web サイト

分類:[C#] 

開発環境:Microsoft Visual Studio 2005
使用言語:C#,Htmlなど
OS:WindowsXP SP2

本体はWebサイトのリンクからファイルをダウンロードできます。(sample)です。
Htmlの方の「内容部分」を2行打ち「送信」を押すと「インデックスが配列の境界外です。」とでます。
これを回避するにはどうすればいいのか教えてください。ご助言お待ちしております。

ソースファイル(一様)
*csファイル

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Text;

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//追加書き込み
StreamWriter sw = new StreamWriter("bbs.txt",true,Encoding.Default);

// 名前と内容が空白なら書き込まない
if (Request.Params["username"] != null && Request.Params["naiyou"] != null)
{
//ファイルに書き込み
sw.WriteLine(Request.Params["username"] + "," + Request.Params["naiyou"]);
}
sw.Close();

//ファイルの読み込み処理
FileStream fs = new FileStream("bbs.txt", FileMode.OpenOrCreate, FileAccess.Read);
StreamReader sr = new StreamReader(fs, Encoding.Default);

string Len;
string[] Leng;

//読み込む処理
while ((Len = sr.ReadLine()) != null)
{
//分割
Leng = Len.Split(',');

//名前
form1.InnerHtml += "名前:" + Leng[0]+"<BR>";
//内容
form1.InnerHtml += "内容:" + Leng[1]+"<BR>";
}


fs.Close();
sr.Close();

}
}
引用返信 編集キー/
■10998 / inTopicNo.2)  Re[1]: 文字の改行
□投稿者/ mあ@反省中 (27回)-(2007/12/04(Tue) 00:49:46)
No10994 (Alen さん) に返信
>         string Len;
>         string[] Leng;
> 
>         //読み込む処理
>         while ((Len = sr.ReadLine()) != null)
>         {
>             //分割
>             Leng = Len.Split(',');
> 
>             //名前
>             form1.InnerHtml += "名前:" + Leng[0]+"<BR>";
>             //内容
>             form1.InnerHtml += "内容:" + Leng[1]+"<BR>"; //ここにブレークポイント置く
>         }
> 
> 

Len がファイルの1行で、Leng が "," 分割した後の配列ってことですよね。
Len ってのは、Length の頭3文字で、文字通り長さとかに使う機会が多いです。int だったり、long の整数型で定義することが多いです。

個人的に名前が良くないと思います。

接尾辞に "s" を付けて配列名としたり、接頭辞に "s" や "str" を付けて文字列であることを示したり
命名方法は色々ありますが。


引用返信 編集キー/
■11020 / inTopicNo.3)  Re[2]: 文字の改行
□投稿者/ Alen (2回)-(2007/12/04(Tue) 22:19:07)
No10998 (mあ@反省中 さん) に返信
> ■No10994 (Alen さん) に返信
>
回避はできたのですが、肝心の内容を2行表示できませんでした。
できれば2行表示させる方法をお願いします。
補足不足で申し訳ないです。

・変更箇所
Lenをstrsへ
Lengをstrsへ
引用返信 編集キー/
■11022 / inTopicNo.4)  Re[3]: 文字の改行
□投稿者/ mあ@反省中 (29回)-(2007/12/05(Wed) 01:41:32)
No11020 (Alen さん) に返信
> ■No10998 (mあ@反省中 さん) に返信
>>■No10994 (Alen さん) に返信
> >
> 回避はできたのですが、肝心の内容を2行表示できませんでした。
> できれば2行表示させる方法をお願いします。
> 補足不足で申し訳ないです。

http://msdn2.microsoft.com/ja-jp/library/f5f5x7kt(VS.80).aspx

bbs.txt に追加書き込みする前に1行分あるかどうか確認してみましたか?

おそらく以下のようなファイル内容になっているのですよね?

ファイル中身:
きも,今日は雨が降っている。
いも,今日も雨が降っている。


提示されたソースだと、上記のファイル内容ならば
名前:きも<br>
内容:今日は雨が降っている。<br>
名前:いも<br>
内容:今日も雨が降っている。<br>

ってなるはずですよね?


引用返信 編集キー/
■11044 / inTopicNo.5)  Re[4]: 文字の改行
□投稿者/ Alen (3回)-(2007/12/05(Wed) 21:50:27)
Alen さんの Web サイト
No11022 (mあ@反省中 さん) に返信
> ■No11020 (Alen さん) に返信
>>■No10998 (mあ@反省中 さん) に返信
> 
> bbs.txt に追加書き込みする前に1行分あるかどうか確認してみましたか?

 while((str=sr.ReadLine()) == null){
        sr.ReadLine();  //1行読み込む      ←このことですか?
        strs = str.split(',');
        form1.InnerHtml += "名前:" + strs[0]+"<BR>";
        form1.InnerHtml += "内容:" + strs[1]+"<BR>";

> おそらく以下のようなファイル内容になっているのですよね?
> 
> ファイル中身:
> きも,今日は雨が降っている。
> いも,今日も雨が降っている。
> 
> 
> 提示されたソースだと、上記のファイル内容ならば
> 名前:きも<br>
> 内容:今日は雨が降っている。<br>
> 名前:いも<br>
> 内容:今日も雨が降っている。<br>
> 
> ってなるはずですよね?

2行続けて打たなければなります。

実行結果がこうなってくれればいいのですがいいのですがまったく浮かないです。
できればソースコードを入れていただきたいです。
すいません。


実行結果

名前:アメジスト
内容:こんにちは。
私の名前はアメジストです。

(2行表示です。)


引用返信 編集キー/
■11047 / inTopicNo.6)  Re[5]: 文字の改行
□投稿者/ カンタービレ (116回)-(2007/12/05(Wed) 22:19:54)
>  while((str=sr.ReadLine()) == null){
> sr.ReadLine(); //1行読み込む ←このことですか?
> strs = str.split(',');
> form1.InnerHtml += "名前:" + strs[0]+"<BR>";
> form1.InnerHtml += "内容:" + strs[1]+"<BR>";
>

> 実行結果がこうなってくれればいいのですがいいのですがまったく浮かないです。
> できればソースコードを入れていただきたいです。 すいません。
>
> 実行結果
>
> 名前:アメジスト
> 内容:こんにちは。
> 私の名前はアメジストです。


おそらく改行ある時に書き込んだら以下のようなファイル内容になっているのデスよね。
ファイル中身:
アメジスト,こんにちは。(改行コード)
私の名前はアメジストです。

あ、2行目でカンマがないデスね。。どうしましょ。。
ReadLineで1行単位に読んでて2行目でもカンマで分割して、
配列の2番目を参照して当然Indexの範囲外になりマスね。

対策としては、
@ 書き込む方で何とか改行を別の記号等に置き換えて1行にして扱い、読んだ際に元に戻す。
  (問題はその別の置き換えた記号が元々の内容に含まれてたら・・・)
A 読み込む側で、カンマの数を数えて奇数は名前、偶数は内容として扱う。
  (問題は内容がなかったら・・・)

その他問題としては、上のケースだと「,」を区切りに使ってマスが、
内容、名前にカンマを入れたらどうなっちゃうのでしょう??

何かしらの制限は出てくると思いますが、書き込み時は改行や区切り文字等制約文字のチェック、
読み込み時は1回答が複数行になる前提ならその前提のロジックを、1行に抑えたなら
書き込み字に変換しただろう文字の復元などを考えれば、答えが出てくると思いマス。

コード入れなくてゴメンナサイ。
引用返信 編集キー/
■11052 / inTopicNo.7)  Re[6]: 文字の改行
□投稿者/ mあ@反省中 (30回)-(2007/12/06(Thu) 01:08:35)

入力中のやつが全部消えた・・・

CSVファイルフォーマット上不適切な文字コードは全て置換する。
CSVで禁止ワードは、"," と "\n" です。

エンコード:接頭辞を "%" としたとき、
(1)文字列中の "%" を "%%" に置換する。
(2)文字列中の "\n" を "%R" に置換する。
(3)文字列中の "," を "%C" に置換する。

デコード:
上記の逆の順序で。

名前:%きも%
内容:きもは、
とても、
きもい,けど・・・。


上記入力をエンコードルールに則り置換すると、
名前:%%きも%%
内容:きもは、%Rとても、%Rきもい%Cけど・・・。%R

となる。
これを、bbs.txt に書き込むと、

bbs.txt の内容は、
%%きも%%,きもは、%Rとても、%Rきもい%Cけど・・・。%R

となる。

あとは分かるでしょ?




引用返信 編集キー/
■11056 / inTopicNo.8)  Re[7]: 文字の改行
□投稿者/ mあ@反省中 (31回)-(2007/12/06(Thu) 01:27:52)
あ、忘れてた。
内容中の HTML タグは禁止するのであれば、"<" と ">" と "&" と "\" もエスケープした方がいいよ。


スクリプトだったか、DOMツリー操作のクラスで、encodeURI()/decodeURI() ってのがあるから、これ使うと楽かもしれない。
文中のHTMLリクエストでエスケープする必要がある文字コードはすべて %xx に置換してくれます。

System.Web だったかなぁ・・・クラスパスは忘れました・・・ごめんなさい。







引用返信 編集キー/
■11099 / inTopicNo.9)  Re[8]: 文字の改行
□投稿者/ Alen (4回)-(2007/12/06(Thu) 22:46:42)
Alen さんの Web サイト
よーく考えた結果、
書き込み時に\nを<BR>に変えるコードを入力すれば行く事が分かりました!
ありがとうございます。

sw.WriteLine(Request.Param["name"] + "," + Request.Param["naiyou"].Replace(System.Environment.NewLine,"<br>");

このコードで解決しました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -