意外输出使用从文本文件中读取的字符填充数组

时间:2013-01-31 03:09:40

标签: java arrays file io

我正在尝试在表示地图的字符数组中读取名为input.的文本文件。该文件包含两个整数N和numLifes,以及相应的矩阵。 N表示方阵(NxN)的维数。

我希望如果N小于10,则赋值变量N,值为10并用'#'填充矩阵'mVill',然后读取映射文件并将其与填充的矩阵集成'#'。下面是代码:

import java.io.*;
import java.io.FileReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class hola {

    public static void main(String[] args) {
        char mVill[][] = null;
        int N, i,j, numLifes;
        String line=null;
        StringTokenizer tk;
        char caract;
        FileInputStream fstream = null;
        try {
            fstream = new FileInputStream("C:/input.in");
        } catch (FileNotFoundException e) {
            System.exit(-1);
        }

        DataInputStream in = new DataInputStream(fstream);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));

        try {
            if ((line = br.readLine()) == null) {
                System.out.print("Error empty file...");
                System.exit(0);
            }
        } catch (IOException e) {
        }

        tk = new StringTokenizer(line);
                N = Integer.parseInt(tk.nextToken());
                numLifes = Integer.parseInt(tk.nextToken());

                int nAux=N;
                if (N<10){
                    N=10;
                    mVill = new char[N][N];
                    for (char[] row: mVill)
                        Arrays.fill(row, '#');
                    for (i=0; i <nAux; i++) {
                        for (j=0;j<nAux;j++){
                            try{
                            caract = (char) br.read();
                            mVill[i][j]=caract;
                            }catch (Exception e){
                               System.out.println("Error in read file");
                            }
                        }
                    }

                }else{
                    mVill = new char[N][N];
                    for (i = 0; i < N; i++) {
                        try {
                            mVill[i] = br.readLine().toCharArray();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                        }
                    }
                }
                System.out.println(N+" "+numLifes);

                for (i = 0; i < N; i++) {
                    for (j = 0; j < N; j++) {
                        System.out.print(mVill[i][j]);
                    }
                    System.out.println();
                }
    }//end main
}//end class

对于此输入:

7 3
F..*..F
.##.##.
.#...#.
*..P..*
.#...#.
.##.##.
F..*..F

输出是(这是错误的):

F..*..F###

.##.####
#.
.#.###
..#.
*###
..P..*
###

.#...####
.
.##.###
##########
##########
##########

我应该期望得到它的输出:

F..*..F###
.##.##.###
.#...#.###
*..P..*###
.#...#.###
.##.##.###
F..*..F###
##########
##########
##########

我做错了什么?我在阅读文件时没有看到任何错误。

2 个答案:

答案 0 :(得分:1)

按照史蒂夫的回答,纠正它的快速而肮脏的方法是在你阅读你的角色时这样做:

caract = (char) br.read();
while (caract == '\n' || caract == '\r') {
    caract = (char) br.read();
}
mVill[i][j]=caract;

因此将跳过换行符和回车符。

答案 1 :(得分:0)

我认为您在阅读输入时并未考虑回车符/换行符。我可能会使用一种不同的技术,你一次只读一行而不是一个字符。

尝试测试角色以查看它是否为cr / lf并跳过它,如果是这样。