2011-09-13 2 views
1

J'ai écrit le programme suivant pour lire un fichier et ignorer les commentaires, cela fonctionne pour les commentaires sur une seule ligne, mais pas pour les lignes multiples. Quelqu'un sait-il pourquoi? Je n'ai pas besoin de m'inquiéter de "//" dans Strings. Seuls les commentaires java-à-dire "//" et "/ * * /"Comment ignorer les commentaires avec le lecteur de tampon?

code:

import java.io.*; 

public class IfCounter2 
{ 
    public static boolean lineAComment(String line) 
    { 
     if (line.contains("//"))  
      return true; 

     return false; 
    } 

    public static boolean multiLineCommentStart(String line) 
    { 
     if (line.contains("/*"))  
      return true; 

     return false; 
    } 

    public static boolean multiLineCommentEnd(String line) 
    { 
     if (line.contains("*/"))  
      return true; 

     return false; 
    } 

    public static void main(String[] args) throws IOException 
    { 
     String fileName = args[0]; 

     int numArgs = args.length; 

     int ifCount = 0; 

     // create a new BufferReader 
     BufferedReader reader = new BufferedReader(new FileReader(fileName)); 
     String line = null; 
     StringBuilder stringBuilder = new StringBuilder(); 
     String ls = System.getProperty("line.separator"); 

     line = reader.readLine(); 
     // read from the text file 
     boolean multiLineComment = false; 

     while ((line = reader.readLine()) != null) 
     { 
      if (!multiLineCommentStart(line)) 
      { 
      multiLineComment = true; 
      } 

      if (multiLineComment) { 
      if (!multiLineCommentEnd(line)) 
      { 
       multiLineComment = false; 
      } 
      } 

      if (!lineAComment(line) && !multiLineComment) 
      { 
      stringBuilder.append(line); 
      stringBuilder.append(ls); 
      } 
     } 


     // create a new string with stringBuilder data 
     String tempString = stringBuilder.toString(); 
     System.out.println(stringBuilder.toString()); 

    } 
} 
+0

Comment utilisez-vous ces méthodes? il semblerait que le problème soit dans le code qui implémente ceci à moins que je ne comprenne mal la question. – Andy

+0

Dans le principal juste en dessous des méthodes :) – josh

+0

Désolé, n'a pas vu la barre de défilement ...:/ – Andy

Répondre

2

Vous ne définissez multiLineComment sur true lorsque !multiLineCommentStart(line) est vrai - qui est, à chaque fois que la ligne ne contient pas /* .

+0

Alors qu'est-ce qui doit exactement être changé? – josh

+0

Il semble que l'intention de 'multiLineComment' est de suivre quand vous êtes entre le début et la fin d'un commentaire multiligne. Pensez donc à quand cela a du sens d'activer ce drapeau - quand devriez-vous commencer à suivre que vous êtes dans un commentaire multiligne? Astuce: ce n'est pas quand la ligne ne contient pas le départ multiligne. –

+0

Donc je devrais me débarrasser du "!" ne pas. Alors je commence à le suivre lorsque la ligne commence par "/ *"? – josh

0

Fondamentalement, votre code devrait ressembler STH comme celui-ci (non testé)

boolean multiLineComment = false; 

    while ((line = reader.readLine()) != null) 
    { 
     if (multiLineCommentStart(line)) 
     { 
     multiLineComment = true; 
     } 

     if (multiLineComment) { 
     if (multiLineCommentEnd(line)) 
     { 
      multiLineComment = false; 
     } 
     } 

     if (!lineAComment(line) && (multiLineComment == false)) 
     { 
     stringBuilder.append(line); 
     stringBuilder.append(ls); 
     } 
    } 

dans cette dernière instruction if, vous devez avoir une expression avec votre variable et fixe

0

La réponse de Andy est à droite sur l'argent mais a besoin d'une validation en dernier si pour s'assurer que vous ne comptez pas */comme une ligne valide:

 
    boolean multiLineComment = false; 

    while ((line = reader.readLine()) != null) 
    { 
     if (multiLineCommentStart(line)) 
     { 
     multiLineComment = true; 
     } 

     if (multiLineComment) { 
     if (multiLineCommentEnd(line)) 
     { 
      multiLineComment = false; 
     } 
     } 

     if (!lineAComment(line) && (multiLineComment == false) && 
      !multiLineCommentEnd(line)) 
     { 
     stringBuilder.append(line); 
     stringBuilder.append(ls); 
     } 
    } 
Questions connexes