こんにちは。
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
プログラミングのどこがいけないのでしょうか?
説明不足かと思いますが、ご回答よろしくおねがいします。
No.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様の書いてくださったコードを該当部に入れれば解決するでしょうか?
よろしくお願いします。
こんにちは。
txtファイルの出力をいじることでどうにか解決できました。
C++についてはこれからしっかり勉強しようと思います。
ご回答ありがとうございました。
No.2
- 回答日時:
C++ というか「C++/CLI」ですね.
「”入力文字列の形式が正しくありません”と出てしまいます」の部分の判定がおかしいのかもしれません.
しかし,
sub_string=string1->Split(' ');//コンマで分割する
とか
sub_string2=string2->Split(' ');//コンマで分割する
って何をしたいんだろう....
この回答への補足
ご回答ありがとうございます。
「”入力文字列の形式が正しくありません”と出てしまいます」の部分の判定がおかしいのかもしれません
というのは具体的にどういう意味でしょうか?
よろしくお願いします。
No.1
- 回答日時:
現在、検証できる環境でないので推測でしかないので、
間違っていたら申し訳ありません。
> 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を決まった桁数で区切る』にはどのように書けばいいのでしょうか?
よろしくお願いします。
txtファイルの出力を変えることで解決できました。
また質問させていただくとおもいますが、どうぞよろしくお願いします。
ご回答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) VBAでエクセルをtxtに変換するとエクセルでカンマを含む文字数字がtxtでは「""」付にならないよ 1 2022/08/27 12:17
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
pthread_cond_waitとptherad_co...
-
フォルダ内にさらにフォルダが...
-
演奏記号の・・・・
-
プロシージャをまたいて変数を...
-
VB6.0の正規表現を使って、文字...
-
他のフォームから別のフォーム...
-
エクセルVBAでテキストボッ...
-
【VB6.0】 あるフォームから他...
-
perlによるxmlファイルの取得
-
タイムアウトする仕組みを作りたい
-
C#のループでtextboxに値を入れ...
-
sublimit textっていうエディタ...
-
三項でたとえば交換って
-
C言語のサフィックスについて
-
VS CodeでTEXファイルにPDF形式...
-
二点の座標から距離や角度を求...
-
【VB.NET】テキストボックスに...
-
VB.NETでのイベントの途中終了
-
VB6のFriendについて
-
verilogのcase文
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA public変数はどのようなこ...
-
演奏記号の・・・・
-
GetNextWindowがDLLファイルUse...
-
VB6.0の正規表現を使って、文字...
-
マクロ 条件式
-
Excel VBA: private sub 内の...
-
VBA 再帰について
-
フォルダ内にさらにフォルダが...
-
プロキシでキャッシュされる/...
-
上付文字と下付文字について(D...
-
分割コンパイルの方法がわかり...
-
プロシージャをまたいて変数を...
-
ファイルパスの変換方法
-
slapd再起動時にエラー
-
sub-paragraphとsub-sub-paragraph
-
pthread_cond_waitとptherad_co...
-
三項でたとえば交換って
-
C#のループでtextboxに値を入れ...
-
VBAでcallで呼び出したsubを終...
-
他のフォームから別のフォーム...
おすすめ情報