Autor |
Beitrag |
acer5672
      
Beiträge: 27
|
Verfasst: Di 22.04.08 17:12
Hi ich hab folgendes Problem ich möchte Blockkommentare aus Dateien löschen den anfang des Blockkommentare "/*" bekomme ich weg und auch das ende "*/" ,aber die zwischenzeilen bleiben erhalten ich hab ein teil des codes angefügt bitte um Hilfe!!!
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41:
| while(text.Contains("/*")) { position = text.IndexOf("/*"); anfang = text.Substring(0, position); tw.WriteLine(anfang); wahr=true;
while ((text = tr.ReadLine()) != null) { if (text.Contains("*/")) { position2 = text.IndexOf("*/"); ende = text.Substring(position2, 0); tw.WriteLine(ende); wahr = true;
}
else {
tw.WriteLine(" ");
} }
} }
} tw.Close(); tr.Close(); |
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Di 22.04.08 18:04
In Zeile musst Du "wahr = false" setzen (falls Du dies so verstehst - sprechende Variablennamen sind sehr nützlich); denn dann ist der Kommentar zu Ende. Vor allem aber musst Du diese Variable auch richtig in die Prüfung einbeziehen.
(Nachtrag:) Außerdem habe ich den Verdacht, dass die Kombination von Lesen (nämlich ReadLine), Prüfung (auf Kommentar-Anfang und -Ende) und Schreiben nicht sauber vorgenommen wird. Aber das könnte nur geprüft werden, wenn auch der Rest des Codes zu sehen wäre.
Ich finde diese Art der Prüfung nicht so schön. Irgendwann in den letzten Wochen gab es eine ähnliche Diskussion (von Dir?); da hatte ich vorgeschlagen, mit File.ReadAllLines einzulesen, mit WriteAllLines abzuspeichern und mit List<string> zu prüfen und umzuspeichern. Aber das kann Geschmackssache sein.
Jürgen
|
|
acer5672 
      
