Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
扫描仪定界符与输入文件(Java)不按预期工作_Java_File_Java.util.scanner - Fatal编程技术网

扫描仪定界符与输入文件(Java)不按预期工作

扫描仪定界符与输入文件(Java)不按预期工作,java,file,java.util.scanner,Java,File,Java.util.scanner,我正在编写一个程序,从一个文本文件中读取输入,该文件将始终遵循char:int格式,例如: A:3 B:1 C:2 D:2 (这里是eof) 我想读入字符及其对应的数字,忽略冒号 在我的程序中,我有以下声明和初始化: String fileName = "input.txt"; File file = new File(fileName); Scanner in = new Scanner(file).useDelimiter(":"); 然后,我尝试使用以下循环读取我的文件: while(

我正在编写一个程序,从一个文本文件中读取输入,该文件将始终遵循char:int格式,例如:

A:3
B:1
C:2
D:2
(这里是eof)

我想读入字符及其对应的数字,忽略冒号

在我的程序中,我有以下声明和初始化:

String fileName = "input.txt";
File file = new File(fileName);
Scanner in = new Scanner(file).useDelimiter(":");
然后,我尝试使用以下循环读取我的文件:

while(in.hasNextLine()){
        String t = in.next();
        int n = in.nextInt();
        ....
}
当我尝试在Eclipse中运行我的程序时,我收到以下错误:

线程“main”java.util.InputMismatchException中出现异常 位于java.util.Scanner.throwFor(Scanner.java:864) 下一步(Scanner.java:1485) 位于java.util.Scanner.nextInt(Scanner.java:2117) 位于java.util.Scanner.nextInt(Scanner.java:2076) 位于Huffman_Encoder.main(Huffman_Encoder.java:26)

i、 例如,行:
int n=in.nextInt()正在引发异常。我不知道为什么会这样。根据我对扫描仪定界符的理解,我应该跳过冒号,因此
int n=in.nextInt()
应将冒号后面的值放入
n

我在这里看不到什么

操作系统是Windows10,如果这很重要的话。多谢各位

edit:在进一步测试后,我发现错误发生在
String t=in.next()之后

在显示“A”之后立即打印出
t
,然后程序在
int n=in.nextInt()处抛出其异常

扫描仪获得的实际输入是以下字符串:

A:3\nB:1\nC:2\nD:2
因此,快速修复方法是将
\n
添加到分隔符列表中:

Scanner in = new Scanner(file).useDelimiter("[:\n]");
但是,这可能不是严格正确的,因为这将接受任何在字母和数字之间带有冒号或换行符的流,例如:

A
3:B
4

因此,最好逐行读取输入并在冒号处拆分(请参见
String.split()
)。

在访问Scanner之前。next**()方法建议使用适当的Scanner.hasNext**()方法。如果需要整数,请使用Scanner.hasNextInt()检查下一个标记,并通过Scanner.nextInt()获取它


在这里,您已经使用Scanner.hasNextLine()检查了下一个标记,该标记表示输入中至少还有一行。但是您正在尝试使用Scanner.next()和Scanner.nextInt()访问下一个令牌

我自己,我会使用带有默认分隔符的扫描仪读取每一行,然后使用
“:”
拆分行,但是如果您当前使用,您将无法像您应该的那样处理空白。感谢您的洞察力,我没有发现换行符可能是一个问题。但是,你提到的修复方法对我不起作用。我已经对此进行了测试,在第一个字符串t=in.next()之后,我的程序立即停止工作;我相信现在的情况是冒号被读入n,但这不应该发生。是的,正如我所说,这不是一个健壮的解决方案。更好的方法是逐行读取文件并在冒号上拆分。拆分的替代方法可以是这样的regexp
([a-Z]+):([0-9]+)