2012-04-19 45 views
2

我试图读取带有缓冲读取器的文件,但它有时会跳过第一个字符。 下面是该文件,我读: http://files.moonmana.com/forums/Rectangle.hJava缓冲读取器有时会在读取行时跳过第一个字符

这里是结果,我越来越:

LINE: #ifndef RECTANGLE_H 
LINE: include "Shape.h" 
LINE: lass Rectangle : public Shape { 
LINE: rivate: 
LINE: double _width; 
LINE: std::vector<b2Vec2*>* _vertices; 
LINE: ublic: 
LINE: Rectangle(std::vector<b2Vec2*>* vertices) { _vertices = vertices;}; 
LINE: void createVertices(); 
LINE: bool isMimePoint(b2Vec2); 
LINE: double getWidth(){return _width;}; 
LINE: void setWidth(double width); 
LINE: void setHeights(double heights); 
LINE: ShapeType getType(); 
LINE: void moveOn(b2Vec2 ,b2Vec2*); 
LINE: virtual b2Vec2* getCenter(); 
LINE: ; 
LINE: endif 

这里是我的源代码:

String path = file.getPath(); 
BufferedReader _br; 
    try { 
     _br = new BufferedReader(new FileReader(path)); 

     do { 
      System.out.println("LINE: " + _br.readLine()); 
      lines.add(_br.readLine()); 
     } while (_br.read() != -1); 

     _br.close(); 
    } catch (Exception e) { 
     System.out.println("Error reading file: " + e.getMessage()); 
    } 
+0

是的,但要看看其他行“lass”而不是“class”等。 – 2012-04-19 12:15:03

回答

7

您是印刷每隔一行,每隔一行保存一行,并跳过每一行的开头。你在三个地方读取数据并以不同的方式使用它。一旦你有_br.read()一个字符,它将不会再读取它,因此它不会出现在行中。

一个更好的办法是使用

String line; 
while((line = _br.readLine()) != null) { 
    System.out.println(line); 
    lines.add(line); 
} 

正如你可以看到它在一个地方读取和值的持续使用。

+0

非常感谢。它正确地处理你的代码,但我仍然不明白为什么它跳过了一行的开始(假设我删除了System.out.println(“LINE:”+ line);并且它读取每一行) – 2012-04-19 12:20:05

+0

下一个答案回答了我的问题。 – 2012-04-19 12:22:21

+1

我希望“一旦你有_br.read()一个字符,它不会再读它,所以它不会出现在行中。”有助于。 ;) – 2012-04-19 12:25:09

2

read-method消耗一个字符,请检查readLine是否返回null。

... 
String line; 
while ((line = _br.readLine()) != null) { 
    System.out.println("LINE: " + line); 
    lines.add(line); 
} 
... 
+0

非常感谢,现在我明白了! – 2012-04-19 12:23:08

相关问题