2016-03-15 1 views
2

disons que je ce texte dans mon fichier texte:lire une chaîne dans un fichier texte

VOTED/1/hannah/18 
NOT VOTING/2/janice/20 

et j'ai ce code:

File Orig_outFile = new File("C:\\voters.txt"); 
BufferedReader infile = new BufferedReader(new FileReader(Orig_outFile)); 

vNum=JOptionPane.showInputDialog("Enter voters number: "); 
String line=""; 
String something="VOTED"; 
while(infile.readLine()!=null){ 
    line=infile.readLine(); 
    String [] info=line.split("/"); 

    if(info[1].matches(vNum)){ 
    while(info[0].matches(something)){ 
     JOptionPane.showMessageDialog(null, "Voter already voted or Voter not registered. Please try again"); 
     vNum=JOptionPane.showInputDialog("Enter voters number: "); 
    } 
    President(); 
    } 
} 
infile.close(); 

la tâche est l'utilisateur doit saisir un numéro de l'électeur, puis lire le fichier texte, puis s'il est constaté que le info[0] dans le fichier texte contient VOTED il recevra un message d'erreur et doit entrer à nouveau son numéro d'électeur. Je suppose que mon erreur ici est que j'utilise la boucle while deux fois?

+0

Ce code va fuir la ressource 'infile' dans le cas d'une exception. – Raedwald

Répondre

2

En fait, vous êtes en train de lire une ligne while en faisant infile.readLine() et annexant ligne suivante à cordes line en faisant infile.readLine() à nouveau.

Vous êtes en train de lire la deuxième ligne de votre fichier. Vous devez changer votre boucle while comme suit:

while((line = infile.readLine()) != null) 

et supprimer l'énoncé ci-dessous:

line = infile.readLine(); 

Voici l'extrait de code corrigé:

File Orig_outFile = new File("C:\\voters.txt"); 
BufferedReader infile = new BufferedReader(new FileReader(Orig_outFile)); 

vNum = JOptionPane.showInputDialog("Enter voters number: "); 
String line = null; 
String something = "VOTED"; 
while((line = infile.readLine()) != null) { 
    String [] info = line.split("/"); 

    /* Assuming You Are Entering Voter's Number & Not Voter's Name */ 
    if(info[1].equalsIgnoreCase(vNum)) { 
     if(info[0].equalsIgnoreCase(something)) { 
      JOptionPane.showMessageDialog(null, "Voter already voted or 
              Voter not registered. Please try again"); 
      /* Please Note That You Are Currently Iterating File */ 
      /* If You Do This Here, You'll End Up Checking Same Records */ 
      /* You'll Have To Replace Outer `if` with `while` */ 
      vNum = JOptionPane.showInputDialog("Enter voters number: "); 
     } else { 
      President(); 
      break; 
     } 
    } 
} 
infile.close(); 

Voici une approche beaucoup plus claire mettre en œuvre:

  1. Lire le fichier complet en mémoire (de préférence Map avec la clé -> Numéro électeur). Prenez le numéro d'électeur de l'utilisateur et vérifiez s'il existe dans la carte.

  2. S'il n'existe pas dans Map ou si la valeur est égale à VOTED, répétez Step 2.

Voici l'extrait de code:

File Orig_outFile = new File("C:\\voters.txt"); 
BufferedReader infile = new BufferedReader(new FileReader(Orig_outFile)); 
Map<String,String> map = new HashMap<>(); 
String something = "VOTED"; 

String line = null; 
while((line = infile.readLine()) != null) { 
    String [] info = line.split("/"); 
    map.add(info[1],info[0]); 
} 
infile.close(); 

while(true) { 
    vNum = JOptionPane.showInputDialog("Enter Voter's Number: "); 
    if(map.contains(info[1]) && !map.get(info[1]).equalsIgnoreCase(something)) { 
     President(); 
     break; 
    } else { 
     JOptionPane.showMessageDialog(null, "Voter already voted or 
              Voter not registered. Please try again"); 
    } 
} 
+0

oh rien ne s'est vraiment passé. il est toujours le même comme il ne lira même pas le fichier texte ou quelque chose comme ça. il passera la condition if et while et passera à la méthode President() – pep

+0

@pep J'espère que vous entrez quelque chose comme '18' comme numéro d'électeur au lieu du nom de l'électeur. Dans ce cas, ne devrait-il pas être 'info [2]' au lieu de 'info [1]'? – user2004685

+0

oh je viens de remarquer et j'ai édité maintenant ma question. en fait le numéro de l'électeur est en info [1] et l'info [3] ou le 18 est l'âge :) et oui je vais essayer ceci et je vous ferai savoir si cela fonctionne :) – pep

2

Appel infile.readLine() lit en fait une ligne à partir du fichier, retourne et se déplace à la ligne suivante. Vous appelez deux fois, une fois dans la condition de la boucle while:

while(infile.readLine() != null) 

Et encore une fois dans la première ligne dans la boucle:

line = infile.readLine(); 

Vous devez simplement l'appeler une fois dans la condition de la boucle while et affecter la valeur à line variable, comme suit:

while((line = infile.readLine()) != null) 
+0

Je pensais avoir mentionné la même chose dans ma réponse ci-dessous? – user2004685