0

ファイルを 2 次元配列に読み込もうとしています。私がそれを読んだとき、最初のセクションで、値は正しいです。書き出すと、値はすべて「10」の値になります。どうすればこれを修正できますか?

public static void readagain() {

     try {
            InputStream is = new FileInputStream("C:\\test.new");
            int m = 16;
            int n = 16;
            int[][] a = new int[m][n];
            int value=0; 

            while ((value = is.read()) != -1) { 
                for (int i = 0; i < m; i++) {
                    for (int j = 0; j < n; j++) {
                       try{
                        a[i][j] = value;
                           System.out.println("number is "+ a[i][j]);
                        }
                       catch (Exception e) {
                            e.printStackTrace();
                        }
                    }//j
                } //i         
            } 

            for (int i = 0; i < m; i++) {
                    for (int j = 0; j < n; j++) {
                        System.out.println("number is "+a[i][j]);
                    }
                }
        } 
      catch (Exception e) {
            e.printStackTrace();
        }
}
4

4 に答える 4

3

最初のループは、配列全体に最後の値が何であれ、すべて同じになるように見えます。

起こっているように見えるのは、値を次々と取得し、毎回配列内のすべての値を上書きすることです。

1つのループだけを使用して、たとえば何ijすべきかを計算することをお勧めします。

for( int x=0-; (value = is.read()) != -1) && x < m*n; x++) { 

   int i = x/n;
   int j = x%n;
   try{
    a[i][j] = value;
       System.out.println("number is "+ a[i][j]);
    }
   catch (Exception e) {
        e.printStackTrace();
    }     
} 
于 2013-03-12T17:41:46.630 に答える
0

あなたのループは間違っています。最後に読み取られた値は、アレイ全体に再度設定されています。forループ内の値の読み取りは機能します。

for (int i = 0; i < m; i++) {
   for (int j = 0; j < n; j++) {
      try{
        int value = is.read();
        if (value == -1) break;
         a[i][j] = value;
         System.out.println("number is "+ a[i][j]);
        }
        catch (Exception e) {
          e.printStackTrace();
        }
    }//j
 } //i
于 2013-03-12T17:45:56.450 に答える
0

エラーは、操作を実行しているシーケンスに関係しています。コードフローをレイアウトする場合の手順は次のとおりです。

  1. 入力ストリームから次の値を読み取ります。
  2. 2次元配列のすべての位置を反復処理します
  3. 繰り返しながら、読み取った値を現在の配列位置に書き込みます

ここでの問題は、1つの値を読み取ってから、その値を配列内のすべてのインデックスに書き込むことです。したがって、完了すると、配列にはすべてのインデックスで読み取られた最後の値が含まれます。

于 2013-03-12T17:43:45.600 に答える
0

is.read は、バイト値 0-255 を返します。これを char に変換し、改行かどうかを確認する必要があります。改行の場合は、現在の行を増やします。

int row = 0;
int col=0;
while ((value = is.read()) != -1) { 
    if(((char) value) == '\n'){
        row++;
        col=0;
    }
    a[row][col++] = value;

} 
于 2013-03-12T17:52:21.857 に答える