質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

5131閲覧

Unityでtxtファイルを読み込んで配列に格納したい

ryosan0201

総合スコア3

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2020/09/15 07:25

Unityでtxtファイルに保存した数字の羅列を読み込みたい

Unityのスクリプトをc#で書いています。c#を使うのは今回が初めてです。
あらかじめ保存してあるtxtファイルの中の数字を読んで配列に格納する関数を作っています。
ReadLine を使ってtxtファイルの中身を読んできた後、float型に変換してから配列に格納したいと思いfloat.Parseを使っています。

発生している問題・エラーメッセージ

"Index was outside the bounds of the array"と出ます。
配列まわりで怒られているのはわかるのですが具体的になにが悪いのかわかりません。
エラーメッセージ内のcs:226は後述のソースコードのfloat.Parseの行を指しています。

IndexOutOfRangeException: Index was outside the bounds of the array. AGXUnity_Excavator.Scripts.ExcavatorInputController.ReadFile () (at Assets/AGXUnity_Excavator/AGXUnity_Excavator_Assets/Scripts/ExcavatorInputController.cs:226

該当のソースコード

c#

1public string boomin ; 2public float[] boominput = new float[150]; 3 4void ReadFile() 5 { 6 using (TextReader tr1 = File.OpenText("../TextData.txt")) 7 { 8 for(int i = 0;i<150;i++) 9 { 10 boomin = tr1.ReadLine(); 11 Debug.Log(boomin); 12 boominput[i] = float.Parse(boomin); 13 } 14 } 15 }

###該当のtxtファイル
0
0
0
0
0
0
0
0
0
0.3
0.3
のような形で1500行ほど続きます
今回のソースコードでは試しに上150個の数字を読んでみています

実行結果

for文の一回目の処理でエラー文を吐いて止まります。
Debug.logの出力はtxtファイルの一行目通りにしっかり0がログに出ますが、その次のfloat.Parseの処理ができないようでエラーがでます。

試したこと

float.Parseの行をコメントアウトすると150行分の数字がしっかりデバックログに表示されるのでreadlineは機能していると思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

このエラーだと配列の数が足りてないとかそのへんかなーと思います。

まずboominputの配列はちゃんと数が確保できてますか?
publicで宣言しているのでインスペクター側から数値を変えたりとかしてるとそっちが使われちゃいます。念の為、ちゃんと宣言されているか確認してみてください。あとは読み込む前に再初期化しても良いです。

cs

1public string boomin ; 2public float[] boominput = new float[150]; 3 4void ReadFile() 5 { 6 Debug.Log("配列の数: " + boominput.Length); // デフォルトの配列数 7 boominput = new float[150]; // 配列の初期化し直し 8 9 using (TextReader tr1 = File.OpenText("../TextData.txt")) 10 { 11 for(int i = 0;i<150;i++) 12 { 13 boomin = tr1.ReadLine(); 14 Debug.Log(boomin); 15 boominput[i] = float.Parse(boomin); 16 } 17 } 18 }

#追記
長さが決まってないなら、配列じゃなくてListを使うほうが楽だと思います。
ReadLineがnullってことは行末のはず=それまで読み込めばファイルの全行を読み込む という考えからwhile文で回します

cs

1using System.Collections; 2using System.Collections.Generic; 3using System.IO; 4using UnityEngine; 5 6public class Test : MonoBehaviour { 7 8 public string boomin; 9 public List<float> inputDataList = new List<float>(); 10 11 private void Start() { 12 ReadFile(); 13 } 14 15 void ReadFile() { 16 using (TextReader tr1 = File.OpenText("../TextData.txt")) { 17 while((boomin = tr1.ReadLine()) != null) { 18 inputDataList.Add(float.Parse(boomin)); 19 } 20 } 21 } 22}

投稿2020/09/15 07:58

編集2020/09/17 02:53
hogefugapiyo

総合スコア3302

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryosan0201

2020/09/17 02:27

配列の初期化をしたら問題なく動きました!ありがとうございます ただ、特にほかの関数やupdate処理の中でこの配列に書き込んだりもしていないので、なぜエラー吐いてたのかはよくわかりませんでした,,, 後々には配列の個数を150などの固定値ではなく読む先のファイルの長さによって変えたいのですが難しいのでしょうか,,,?
ryosan0201

2020/09/17 03:18

ありがとうございます! リスト使っても問題なく動きました!
guest

0

boominput[i]iが配列の範囲を越えているようですがコードからおかしそうな箇所がありません。
記載していない箇所でboominputを上書きしていませんか?

以下のようにログ出力と配列の長さでループするとどうなりますか?

cs

1Debug.Log($"boominput.Length: {boominput.Length}"); 2for(int i = 0;i<boominput.Length;i++)

また、TextReader.ReadLine()は最後まで読み込むとnullを返すのでbreakで抜けてしまった方がよいです。

投稿2020/09/15 08:09

shiena

総合スコア1827

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryosan0201

2020/09/17 02:20

boominput.lengthが0と出てしまいました 他の回答者様から教えていただいた通りReadFile関数に入ってから配列を宣言しなおすと問題なく動きました! breakを使ったほうが良いとおっしゃっていましたがfor文の最後にbreakをつけるという認識で合ってますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問