如何使用扫描仪一次仅读取整数行?

时间:2019-03-20 16:19:39

标签: java file java.util.scanner java-io

如果我有一个带有数字列表的.txt文件。它应该返回每一行中所有数字的总和以及文件中每个数字的总和。然后在控制台中打印所有这些。可以说txt文件是:

50  3   21  10  9   9   54  47  24  74
22  63  63  28  36  47  60  3   45  83
20  37  11  41  47  89  9   98  40  94
48  77  93  68  8   19  81  67  80  64
41  73  24  29  99  6   41  23  23  44
43  41  29  11  43  94  62  27  81  71
83  14  97  67  21  68  77  25  21  24
31  8   54  14  49  96  33  18  14  80
54  55  53  38  62  53  62  10  42  29
17  89  92  87  15  42  50  85  68  43

这是我的代码:

import java.io.File;
import java.io.IOException;
import java.util.Scanner;
public class Summer {
    public static void main(String args[]) throws IOException {

        File text = new File("src/nums.txt");

        if (!text.exists()) {
          text.createNewFile();
        }

        int sum = 0;
        Scanner input = new Scanner(text);
        while (input.hasNextInt()) {
            sum = sum + input.nextInt();

        }

        System.out.printf("Sum of all numbers: %d", sum);


        int lineSum = 0;
        int lineNum = 1;

        while (input.hasNext()) {
            if (input.hasNextInt()) {
                lineSum = lineSum + input.nextInt();
            } else {
                input.next();
                lineNum++;
            }
        }

        System.out.printf("%nSum of line %d: %d", lineNum, lineSum);
    }
}

哪个输出:

Sum of all numbers: 4687
Sum of line 1: 0

2 个答案:

答案 0 :(得分:2)

您的第二个循环将永远无法工作,因为在第一个循环之后您处于EOF(文件结束)位置,并且扫描程序对象不会从头开始。

这里最好的方法是使用2个Scanner对象,一个从文件中读取一行,另一个从该行中读取值。使用此解决方案,您可以一次计算每行总数和文件总数。

int total = 0;
Scanner input = new Scanner(text);
while (input.hasNextLine()) {
    Scanner lineScanner = new Scanner(input.nextLine());
    int lineSum = 0;
    while (lineScanner.hasNextInt()) {
        lineSum += lineScanner.nextInt();
    }
    System.out.println(Sum of line is: " + lineSum);
    total += lineSum;
}
System.out.println("File sum is: " + total);

我的打印与您的打印有些不同,但是很容易解决。

答案 1 :(得分:1)

问题:

您的问题是您使用相同的Scanner实例两次读取文件,这引起了问题,因为它在第一次while调用中已到达文件末尾,因此当您回想起input.hasNext()时,它将是false,因此您将不会输入第二个while

解决方案:

您需要在第二个input调用之前重新初始化while扫描程序:

int lineSum = 0;
int lineNum = 1;

//Re initialize the scanner instance here
input = new Scanner(text);
while (input.hasNext()) {
    //Do the calculations
}

注意:

您还需要注意计算中的input.nextInt()input.next()调用以获得所需的行为。