我现在正在研究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()
}
}
我正在使用Programming in Scala book中解释的Source.fromFile方法。问题出在这里:如果我的文本文件是这样的:
baris
ayse
deneme
我得到了正确的结果6.如果我在单词 deneme 之后按回车,我仍然得到数字6,但是在这种情况下我检查了7。按下输入后按空格键,我得到7,这是正确的。这是Scala标准库中的错误还是更多可能是我遗漏了什么?
最后,我的基本主要方法如果有帮助:
def main(args: Array[String]): Unit = {
println(getLineNumber("C:\\Users\\baris\\Desktop\\bar.txt"))
}
答案 0 :(得分:3)
如果您在单词 deneme 之后按Enter键,只需在第6行添加行尾序列(CR + LF,在您的情况下)。您会看到光标转到新行,但您没有创建新行:您只需指定第六行已结束。要创建新行,您必须在行结束序列之后放置一个字符,就像按空格键时一样。
答案 1 :(得分: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;
基本上就是它的实现方式。我想这取决于一条线对你意味着什么。你在计算包含某些东西或新行字符的行吗? - 显然是不同的事情。