Beiträge: 27
|
Verfasst: Di 22.04.08 18:48
Hier ist der gesamte Code ich möchte die While schleife so haben das er den Inhal der Datei ohne Blockkommentare in eine andere reinschreibt!!! Bitte:)
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76:
| using System; using System.Collections.Generic; using System.Text; using System.IO;
namespace NoComments { class Program
{ static void Main(string[] args) { string text= " "; string anfang; int wahr = 0; string ende; int position2; int position;
const string filename="Program.cs"; const string filename2 = "Program2.cs"; TextWriter tw = File.CreateText(filename2); TextReader tr = File.OpenText(filename);
while ((text = tr.ReadLine()) != null) {
}
tw.Close(); tr.Close();
} } } |
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Di 22.04.08 19:20
"wahr = true" und "int wahr = 0" passen ja wohl nicht zusammen.
Mein Vorschlag: Verwende als Zusatzangabe:
C#-Quelltext 1:
| bool IsCommentary = false; |
In Pseudo-Code:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| while ((text = tr.ReadLine()) != null) { if (isCommentary) { position = text.IndexOf("*/"); if (wird das Ende des Kommentars erreicht?) { isCommentary = false; schreibe den Rest der Zeile in die Zieldatei } else { // na, was ist in diesem Zweig zu erledigen? } } else { position = text.IndexOf("/*"); if (wird der Anfang des nächsten Kommentars erreicht?) { schreibe den Anfang der Zeile in die Zieldatei isCommentary = true; } else { // na, was ist in diesem Zweig zu erledigen? } } } |
Das solltest Du zusammen mit Deinen bisherigen Überlegungen umsetzen können.
Jürgen
Nachtrag: Danke, Christian, für diesen Hinweis!
Zuletzt bearbeitet von JüTho am Di 22.04.08 19:34, insgesamt 1-mal bearbeitet
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Di 22.04.08 19:23
Du musst natürlich noch gucken, ob ein gefundenes "/*" oder "*/" innerhalb eines C#-Strings steht, denn dann startet bzw. beendet es ja keinen Kommentar:
C#-Quelltext 1:
| string keinKommentar = "/*foo*/"; |
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
acer5672 
      
Beiträge: 27
|
Verfasst: Di 22.04.08 22:10
ich verstehe nicht was du als bedingung nimmst in if ,wie das ende bzw anfang des Kommentars ich hab null peil wie ich das umsetzen soll !!!
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Mi 23.04.08 09:14
acer5672 hat folgendes geschrieben: | ich verstehe nicht was du als bedingung nimmst in if ,wie das ende bzw anfang des Kommentars ich hab null peil wie ich das umsetzen soll !!! |
Das enttäuscht mich doch sehr; das sieht nach fehlender Eigeninitiative und fehlendem Nachdenken aus. Könnte es wirklich sein, dass Du noch niemals in die SDK-Doku geschaut hast?
Du selbst hast String.IndexOf() eingeführt; das habe ich übernommen (es passt an dieser Stelle schließlich haargenau). Konkret erfährst Du in der SDK-Doku darüber:
Zitat: | Gibt den Index des ersten Vorkommens des angegebenen String in dieser Instanz an. |
Und was passiert wohl, wenn der Suchstring nicht gefunden wird?!
Zitat: | Rückgabewert
Die Indexposition von value, wenn diese Zeichenfolge gefunden wurde, andernfalls -1. |
"Peilst" Du es jetzt, was Du in die if-Abfrage schreiben kannst?
Jürgen
|
|
acer5672 
      
Beiträge: 27
|
Verfasst: Mi 23.04.08 09:35
srry aber eigentlich nicht,ich versuche es zu verstehen aber irgendwie komme ich nicht drauf
ich hab mal angefangen den code fertig zuschreiben
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93:
| using System; using System.Collections.Generic; using System.Text; using System.IO;
namespace NoComments { class Program
{ static void Main(string[] args) { string text= " "; string anfang; int wahr = 0;
bool isCommentary = false; string ende; int position2; int position;
const string filename="Program.cs"; const string filename2 = "Program2.cs"; TextWriter tw = File.CreateText(filename2); TextReader tr = File.OpenText(filename);
while ((text = tr.ReadLine()) != null) { if (isCommentary) { position = text.IndexOf("*/"); if (position) { isCommentary = false; anfang=text.Substring(0,position); tw.WriteLine(anfang); } else { tw.WriteLine(text); } } else { position = text.IndexOf("/*"); if (position) { ende = text.Substring(position, 0); isCommentary = true; } else { tw.WriteLine(ende); } }
}
tw.Close(); tr.Close();
} } } |
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Mi 23.04.08 11:14
Oh Mann  Je nach Situation ist zu nehmen:
C#-Quelltext 1: 2: 3:
| if (position >= 0) if (position < 0) |
In die if-Abfrage gehört etwas, was als Ergebnis "true" oder "false" ergibt. "position" ist eine Zahl, kann also niemals "true" oder "false" sein. Aber es geht doch darum, ob der Teilstring gefunden wird oder nicht; wenn er nicht gefunden wurde, gilt "position ist gleich -1". Danach ist also zu prüfen; für den Fall, dass NET bei Version 7.3 auch "-2" als Rückgabewert liefert, prüfe ich in solchen Fällen immer auf "größer/gleich Null" bzw. "kleiner als Null".
Ich hoffe, das war als Erklärung für if endlich ausreichend.
Bist Du sicher, dass Du die Teilstrings anfang, ende richtig eingetragen und gespeichert hast? Verwende möglichst nur lokale Variable - also auch begrenzt auf einen Block {...} - das macht die Bedeutung noch klarer.
Die Zusatzprüfung, auf die Christian hingewiesen hat, gehört als Ergänzung in den Block, in dem isCommentary auf true gesetzt wird.
Jürgen
|
|
derDachs
      
Beiträge: 18
|
Verfasst: Do 01.05.08 20:23
Titel: Hi
eigendlich ist das n Problem welches mit Regex zu lösen ist und nicht mit zehnmal if...
Regular Expressions sind der Weg dieses Problem mit wenigen Zeilen zu lösen.
Man weis eben, das keine Gänsefüsschen vor einen /* kommen dürfen, weil dann hätte einer das semikolon vergessen, was man aber auch ducrch Zusätze ausschliessen kann.
Es geht in C# mit mit der replacefunktion von Regex welche einfach den suchstring durch "" ersetzt.
mfG derDachs
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Do 01.05.08 20:55
Der RegEx ist nicht ganz so einfach. Nimm diesen Quelltext:
C#-Quelltext 1:
| char anführungszeichen = '"'; |
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
derDachs
      
Beiträge: 18
|
Verfasst: Fr 02.05.08 14:44
Titel: Aber dafür entworfen...
Ich denke immernoch, daß es damit am einfachsten geht...
In dem zu letzt geposteten sogar noch am einfachsten, weil:
Die Gänsefüsschen stehen nicht davor, sondern ein semiklon und damit ist der Fall ne klare Sache.
Genauso dürfen nach hochkommata ja auch nicht mehhr als ein zeichen folgen.
Das letzte Zeichen vor dem Kommentar muss ja nunmal ein Semikilon sein, oder der Kommenta steht am Anfang einer Zeile.
Wenn davor Gänsefüsschen stehen, müssen auch dahinter welche sein, sonst ist das ja n Syntaxfehler.
Ich frag mich allerdings sowiso, wer aus Programmen das Kommentar entfernt, der Compiler macht das ja eh..
Welchen Sinn soll das haben, will da einer Code klauen und Spuren verwischen?
Wer nichtmal solch eine Abfrage hinbekommt und dabei so verzweifelt reagiert, schreibt sebst warscheinlich nicht soviel Code, damit sich dieses Verfahren gegenüber Handarbeit lohnt.
Es ist Simpel, denke ich, aber die Direkte Lösung, will ich aus diesem Grunde auch ihm selbst überlassen, damit er lernt sich an einer Sache festzubeißen.
1. Es geht mit tausend Abfragen, so wie er es gerade versucht. (Mit nem Panzer auf Mücken schießen)
2. Oder halt mit ner Regular Expression, über die man freilich etwas nachdenken sollte, aber es geht einfacher und vor allen dingen genauer.
Diese Tips sind momenatn das einzige was ich dazu sagen möchte.
Ausser er beweist mir, daß das ganze nen Sinn, hat und daß er es tasächlich selbst probiert hat.
mfG derDachs
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Fr 02.05.08 20:50
Titel: Re: Aber dafür entworfen...
derDachs hat folgendes geschrieben: | Das letzte Zeichen vor dem Kommentar muss ja nunmal ein Semikilon sein, oder der Kommenta steht am Anfang einer Zeile. |
Nicht wirklich  . Ein Kommentar kann innerhalb einer Zeile auftreten und eine Zeile endet nicht immer mit einem Semikolon.
Christian hat Recht, der Regex wäre alles andere als trivial. Vor allem reicht es eben _nicht_, nur nach Kommentaren zu suchen und die "Umgebung" zu prüfen, sondern es muss die gesamte Datei mit einem Match abgedeckt werden. Genauer gesagt müssen einzelne Ausdrücke für Strings, Verbatim Strings, Chars und die zwei Kommentartypen in einen großen geworfen werden.
Zum Glück kennt C# keine verschachtelten Kommentare, sonst wäre das Problem mit Regexes unlösbar. Nagut, mit der .Net-Version ginge es trotzdem  .
|
|
derDachs
      
Beiträge: 18
|
Verfasst: Di 06.05.08 12:51
Titel: Schon richtig...
Sicherlich, habe ich mich zu weit herausgelehnt, als ich sagte es wär simpel..
RegularExpressions sind trotzdessen "unersetzbares" Werkzeug welches sich kein Parser / Syntaxchecker
so einfach wegdenken kann, sie machen das leben in diesem Bereich um einiges einfacher.
Somit war simpel nur auf den Sachverhalt bezogen, ob ich das mit RegEx oder zu Fuss(und dann auch noch Barfuss)
mache.
Mich würden trotzdessen die Beweggründe interessieren, oder traf ich ins Schwarze?
mfG derDachs
|
|