2017-04-11 15 views
0

ファイルから読み込むことで値を配列に格納しようとしています。私はファイルの部分からの読み込みがありますが、配列の中に格納することはできません。なぜなら、ループの後で、変数の値がnullになり、配列がnullにならないため、「値はnullにはできません。ここに私が持っているものがあります。そして、forループが正しい場所にない可能性があるので、どこに置くのが助けになるか分かりません。c#配列のファイルから値を格納する方法

Program p = new Program(); 

     int MAX = 50; 

     int[] grades = new int[MAX]; 

     string environment = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal) + "\\"; 

     string path = environment + "grades.txt"; 

    StreamReader myFile = new StreamReader(path); 

     string input; 

     int count = 0; 

     do 
     { 
      input = myFile.ReadLine(); 
      if (input != null) 
      { 
       WriteLine(input); 
       count++; 
      } 
     } while (input != null); 

     for (int i = 0; i < count; i++) 
     { 
      grades[i] = int.Parse(input); 
     } 
+0

とは何ですか? – pm100

+0

gradesはgrades.txtファイルの値を格納する配列です –

+0

whileループを終了した直後にforループを開始します。そして、whileループから抜け出す条件は、入力がnullの場合に真です。 – Steve

答えて

1

forループをwhileループから抜けた直後に開始します。入力がnullの場合、whileループを終了する条件は真です。もちろん、これはInt.Parseではうまく受け入れられません。
代わりにあなたがあなたの入力を処理するため、より柔軟な方法を持つことができますしかし、あなたはそうしないと、配列の次元

int count = 0; 
while((input = myFile.ReadLine()) != null && count < 50) 
{ 
    WriteLine(input); 
    grades[count] = int.Parse(input); 
    count++; 
} 

を超えるループに50回以上を望んでいないことを考慮しながら、単一のループを使用することができます整数の配列の代わりにList<int>を使用するとします。このように、あなたは間違いなくあなたのストリームオブジェクトの周囲に「使用」のパターンを使用する必要があります

List<int> grades = new List<int>(); 
while((input = myFile.ReadLine()) != null) 
    grades.Add(int.Parse(input)); 
+0

ありがとう、ありがたいです。 –

0
Program p = new Program(); 
int MAX = 50; 
int[] grades = new int[MAX]; 
string environment = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal) + "\\"; 
string path = environment + "grades.txt"; 
using (StreamReader myFile = new StreamReader(path)) 
{ 
    string input; 
    int count = 0; 
    while((!myFile.EndOfStream) && (count < MAX)) 
    { 
     input = myFile.ReadLine(); 
     if (!String.IsNullOrWhiteSpace(input)) 
     { 
      WriteLine(input); 
      grades[count] = int.Parse(input); 
      count++; 
     } 
    } 
} 

あなたのファイルでは、本行の数を確認する必要はありません。主にコードとスタイルを維持しながら、for-loopを取り除きました。問題は、次の行に移動する前に入力値を使用していなかったことです。あなたは元のコードの最後の価値しか持っていませんでした。

+0

IMHO - あまりにも複雑で、Steveのソリューションははるかに簡単です。 – pm100

1

私たちは本当に

var grades = File.ReadAllLines(path).Select(l=>Int.Parse(l)).ToArray(); 
+0

'... Select(Int.Parse)'は6文字短いですplus ... 'ReadLines(...)'は別の3を保存します。 –

+0

@AlexeiLevenkov :-)。私はいつもラムダが単純な関数呼び出しであれば、argsを指定する必要はありません – pm100

0

を凝縮取得したい場合はパスを連結するにはあなたを助けるためにPath.Combine()を活用します。

enter image description here

string environment = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); 
    String fullPath = Path.Combine(environment, "grades.txt"); 

    int[] grades = File.ReadAllLines(fullPath).Select(p => int.Parse(p)).ToArray<int>(); 
    Console.WriteLine(grades); 
は非常に便利な File.ReadAllLines()の使用方法について https://www.dotnetperls.com/file-readalllinesを参照してください。

私はここでLINQを使用しています。これは時には単純化しています。今は少し威圧しているように見えますが。すべての行を読み込み、その結果を解析して各行を選択し、整数に変換して整数の配列を出力し、それをgradesに保存します。

関連する問題