【问题标题】:Read Data From Text File And Sum Numbers从文本文件中读取数据并求和数字
【发布时间】:2012-08-06 04:59:42
【问题描述】:

我想从一个充满整数的文本文件中读取数据,并让程序在对它们求和时将这些整数打印到屏幕上。这应该不难,但我想不通!!!

这是极其简化的文本文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

这是我应该可以工作的代码:

import java.util.*;
import java.io.File;
import java.io.IOException;

public class ReadFile
{
    public static void main(String[] args)
    throws IOException
    {
        Scanner textfile = new Scanner(new File("Some_Numbers.txt"));

        filereader(textfile);
    }   


    static void filereader(Scanner textfile)
    {
        int i = 0;
        int sum = 0;

        while(i <= 19)
        {
            System.out.println(textfile.nextInt());
            sum = sum + textfile.nextInt();
            i++;
        }
    }



}

最后,这是我得到的输出:

1
3
5
7
9
11
13
15
17
19
Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:838)
    at java.util.Scanner.next(Scanner.java:1461)
    at java.util.Scanner.nextInt(Scanner.java:2091)
    at java.util.Scanner.nextInt(Scanner.java:2050)
    at ReadFile.filereader(ReadFile.java:23)
    at ReadFile.main(ReadFile.java:12)

【问题讨论】:

  • 您应该使用nextLong() 而不是nextInt()。看我的回答。

标签: java input io text-files


【解决方案1】:

您永远不会增加 i,因此 while 循环会继续超出文件末尾。至于求和,做这样的事情。

static void addstuff(Scanner aScanner) {
        int sum = 0;

        while (aScanner.hasNextInt()) {
            sum += aScanner.nextInt();
        }

        System.out.println(sum);
}

这将一直运行到hasNextInt() 返回 false,当扫描器看到的下一个项目不是整数时会发生这种情况。这可能是非数字输入或文件结尾。这意味着您不再局限于 25 个整数 - 它会在停止之前尽可能多地读取。

【讨论】:

    【解决方案2】:

    因为你永远不会增加i,它永远不会从 0 改变,所以它总是小于 25。这意味着它会在完成 25 个元素后尝试再次查看,但没有第 26 个,所以有一个例外。

    我建议使用for 循环而不是while 循环。

    总结它们,而不是打印出来,只需添加到累加器中。

    int accumulator = 0;
    for(int i = 0; i < 25; i++)
        accumulator += aScanner.nextInt();
    
    System.out.println(accumulator);
    

    应该打印出总和。

    【讨论】:

    • 它在 Java 中的 nextInt(),你可能会想到 C# ;)
    • @peterlawrey 谢谢。我没有想到 C#,我只是没有想到 :)
    【解决方案3】:

    你必须做以下事情

        while(i < 25)
        {
            System.out.println(aScanner.nextInt());
            i++ ;
        }
    

    【讨论】:

      【解决方案4】:

      它会引发异常,因为您没有在循环中增加 i。如果输入文件中的整数个数未知,您可以使用Scanner.hasNextInt() 方法检查下一个整数是否存在(或仅使用hasNext() 来检查EOF)。

      您可以像下面的代码 sn-p 一样对数字求和:

          ...
          int sum = 0;
          while(i++ < 25)
          {
              sum += aScanner.nextInt();
          }
      

          ...
          int sum = 0;
          while(aScanner.hasNextInt())
          {
              sum += aScanner.nextInt();
          }
      

      【讨论】:

      • 链接因某种原因断开。
      【解决方案5】:

      1.您的i永远不会增加。

      2.没有将数字相加。

      3. addstuff(diskScanner) 是一个static memeber,所以用类名和点运算符来调用它。

      例如:

      Add.addstuff(diskScanner);
      
         static void addstuff(Scanner aScanner)
      {
          int i = 0;
          long l = 0;
      
      
          while(i < 25)
          {
              l = i + l;
              i++;
          }
      
          System.out.println(l);
      
      
      
      }
      

      【讨论】:

        【解决方案6】:

        您收到错误(异常),因为您的文件包含非常大的数字,不适合 Integer 类型。您应该使用 Long

        所以,请使用:aScanner.nextLong() 而不是 aScanner.nextInt()

        编辑:您还应该将sum 变量的类型从int 更改为long

        您的代码可以正常工作。

        【讨论】:

        • 我将代码更改为:sum = sum + aScanner.NextLong();,但仍然出现同样的错误。
        • 我已经编辑了我的答案。请检查并让我知道它是否有效。尝试将sum 的类型从int 更改为long
        【解决方案7】:

        您在循环中调用了 textfile.nextInt() 两次。试试:

        static void filereader(Scanner textfile)     
        {         
            int i = 0;         
            int sum = 0;          
            while(i <= 19)         
            {       
                int nextInt = textfile.nextInt();          
        
                System.out.println(nextInt);             
                sum = sum + nextInt;
                i++;         
            }     
        }
        

        【讨论】:

        • 那……真是天才。我不会想到的。在 FORTRAN 中很容易做到,哈哈。在 FORTRAN 中,您只需执行以下操作:integer::i, sum, variablename i = 0 sum = 0 OPEN(UNIT=99, file=('Some_Numbers.txt'), form='formatted) DO i = 1,19 READ(99, '(I2)') variablename PRINT*, variablename sum = sum + variablename ENDDO CLOSE(99) PRINT*, sum 在我看来更直观。
        • 不客气,如果我的回答解决了您的问题,也许您会考虑将我的回答标记为已接受
        【解决方案8】:

        除了 lockstock 的回答之外,您可能还需要考虑为您的 while 循环添加 textfile.hasNext() 或 textfile.hasNextInt()。

        static void filereader(Scanner textfile) {
        int sum = 0;          
        while(textfile.hasNextInt()) {
            int nextInt = textfile.nextInt();
            System.out.println(nextInt);
            sum += nextInt;
        }
        

        }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-24
          • 1970-01-01
          • 2015-06-09
          • 2014-02-23
          • 1970-01-01
          • 2021-12-19
          相关资源
          最近更新 更多