2014-01-05 2 views
1

В настоящее время я изучаю Scala, и это мой фрагмент кода для подсчета количества строк в текстовом файле.Подсчет строк файла в Scala

//returns line number of a file 
    def getLineNumber(fileName: String): Integer = { 
    val src = io.Source.fromFile(fileName) 
    try { 
     src.getLines.size  
    } catch { 
     case error: FileNotFoundException => -1 
     case error: Exception => -1 
    } 
    finally { 
     src.close() 
    } 
    } 

Я использую метод Source.fromFile, как описано в Programming in Scalabook. Вот проблема: Если мой текстовый файл выглядит так:

baris 

ayse 


deneme 

я получить правильный результат 6. Если я нажимаю ввести после слова deneme я до сих пор получить номер 6, однако я exptect 7 в этом случае. Если я нажимаю пробел после нажатия клавиши ввода, я получаю 7, что является правильным снова. Является ли это ошибкой в ​​стандартной библиотеке Scala или, возможно, я что-то упускаю?

Наконец, мой основной основной метод здесь Если это помогает:

def main(args: Array[String]): Unit = { 
    println(getLineNumber("C:\\Users\\baris\\Desktop\\bar.txt")) 
    } 
+0

Проверьте настройки текстового редактора. Это не похоже на то, что это делает Скала. – ghik

ответ

3

Использует java.io.BufferedReader до readLine. Вот источник этого метода:

/** 
* Reads a line of text. A line is considered to be terminated by any one 
* of a line feed ('\n'), a carriage return ('\r'), or a carriage return 
* followed immediately by a linefeed. 
* 
* @return  A String containing the contents of the line, not including 
*    any line-termination characters, or null if the end of the 
*    stream has been reached 
* 
* @exception IOException If an I/O error occurs 
* 
* @see java.nio.file.Files#readAllLines 
*/ 
public String readLine() throws IOException { 
    return readLine(false); 
} 

Который называет это:

... 
* @param  ignoreLF If true, the next '\n' will be skipped 
... 
String readLine(boolean ignoreLF) ... 
... 
/* Skip a leftover '\n', if necessary */ 
      if (omitLF && (cb[nextChar] == '\n')) 
       nextChar++; 
      skipLF = false; 
      omitLF = false; 

Так в основном это, как это реализовано. Я думаю, это зависит от того, что означает для вас линия. Вы считаете строки, содержащие что-то или новые строковые символы? - очевидно, разные вещи.

+1

Спасибо, что это связано с интерполяцией новой строки. Предложение «Линия считается завершенной любым из фидов строк ('\ n'), возвратом каретки ('\ r') или возвратом каретки, за которым следует сразу строка перевода." в javadoc объясняет все. –

3

Если нажать клавишу ВВОД после слова deneme просто добавить в конец-строки последовательности (CR + LF, в вашем случае) до 6-й линии. Вы видите, что курсор переходит к новой строке, но вы не создали новую строку: вы просто указываете, что шестую строку закончен. Чтобы создать новую строку, вы должны поместить символ после окончания строки, как вы делаете, когда вы нажимаете пробел.

Смежные вопросы