2

我编写了以下代码来打印文件内容并打印文件中的字符数和单词数

import java.io.*;
import java.util.*;

 class Ass53
{ 


public static void main(String args[]) throws Exception
{
    File file=new File("sample.txt");
    Scanner sc=new Scanner(new FileInputStream(file));
    String line,line1;
    int count1=0;
    int count=0;        

    /*Loop for printing contents of file*/
    while(sc.hasNextLine())
    {
        line=sc.nextLine();
        System.out.println(line);
    }


    /*loop for counting number of character in file*/
    while(sc.hasNext())
    {
            line1=sc.next();
        for(int i=1;i<=line1.length();i++)
            count1++;
    }
    System.out.println(count1); 


    /*loop for counting number of words in a file*/
    while(sc.hasNext())
    {
            sc.next();
            count++;
    }
    System.out.println("Number of words: " + count);


    }


 }

问题是只有第一个while循环正在执行。我猜原因可能是第一个while循环的sc.nextLine。在第一个while循环之后我猜什么都没有?

有什么办法可以解决吗?我希望我的另一个 while 循环也能工作

4

3 回答 3

2

每次您这样做时,nextLine()您都会将扫描仪推进到当前行之外。当第一个循环结束时,您位于文件的末尾,没有要扫描的内容。

一个解决方案是在每个循环之前重新创建扫描仪。在第二个和第三个之前重复这个while

sc=new Scanner(new FileInputStream(file));

另一种解决方案将涉及更多工作但更优雅:使用单个循环将所有行存储在 a 中List<String>,然后分析所有行以计算单词和字符。

于 2013-02-24T18:34:00.043 回答
1

每次完成循环后,您需要将 sc 设置回流的开头。

我不会发布代码,因为这看起来像家庭作业,我猜类名 Ass53 是“Assignment53”。查找并弄清楚如何将流设置回开始应该不会太难。

您可以尝试将其组合成一个循环,因为就目前而言,您实际上是在读取同一个文件 3 次。如果它是一个小文件可能不会那么糟糕,但如果它是一个较大的文件会很慢。

于 2013-02-24T18:33:10.500 回答
1

第一个循环说“直到我用完文件中的行,读取该行并打印它。” 然后第二个循环在文件中寻找更多的字符,当然那里什么都没有。

一种选择是在每个循环之前重置扫描仪。在第一个之后的每个循环之前,只需关闭并丢弃扫描仪,然后创建一个新的。

不过,还有更好的方法。您可以逐个字符地浏览文件(例如,使用BufferedReader),并增加每个字符的字符数,以及每个换行符的换行数。不要忘记考虑不以换行符结尾的文件。只需要一个循环,并且您已经计算了总字符数和行数。

于 2013-02-24T18:33:41.327 回答