4

ユーザーからの入力を取得して、行数、単語数、および文字数をテキスト ファイルに出力しようとしています。ただし、正しいのは単語の量だけで、行と文字には常に 0 が出力されます。

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

public class TextFileInfoPrinter
{  
    public static void main(String[]args) throws FileNotFoundException        
    { 
            Scanner console = new Scanner(System.in);           

            System.out.println("File to be read: ");
            String inputFile = console.next();

            File file = new File(inputFile);
            Scanner in = new Scanner(file);

            int words = 0;
            int lines = 0;
            int chars = 0;

            while(in.hasNext())
            {
                in.next();
                words++;
            }

            while(in.hasNextLine())
            {
                in.nextLine();
                lines++;
            }

            while(in.hasNextByte())
            {
                in.nextByte();
                chars++;
            }

            System.out.println("Number of lines: " + lines);
            System.out.println("Number of words: " + words);
            System.out.println("Number of characters: " + chars);
    }
}
4

10 に答える 10

6

試す

    int words = 0;
    int lines = 0;
    int chars = 0;
    while(in.hasNextLine())  {
        lines++;
        String line = in.nextLine();
        chars += line.length();
        words += new StringTokenizer(line, " ,").countTokens();
    }
于 2013-03-06T05:13:47.957 に答える
2

in.next();最初の のすべての行を消費していwhile()ます。最初の while ループが終了すると、入力ストリームで読み取る文字がなくなります。

while ループ カウント行内に文字とワード カウントをネストする必要があります。

于 2013-03-06T05:05:57.373 に答える
1

私は最良の答えは

int words = 0;
int lines = 0;
int chars = 0;
while(in.hasNextLine())  {
    lines++;
    String line = in.nextLine();
   for(int i=0;i<line.length();i++)
    {
        if(line.charAt(i)!=' ' && line.charAt(i)!='\n')
        chars ++;
    }
    words += new StringTokenizer(line, " ,").countTokens();
}
于 2014-10-29T00:17:54.810 に答える
1

次のように考えるのには何か理由がありますか。

while(in.hasNext())
{
    in.next();
    words++;
}

入力ストリーム全体を消費しませんか?

そうします。つまり、他の 2 つのループは繰り返されwhileません。そのため、単語と行の値はまだゼロに設定されています。

おそらく、一度に 1 文字ずつファイルを読み取り、ループのたびに文字数を増やし、文字を検出して他のカウンターをインクリメントするかどうかを決定する方がよいでしょう。

基本的に、 が見つかった場合\nは行数を増やします。ストリームの最後の文字が でなかった場合も、おそらくこれを行う必要があり\nます。

また、空白から非空白に移行するたびに、単語数を増やします (ストリームの開始時にトリッキーなエッジ ケース処理が行われる可能性がありますが、これは実装上の問題です)。

次の疑似コードのようなものを見ています。

# Init counters and last character

charCount = 0
wordCount = 0
lineCount = 0
lastChar = ' '

# Start loop.

currChar = getNextChar()
while currChar != EOF:
    # Every character counts.

    charCount++;

    # Words only on whitespace transitions.

    if isWhite(lastChar) && !isWhite(currChar):
        wordCount++

    # Lines only on newline characters.

    if currChar == '\n':
        lineCount++;
    lastChar = currChar
    currChar = getNextChar()

# Handle incomplete last line.

if lastChar != '\n':
    lineCount++;
于 2013-03-06T05:07:07.107 に答える
0
while(in.hasNextLine())  {
        lines++;
        String line = in.nextLine();
        for(int i=0;i<line.length();i++)
        {
            if(line.charAt(i)!=' ' && line.charAt(i)!='\n')
        chars ++;
        }
        words += new StringTokenizer(line, " ,;:.").countTokens();
    }
于 2013-03-06T11:35:15.983 に答える
0
import java.io.*;
class wordcount
{
    public static int words=0;
    public static int lines=0;
    public static int chars=0;
    public static void wc(InputStreamReader isr)throws IOException
    {
        int c=0;
        boolean lastwhite=true;
        while((c=isr.read())!=-1)
        {
            chars++;
            if(c=='\n')
                lines++;
            if(c=='\t' || c==' ' || c=='\n')
                ++words;
            if(chars!=0)
                ++chars;
        }   
       }
    public static void main(String[] args)
    {
        FileReader fr;
        try
        {
            if(args.length==0)
            {
                wc(new InputStreamReader(System.in));
            }
            else
            {
                for(int i=0;i<args.length;i++)
                {
                    fr=new FileReader(args[i]);
                    wc(fr);
                }
            }

        }
        catch(IOException ie)
        {
            return;
        }
        System.out.println(lines+" "+words+" "+chars);
    }
}
于 2016-11-27T03:53:31.630 に答える
0

最初のwhileが実行されると、ファイルポインタはファイルの末尾に設定されます。これを試して:

Scanner in = new Scanner(file);


        while(in.hasNext())
        {
            in.next();
            words++;
        }
        in = new Scanner(file);
        while(in.hasNextLine())
        {
            in.nextLine();
            lines++;
        }
        in = new Scanner(file);
        while(in.hasNextByte())
        {
            in.nextByte();
            chars++;
        }
于 2013-03-06T05:07:42.380 に答える
0

私は Java の専門家ではありませんが、 、.hasNext.hasNextLineおよび.hasNextByteすべてが同じファイル位置インジケータを使用およびインクリメントしていると思います。Aashrayが述べたように新しいスキャナーを作成するか、RandomAccessFileを使用してfile.seek(0);各ループの後に呼び出すことにより、それをリセットする必要があります。

于 2013-03-06T05:12:31.400 に答える
0

@Cthulhuの回答に同意します。コードで、Scannerオブジェクトをリセットできます ( in)。

in.reset();

これにより、ファイルの最初の行で in オブジェクトがリセットされます。

于 2013-03-06T05:17:06.783 に答える
0

正規表現を使用して数えることができます。

String subject = "First Line\n Second Line\nThird Line";  
Matcher wordM = Pattern.compile("\\b\\S+?\\b").matcher(subject); //matches a word
Matcher charM = Pattern.compile(".").matcher(subject); //matches a character
Matcher newLineM = Pattern.compile("\\r?\\n").matcher(subject); //matches a linebreak

int words=0,chars=0,newLines=1; //newLines is initially 1 because the first line has no corresponding linebreak

while(wordM.find()) words++;
while(charM.find()) chars++;
while(newLineM.find()) newLines++;

System.out.println("Words: "+words);
System.out.println("Chars: "+chars);
System.out.println("Lines: "+newLines);
于 2013-03-06T05:19:40.587 に答える