Programm gesucht das die reinen Codezeilen zählt
-
Hallo!
Ich suche ein Programm wo man beispielsweise einen ordner mit .cpp oder .h dateien angibt, und es zählt wieviel Hardcodezeilen vorhanden sind (sprich Kommentare werden ausgelassen { zählen nicht usw).
Gibts sowas?
-
hmm kannst du dir doch selber programmieren.. hier mal ein code von meinem solchen programm das einfach die zeilen zählt:
#include <iostream> #include <fstream> #include <string> using namespace std; int main( int argc, char * argv[] ) { string quelle_p; string input; string in_source; int i; long pos; double zeile; double zeile_i; char buffer[10000]; cout << "*************************************" << endl; cout << "*By burnner *" << endl; cout << "*Zeilenzaehlen *" << endl; cout << "*************************************" << endl; cout << "Starttime: " << __TIME__ << endl; cout << "\n" << "Bitte gebn Sie die Hauptquelledatei ein: "; cin >> quelle_p; ifstream quelle(quelle_p.c_str()); if(!quelle) { cout << "Datei nicht gefunden!" << endl; system("PAUSE"); return 1; } cout << "Oeffne " << quelle_p << endl; cout << "Analysiere " << quelle_p << "... " << endl; while(quelle.getline(buffer, 10000)) { zeile ++; input = ""; for(i =0; i < 10000; i++) input += buffer[i]; pos = input.find("include"); if(pos != string::npos) { pos = input.find("<"); input.erase(0, pos+1); pos = input.find(">"); input.erase(pos, input.length()-1); cout << "Analysiere Includefile: " << input << endl; ifstream include(input.c_str()); zeile_i=0; while(include.getline(buffer, 10000)) { zeile ++; } include.close(); } } cout << "Fertig... " << endl; cout << "Das Projekt enthaelt " << zeile << " Zeilen. " << endl; system("PAUSE"); return 0; }
nun noch ein bischen anpassen und fertig.. (der code ist für eine andere programmiersprache^^)
mfg burnner
-
viel spaß beim selbercoden, sowsa gibts nicht(und ist imho auch nicht nötig)
-
burnner: Das ist irgendwie nicht allzu schön.
/me würde das mit ein bisschen sed und gegebenenfalls wc lösen. Oder gleich Perl - je nach Tagesverfassung.
-
Hier ist mein entsprechendes kleines Tool für Java in Java. Es ist macht zwar nicht genau das, was du suchst, aber ähnliches. Vielleicht hilft dir das kleine Programm deshalb trotzdem, indem es dich auf die richtige Idee o.ä bringt.
import java.io.*; import java.util.*; public class MetricsViewer { private static long sizeClassFiles = 0; private static long sizeJavaFiles = 0; private static int javaFiles = 0; private static int classFiles = 0; private static int emptyLines = 0; private static int commentLines = 0; private static int codeLines = 0; private static int semicolons = 0; private static int annotationCount = 0; private static HashMap<String,Integer> keyWordMap = new HashMap<String,Integer>(); static { keyWordMap.put("for",0); keyWordMap.put("if",0); keyWordMap.put("else",0); keyWordMap.put("while",0); keyWordMap.put("switch",0); keyWordMap.put("case",0); keyWordMap.put("try",0); keyWordMap.put("catch",0); keyWordMap.put("finally",0); keyWordMap.put("enum",0); keyWordMap.put("class",0); keyWordMap.put("interface",0); keyWordMap.put("static",0); keyWordMap.put("final",0); keyWordMap.put("assert",0); keyWordMap.put("throw",0); keyWordMap.put("throws",0); keyWordMap.put("return",0); keyWordMap.put("public",0); keyWordMap.put("private",0); keyWordMap.put("protected",0); keyWordMap.put("continue",0); keyWordMap.put("break",0); } public static void main (final String [] args) { for (final String s : args) { searchFile (new File (s)); } System.out.println(); System.out.println("number of Java-Files : " + javaFiles); System.out.println("number of Class-Files : " + classFiles); System.out.println("size of Java-Files : " + sizeJavaFiles); System.out.println("size of Class-Files : " + sizeClassFiles); System.out.println(); System.out.println("empty lines : " + emptyLines); System.out.println("comment lines : " + commentLines); System.out.println("code lines : " + codeLines); System.out.println("all lines : " + (emptyLines+commentLines+codeLines)); System.out.println(); System.out.println("; : " + semicolons); System.out.println("@ : " + annotationCount); System.out.println(); printKeyWordMap(); } public static void searchFile (final File file) { if (file.isDirectory()) { for (final File f : file.listFiles()) { searchFile (f); } } else { final String path = file.getPath(); try { if (path.endsWith(".java")) searchJavaFile (file); if (path.endsWith(".class")) searchClassFile (file); } catch (IOException e) { } } } public static void searchJavaFile(final File file) throws IOException { System.out.println (file); sizeJavaFiles += file.length(); ++javaFiles; final BufferedReader reader = new BufferedReader (new FileReader (file)); boolean comment = false; while (reader.ready()) { final String line = reader.readLine(); // EMPTY LINES final String trimLine = line.trim(); if (trimLine.equals("")) { ++emptyLines; continue; } // COMMENT LINES if (trimLine.startsWith("//")) { ++commentLines; continue; } if (trimLine.startsWith("/*")) { comment = true; } if (comment) { ++commentLines; if (trimLine.endsWith("*/")) { comment = false; } continue; } //CODE LINES ++codeLines; final char [] chars = line.toCharArray(); for (final char c : chars) { if (c == ';') ++semicolons; if (c == '@') ++annotationCount; } final String [] tokens = line.split("[\\(\\)\n\r\t ;,\\.\\{\\}@]"); for (final String token : tokens) { Integer number = keyWordMap.get(token); if (number != null) { keyWordMap.put(token,++number); } } } } public static void searchClassFile(final File file) { System.out.println (file); sizeClassFiles += file.length(); ++classFiles; } public static void printKeyWordMap() { int offset = 0; for (String keyWord : keyWordMap.keySet()) { int number = keyWordMap.get(keyWord); String outString = keyWord + " : " + number; if (offset == 0) { offset = outString.length(); System.out.print(outString); } else if (offset < 25) { StringBuilder builder = new StringBuilder (30); for (;offset < 25 ; ++offset) { builder.append(" "); } System.out.print(builder.toString()); System.out.print(outString); offset += outString.length(); } else { StringBuilder builder = new StringBuilder (30); for (;offset < 50 ; ++offset) { builder.append(" "); } System.out.print(builder.toString()); System.out.println(outString); offset = 0; } } System.out.println(); } }
(PS: Ich bin mir darüber im Klaren, dass der Name des Programms momentan unpassend ist.)
-
otze schrieb:
viel spaß beim selbercoden, sowsa gibts nicht(und ist imho auch nicht nötig)
Soetwas gibt es in Massen, ist unnötig, kann einem beim Programmieren aber psychisch etwas unterstützen, da man durch so ein Programm einen "imaginären" Fortschritt beim Programmieren sehen kann.
-
nman schrieb:
burnner: Das ist irgendwie nicht allzu schön.
/me würde das mit ein bisschen sed und gegebenenfalls wc lösen. Oder gleich Perl - je nach Tagesverfassung.
Was findest du den na nicht allzu schön? Naja das mit der Forschleife für die Strings weiss ich^^ hab damals irgendwie vergessen das es einfach per
string1 = char1; geht^^mfg burnner
-
burnner schrieb:
Was findest du den na nicht allzu schön? Naja das mit der Forschleife für die Strings weiss ich^^ hab damals irgendwie vergessen das es einfach per string1 = char1; geht^^
Einerseits würde ich dafür einfach man: wc verwenden, andererseits lässt sich die Kernfunktionalität wesentlich kürzer zusammenfassen.
Steinbeck: Wirf doch mal einen Blick auf cccc, das sieht so aus als würde es Deine Anforderungen erfüllen.
-
Gregor schrieb:
otze schrieb:
viel spaß beim selbercoden, sowsa gibts nicht(und ist imho auch nicht nötig)
Soetwas gibt es in Massen, ist unnötig, kann einem beim Programmieren aber psychisch etwas unterstützen, da man durch so ein Programm einen "imaginären" Fortschritt beim Programmieren sehen kann.
Hehe, ich bin gerade in der Phase, wo ich bei einer Verringerung des Quellcodes Fortschritte sehe.
-
Optimizer schrieb:
Hehe, ich bin gerade in der Phase, wo ich bei einer Verringerung des Quellcodes Fortschritte sehe.
Da kann dir so ein Programm ja auch den Fortschritt anzeigen!
-
ich seh nen fortschritt, wenn ich auf meiner liste nen unterpunkt abhaken kann, wozu brauch ich dann ein programm, das mir sagt, dass ich ne extra schicht einlegen muss, wenn ich meine wochenziel erreichen will
-
Wenn du msvs bentzt schau mal auf http://www.wndtabs.com/ vorbei. Ansonsten gabs son'n tool auch mal auf www.codeproject.com *such*