rez
Hallo,
ich bin absoluter Anfänger in Sachen C++ und wollte euch daher mal Fragen ob jemand bereit wäre kurz für mich diesen Code auszukommentíeren damit ich weiss wofür jede Zeile zuständig ist und was sie macht.
[
| code: |
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:
|
#include <fstream.h>
void main()
{ ofstream aus;
ifstream ein;
int z;
aus.open("Zahl.txt");
cout << "Zahlenfolge eingeben ! (Abbruch mit 0)" << endl;
cin >> z;
while( z )
{ aus << z << endl;
cin >> z;
}
aus.close();
ein.open("Zahl.txt");
cout << "Gespeicherte Zahlenfolge:" << endl;
ein >> z;
while( ! ein.eof() )
{ cout << z << endl;
ein >> z;
}
ein.close();
cin.get(); cin.get();
} |
|
Würde mich sehr freuen!
Gruss
rez
Hanfling
| code: |
1:
2:
3:
4:
|
// Evil Stil sein, zeigen das du nie was von namespaces gehört hast (oder eher der das geschrieben hat.
// EDIT: Doppeltes cin.get() lässt sich auch umgehen über zurücksetzen der Streams.
// EDIT #2: Und wird auch nicht seine Funktion erfüllen wie erwartet. Es bleibt wirkungslos, bei mehr als 2 Zeichen im Input Buffer.
|
|
Desweiteren finde ich das ziemlich dreist die Frage. Das ist nun wirklich absolut nichts tiefgehendes. Mit einem Standardwerk/Tutorial lassen sich bequem alle Antworten klären. Programmieren lernt man bestimmt nicht so, vorallem nicht ohne Selbstständigkeit, auch wenn vielleicht gleich einer kommen wird der dir den Arsch abwischt.
mars
So, ich habe es mal ein wenig umgeschrieben und kommentiert.
Normalerweise gebe ich Hanfling da absolut recht,
aber ich bin selber ein absoluter Anfänger (seit wenigen Tagen lerne ich c++) und somit war das für mich eine gute Übung.
| code: |
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:
|
#include <iostream> //Wir wollen ja standardkonform bleiben
#include <fstream>
using namespace std;
int main(){
ofstream ausgabe;
ifstream eingabe;
int z;
ausgabe.open("Zahl.txt"); // Öffne Zahl.txt
cout << "Zahlenfolge eingeben ! (Abbruch mit 0)" << endl;
while( (cin >> z) && (z > 0) ){ // Lies Zahlenfolge ein sollange die Eingabe nicht 0 ist.
ausgabe << z << endl; // Und schreibe die Ziffern untereinander in die Datei zahl.txt
}
ausgabe.close(); // Schliesse die Zahl.txt
eingabe.open("Zahl.txt"); // Öffne die Datei wieder, diesmal im daraus zu lesen (ifstream)
cout << "Gespeicherte Zahlenfolge:" << endl;
while(eingabe >> z ){ // Lies die Ziffern (Zeichenweise) aus der Datei und gib sie auf der std ausgabe aus
cout << z << endl;
if(eingabe.eof())
break;
}
eingabe.close(); // Datei schliessen
cin.get(); // warten auf Tastendruck, bzw auf Eingabe eines Zeichens.
} |
|
Hanfling
@arschabwischer:
Dein cin.get() Kommentar ist falsch.
cin.get() liest das nächste Zeichen aus einem Stream. Das ist ein fundamentaler Unterschied. cin.get() muss und wird auch nicht auf einen Tastendruck warten, wenn der Stream nicht leer ist, wie es oft der Fall ist. Deswegen ERST Input Buffer löschen, DANN cin.get() wenn man dieses gewünschte Verhalten haben will. cin.get Wird auch nicht auf die F1 Taste reagieren.
Chris Hunter
auch wenn mars ein arschabwisher ist, ist er mir wesentlich sympatischer als der erste kollege, der verstehtd en quelltext nömlich nach kurzer zeit auch nicht mwhe. wobei mister wish-ass (löl [wunscharsch]) ja die richtige einstellung hat und sich mit dem code auseinandersetzt.
am besten an beide mal den tip sich ne gute doku runterzuladen oder ne chm. da findet man die befehle nähmlich recht schnell und kann sie verstehen. das ist der beste weg zu lernen. sollten dabei aber fragen auftauchen kann man natürlich gerne hilfe hier suchen...
die antworten in einer doku geben meistens viel mehr hintergrundwissen als man in irgend einem forum in einer kurzen antwort mitnimmt...
daHooligan
na ja.. ich denk mal dass das rez inzwische nicht mehr wirklich interessiert... das da oben war sein einziger beitrag in diesem forum...
Chris Hunter
ja wahrscheinlich freut er sich immer noch undm kommt gar nicht zum schreiben deshalb...
Hanfling
Chris, nur er lernt dadurch nicht das wichtigste: Sich selbst mit den Sachen zu beschäftigen. Hätte er was dazu gelesen und versucht es verstehen, hätte er z.B. nebenbei einiges über Stream in C++ gelernt, etc..
Zudem zu lernen dazu bereit zu sein, etwas zu machen ist das wichtigste. Und bei so einem absolut simplen Anfängerrotz....
Aber um es mal kurz zu fassen...
langweilig, lust zu flamen?
Bei sowas wäre es ja noch ok zu fragen wie es funktioniert
(Kinder, macht das nie nach, das ist wohl die übelste printf() Funktion die ich jemals gesehen habe)
| code: |
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:
|
/* Format a string and print it on the screen, just like the libc
function printf. */
void
printf (const char *format, ...)
{
char **arg = (char **) &format;
int c;
char buf[20];
arg++;
while ((c = *format++) != 0)
{
if (c != '%')
putchar (c);
else
{
char *p;
c = *format++;
switch (c)
{
case 'd':
case 'u':
case 'x':
itoa (buf, c, *((int *) arg++));
p = buf;
goto string;
break;
case 's':
p = *arg++;
if (! p)
p = "(null)";
string:
while (*p)
putchar (*p++);
break;
default:
putchar (*((int *) arg++));
break;
}
}
}
}
|
|
(
http://www.gnu.org/software/grub/manual/...c.html#kernel.c)
p-Logic
| Zitat: |
Original von Hanfling
Chris, nur er lernt dadurch nicht das wichtigste: Sich selbst mit den Sachen zu beschäftigen. Hätte er was dazu gelesen und versucht es verstehen, hätte er z.B. nebenbei einiges über Stream in C++ gelernt, etc..
Zudem zu lernen dazu bereit zu sein, etwas zu machen ist das wichtigste. Und bei so einem absolut simplen Anfängerrotz....
|
Genau, man kann auch in einem Forum nicht erwarten dürfen, dass man alles mundgerecht reingeschoben bekommt.
Is zwar nett gemeint von mars, aber wichtiger wäre es wirklich ihm zu sagen er soll es mal mit hilfe von ner kleinen Befehlsreferenz (google?) selbst versuchen. Zumal das wirklich nur grundlegende Sachen sind.
| Zitat: |
Original von daHooligan
na ja.. ich denk mal dass das rez inzwische nicht mehr wirklich interessiert... das da oben war sein einziger beitrag in diesem forum... |
Glaub ich nicht, seh mal in seinem Profil nach wann seine letzte Aktivität war,...
Letzte Aktivität: Heute, 17:17
Er lebt noch
@rez:
"Wenn du mich hören kannst", dann schreib mal was dazu, sonst müssen wir annehmen, dass dir das jetzt wirklich egal ist...
| Zitat: |
Original von Hanfling
Bei sowas wäre es ja noch ok zu fragen wie es funktioniert
(Kinder, macht das nie nach, das ist wohl die übelste printf() Funktion die ich jemals gesehen habe)
|
Wieso? Ist doch nett!
hat rez gleich was neues zum üben!
| code: |
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:
|
/* Format a string and print it on the screen, just like the libc
function printf. */
void
printf (const char *format, ...)
{
char **arg = (char **) &format;
int c;
char buf[20];
arg++;
while ((c = *format++) != 0)
{
if (c != '%')
putchar (c);
else
{
char *p;
c = *format++;
switch (c)
{
case 'd':
case 'u':
case 'x':
itoa (buf, c, *((int *) arg++));
p = buf;
goto string;
break;
case 's':
p = *arg++;
if (! p)
p = "(null)";
string:
while (*p)
putchar (*p++);
break;
default:
putchar (*((int *) arg++));
break;
}
}
}
}
|
|
(
http://www.gnu.org/software/grub/manual/...c.html#kernel.c)
Der code ist doch mal richtig lyrisch!
Pointer fastfood!!!
Hanfling
Es hat irgendwie was, ich weiß.
Allerdings ist es nichtmal Ansatzweise imun gegen falsche Parameteranzahl. printf() mit va_* macht dann zwar komisches Zeug, aber damit würdest du vermutlich niemals hinkriegen das du auf nen falschen Speicherbereich zugreifst und dein Programm abschmiert, oder noch schlimmer wenns in ner Bibliothek ist, oder in nem eigenen OS.
gcc z.B. bietet eh ohnehin sowas wie __builtin_va_*.
Allerdings ist goto _sehr_ böse.
Abgesehen davon steht der Code im K&R nur mit va_* und ohne goto.