J'essaie de prendre les entrées d'un utilisateur et d'imprimer la quantité de lignes, de mots et de caractères d'un fichier texte. Cependant, seule la quantité de mots est correcte, il affiche toujours 0 pour les lignes et les caractères.
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);
}
}
essayer
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();
}
in.next();
utilise toutes les lignes de la première while()
. Après la fin de votre première boucle while, il n'y a plus de caractères à lire dans le flux d'entrée.
Vous devriez imbriquer votre personnage et le décompte de mots dans un nombre de lignes de comptage de boucles while.
Je pense que la meilleure réponse est
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();
}
Y a-t-il une raison pour laquelle vous pensez que:
while(in.hasNext())
{
in.next();
words++;
}
not consommera-t-il l'intégralité du flux d'entrée?
Il va fais donc, ce qui signifie que vos deux autres boucles while
ne seront jamais itératives. C'est pourquoi vos valeurs pour les mots et les lignes sont toujours définies sur zéro.
Il est probablement préférable de lire le fichier un caractère à la fois, en augmentant le nombre de caractères à chaque boucle et en détectant le caractère pour décider d’incrémenter ou non les autres compteurs.
En gros, partout où vous trouvez un \n
, augmentez le nombre de lignes - vous devriez probablement le faire aussi si le dernier caractère du flux n'était pas \n
.
Et, chaque fois que vous passez d'un espace blanc à un espace libre, augmentez le nombre de mots (il y aura probablement un traitement de cas Edge délicat au début du flux, mais c'est un problème d'implémentation).
Vous regardez quelque chose comme le pseudo-code suivant:
# 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++;
Je ne suis pas un expert en Java, mais je suppose que les codes .hasNext
, .hasNextLine
et .hasNextByte
utilisent et incrémentent le même indicateur de position de fichier. Vous devrez le réinitialiser, soit en créant un nouveau scanner, comme indiqué par Aashray, ou en utilisant RandomAccessFile et en appelant file.seek(0);
après chaque boucle.
Je suis d'accord avec la réponse de @Cthulhu. Dans votre code, vous pouvez réinitialiser votre objet Scanner
(in
).
in.reset();
Cela réinitialisera votre objet en première ligne de votre fichier.
Vous pouvez utiliser des expressions régulières pour compter pour vous.
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);
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();
}
Le pointeur de fichier est placé à la fin du fichier lorsque le premier est exécuté. essaye ça:
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++;
}
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);
}
}