アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。
C++でのtxtファイル読み込みについて質問させていただきます。
下記のようなコードを使ってtxtファイルを読み込もうとしています。

private: System::Void toolStripButton2_Click(System::Object^ sender, System::EventArgs^ e) {

array<int>^ x=gcnew array<int>(103*300);
array<int>^ y=gcnew array<int>(103*300);
int num=int::Parse(numericUpDown4->Text);
String^ fileName="outputx"+ num.ToString() +".txt";
String^ string1;
StreamReader^ sreader1;
StreamReader^ din = File::OpenText(fileName);
array<String^>^ sub_string;
//指定したファイル名でStreamReaderを設定する
try{
sreader1=gcnew StreamReader(fileName);
}catch(Exception^ ex){
MessageBox::Show("!");
return;
}
//x[i]の読み込み
String^ str;
int count = 0;
while ((str = din->ReadLine()) != nullptr)
{
string1=sreader1->ReadLine();//StreamReaderに1行読み込む
sub_string=string1->Split(' ');//コンマで分割する
x[count]=Convert::ToInt32(sub_string[1]);
y[count]=Convert::ToInt32(sub_string[2]);
count++;
}
Bitmap^ bmap_dst=gcnew Bitmap(104,301);
for(int j=0;j<301;j++)
for(int i=0;i<104;i++){
bmap_dst->SetPixel(i,j,Color::FromArgb(255,255,255));}
for(int k=0;k<count;k++){
bmap_dst->SetPixel(x[k],y[k],Color::FromArgb(0,0,0));}
pictureBox1->Image = bmap_dst;
pictureBox2->Image = bmap_dst;

//y座標
fileName="outputy"+ num.ToString() +".txt";
String^ string2;
StreamReader^ sreader2;
din = File::OpenText(fileName);
array<String^>^ sub_string2;
//指定したファイル名でStreamReaderを設定する
try{
sreader2=gcnew StreamReader(fileName);
}catch(Exception^ ex){
MessageBox::Show("!");
return;
}
//x[i]の読み込み
String^ str2;
count = 0;
while ((str2 = din->ReadLine()) != nullptr)
{
string2=sreader2->ReadLine();//StreamReaderに1行読み込む
sub_string2=string2->Split(' ');//コンマで分割する
x[count]=Convert::ToInt32(sub_string2[1]);
y[count]=Convert::ToInt32(sub_string2[2]);
count++;
}
Bitmap^ bmap_dst2=gcnew Bitmap(104,301);
for(int j=0;j<301;j++)
for(int i=0;i<104;i++){
bmap_dst2->SetPixel(i,j,Color::FromArgb(255,255,255));}
for(int k=0;k<count;k++){
bmap_dst2->SetPixel(x[k],y[k],Color::FromArgb(0,0,0));}
pictureBox3->Image = bmap_dst2;
pictureBox4->Image = bmap_dst2;



}

また、読み込むtxtファイルは下記のようなものです。(長いので途中部分のみ)

     1    287
     1    288
     2    107
     2    108
     2    109
     2    110

これをビルドすると”入力文字列の形式が正しくありません”と出てしまいます。
また、下記のようなtxtファイルだと問題なく読み込むことができます。

9 164
9 165
9 166
10 151
10 152
10 153
10 154

プログラミングのどこがいけないのでしょうか?
説明不足かと思いますが、ご回答よろしくおねがいします。

A 回答 (3件)

まず読み込むtxtファイルの内容がよくわからないのですが


前半に記述されているtxtファイルの
行の先頭部分と数字と数字の間は、半角スペースでしょうか?
string2->Split(' ');
は、セパレータとして半角スペースしか
指定していませんから、もし行の先頭部分と数字と数字の間が
TABとかになっていたら、sub_string2 は期待している
数値文字列の配列になりません。

また行の先頭部分と数字と数字の間が複数の半角スペースの場合
Splitは、複数のEmpty要素を返すので、
第2パラメータとして、StringSplitOptions::RemoveEmptyEntriesが
必要です。
Splitの仕様をよく確認してください。

サンプルコードは以下のとおり。


//x[i]の読み込み
String^ delimStr = " \t";
array<Char>^ delimiter = delimStr->ToCharArray( );

String^ str;
int count = 0;
while ((str = din->ReadLine()) != nullptr)
{
string1=sreader1->ReadLine();//StreamReaderに1行読み込む
//sub_string=string1->Split(' ');//コンマで分割する
//x[count]=Convert::ToInt32(sub_string[1]);
//y[count]=Convert::ToInt32(sub_string[2]);

sub_string=string1->Split(delimiter,StringSplitOptions::RemoveEmptyEntries);
x[count]=Convert::ToInt32(sub_string[0]);
y[count]=Convert::ToInt32(sub_string[1]);
count++;
}

この回答への補足

ご返答ありがとうございます。
fortranでtxtファイルを書き出しているのですが、行の先頭部分、数字と数字の間ともに半角スペースになっているようです。
ちなみに、これがfortranのコードです。(一部のみ抜き出し)

open(20, file ='outputy1.txt')
do ay1 = 1, m
do ay2 = 1, l
if (sum2(ay1, 2, ay2) == 1) then
write(20,*) ay1, ay2
endif
enddo
enddo
close(20)

ちなみにm=103,l=300です。
C++について勉強を始めたばかりでほぼ何もわかっていないのですが、hideishi様の書いてくださったコードを該当部に入れれば解決するでしょうか?

よろしくお願いします。

補足日時:2012/06/01 21:43
    • good
    • 0
この回答へのお礼

こんにちは。
txtファイルの出力をいじることでどうにか解決できました。
C++についてはこれからしっかり勉強しようと思います。
ご回答ありがとうございました。

お礼日時:2012/06/04 17:45

C++ というか「C++/CLI」ですね.



「”入力文字列の形式が正しくありません”と出てしまいます」の部分の判定がおかしいのかもしれません.

しかし,
sub_string=string1->Split(' ');//コンマで分割する
とか
sub_string2=string2->Split(' ');//コンマで分割する
って何をしたいんだろう....

この回答への補足

ご回答ありがとうございます。

「”入力文字列の形式が正しくありません”と出てしまいます」の部分の判定がおかしいのかもしれません

というのは具体的にどういう意味でしょうか?

よろしくお願いします。

補足日時:2012/06/01 21:45
    • good
    • 0
この回答へのお礼

どうにか解決することができました。
ご回答ありがとうございました。

お礼日時:2012/06/04 17:46

現在、検証できる環境でないので推測でしかないので、


間違っていたら申し訳ありません。

> sub_string=string1->Split(' ');//コンマで分割する
> x[count]=Convert::ToInt32(sub_string[1]);
> y[count]=Convert::ToInt32(sub_string[2]);

読み込むtxtファイルにスペースがたくさん入っているので
意図したようにSplitできていないのでしょう。
sub_string[1]には数値じゃない何かが入っていると思われます。


どうしても
     1    287
     1    288
     2    107
     2    108
     2    109
     2    110
と桁ぞろえされたファイルでなければならないのなら、
Splitを使うのではなく、sub_stringを決まった桁数で
区切るようにしましょう。

この回答への補足

ご回答ありがとうございます。

C++について勉強不足で申し訳ないのですが、『sub_stringを決まった桁数で区切る』にはどのように書けばいいのでしょうか?

よろしくお願いします。

補足日時:2012/06/01 21:47
    • good
    • 0
この回答へのお礼

txtファイルの出力を変えることで解決できました。
また質問させていただくとおもいますが、どうぞよろしくお願いします。
ご回答ありがとうございました。

お礼日時:2012/06/04 17:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!