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_Java Io - Fatal编程技术网

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

Java 如何使用扫描仪一次只读取一行整数?,java,file,java.util.scanner,java-io,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

如果我有一个带有数字列表的.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

问题:

这里的问题是,您正在使用同一个
扫描仪
实例来读取文件两次,这导致了问题,因为它在第一次调用
时已经到达了文件的末尾,所以当您调用
input.hasNext()时
它将为
,因此在
时您不会输入第二个

解决方案:

您需要在第二次
调用时重新初始化
输入
扫描仪:

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()
调用,以获得所需的行为

您的第二个循环将永远无法工作,因为在第一个循环之后,您处于EOF(文件末尾),扫描仪对象将不会从头开始

这里最好的方法是使用两个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);

我的印刷品和你的有点不同,但这很容易修复

在(在程序中)您试图计算行和的时候,scunner位于数据流的末尾。也许在同一时间计算行和和和总和是一个更好的主意,例如在同一个循环中。不敢相信我没有想到这一点,但是,第二个while仍然需要每个数字,而不仅仅是一行数字。不管我怎么做,我都无法让它单独添加每一行。@IanHank这就是为什么我说你需要注意
输入。next()
调用,它读取所有行,但作为
字符串
,然后你可以得到所有的数字。