程序不会读取文件中的所有数据

时间:2014-10-13 06:09:58

标签: java file class loops if-statement

因此,我的程序的要点是它将从文件中读取一些命令,然后根据命令执行某些操作。我的问题是我的代码没有读取txt文档的所有行。具体来说,它通过先前在if语句中输入print语句来读取我测试的前四行,该语句测试输入是否为“P”。任何帮助将不胜感激。

以下是txt文档

P e1 10 5

P e2 19 5

P e3 11 5

P e4 18 5

R mouth 10 10 10 2

S nose 14 7 2

P p3 9 9

P p4 20 9

D

Y bad command

M p3 9 12

M p4 20 12

D



public static void main(String[] args) {

          String filename = args[0];
          File file = new File(filename);

          Scanner input=null;

          try {

               input=new Scanner(file);  

          }
          catch(java.io.FileNotFoundException ex) {
               System.out.println("ERROR: Couldn't open file: " + file);
               System.exit(1);
          }

          AsciiDisplay asciiDisplay= new AsciiDisplay();

          while(input.hasNext()) {

              if(input.next().equals("P")) {

                    String id=input.next();
                    int x=input.nextInt();
                    int y=input.nextInt();
                    Coordinate coordinate=new Coordinate(x,y);
                    Point point=new Point(id,coordinate);
                    asciiDisplay.addShape(point);

               }

              else if(input.next().equals("R")) {
                    String id=input.next();
                    int x=input.nextInt();
                    int y=input.nextInt();
                    int length=input.nextInt();
                    int height=input.nextInt();
                    Coordinate coordinate= new Coordinate(x,y);
                    Rectangle rectangle= new Rectangle(id,coordinate,length,height);
                    asciiDisplay.addShape(rectangle);

               }

               else if(input.next().equals("S")) {

                    String id=input.next();
                    int x=input.nextInt();
                    int y=input.nextInt();
                    int size=input.nextInt();
                    Coordinate coordinate= new Coordinate(x,y); 
                    Square square = new Square(id,coordinate,size);
                    asciiDisplay.addShape(square);

               }

               else if(input.next().equals("M")) {

                    String id=input.next();
                    int x=input.nextInt();
                    int y=input.nextInt();
                    Coordinate coordinate= new Coordinate(x,y);
                    asciiDisplay.moveShape(id,coordinate);

               }

               else if(input.next().equals("E")) {

                    asciiDisplay.deleteAll();

               }

               else if(input.next().equals("D")) {
                    asciiDisplay.updateGrid();
                    asciiDisplay.printGrid();

               }
               else if(input.next().equals("X")) {
                  System.out.println("Invalid command: X");


               }


          }
     }
}

2 个答案:

答案 0 :(得分:2)

您的问题是,您在input.next()语句中反复拨打if,这会不断提取更多令牌。相反,您需要调用一次并将值赋给变量,然后检查该变量:

String nextCommand = input.next();

或者,您可以使用开关:

switch(input.next()) {
case "P":
    // do stuff
    break;
case "R":
    // do other stuff
    break;
}

答案 1 :(得分:1)

您经常在这里经常致电input.next()

if (input.next().equals("P")) {
    ...
}
else if(input.next().equals("R")) {
    ...
}
else if(input.next().equals("S")) {
    ...
}
...

当它检查S时,它会读取三个令牌。你需要这样的东西:

String token = input.next();
if (token.equals("P")) {
    ...
} else if (token.equals("R")) {
    ...
} else if (token.equals("S")) {
    ...
} ...

这样,您只需读取一次令牌,然后找到正确的代码来处理它。

请注意,从Java 7开始,您也可以使用switch语句执行此操作:

switch (input.next()) {
    case "P": {
        ...
        break;
    }
    case "R": {
        ...
        break;
    }
    case "S": {
        ...
        break;
    }
}

(你不 在这里有牙套,但鉴于你的块 这是非常重要的,这样做是为了引入一个 每个块的新范围。您可能需要考虑拆分代码 分别采用单独的方法......)