Problem beim Schreiben in Datei(Sonderzeichen)
-
Hallo, ich habe ein LottoGenerator geschrieben. Der generiert einfach alle 14 Millionen Kombinationen und soll diese einfach in eine Datei schreiben, dabei soll er eine Kombination in eine Zeile schreiben. Das komische ist, bei mir macht er alles aber er schreibt Sonderzeichen in die Datei. Momentan hab ich es hingekriegt aber es ist TOTAL langsam, bei den Sonderzeichen geht er richtig ab, da war es mit fopen. und jetzt mach ich es mit ofstream und schreiben in die datei mit dem << Operator. Ich weiss nicht weiter. Hier der Code:
#include <iostream> #include <fstream> using namespace std; void main() { FILE* ziel; ziel = fopen("lotto.txt", "wb+"); char* kombi[12]; char leer = ' '; char nwline = '\n'; for(int i = 1; i <= 49; i++) { for(int j = i+1; j <= 49; j++) { for(int k = j+1; k <= 49; k++) { for(int l = k+1; l <= 49; l++) { for(int m = l+1; m <= 49; m++) { for(int n = m+1; n <= 49; n++) { kombi[0] = (char*)i; kombi[1] = (char*)leer; kombi[2] = (char*)j; kombi[3] = (char*)leer; kombi[4] = (char*)k; kombi[5] = (char*)leer; kombi[6] = (char*)l; kombi[7] = (char*)leer; kombi[8] = (char*)m; kombi[9] = (char*)leer; kombi[10] = (char*)n; kombi[11] = (char*)nwline; fwrite(kombi,1,12,ziel); } } } } } } fclose(ziel); }
Also:
Nr.1 er generiert problemlos die lotto.txt und schreibt auch ultraschnell in die Datei. Er schreibt auch 6 Zeichen pro Zeile, aber nur Müll, anscheinend irgendwelch Steuerzeichen oder so.
Nr.2 er macht kein Newline nach der sechsten Zahl/Zeichen.
Aber Nr.1 ist am wichtigsten. Woran könnte das liegen das er diese komischen Zeichen macht. Diese Zeichen sind kleine quadrate, sonst nichts, manchmal kommen auch Sonderzeichen vor, daher denke ich der macht irgendwie ASCII Code oder so. Aber normalerweise müsste er ganz normal die integer Zahlen als char hinschreiben. Also die erste Zeile in der Datei müsste so aussehen: "1 2 3 4 5 6". dann die zweite "1 2 3 4 5 7", aber es sieht eher so aus: "[] [] [] [] [] []".
Bidde helft mir!
-
#include <iostream> #include <fstream> using namespace std; void main() { ofstream ziel; ziel.open("lotto.txt", ios::out); string kombi[12]; char buffer[1],leer = ' '; for(int i = 1; i <= 10; i++) { for(int j=1; j <= 10; j++) { for(int n=1; n <= 10; n++) { kombi[0] = itoa(i,buffer,10); kombi[1] = leer; kombi[2] = itoa(j,buffer,10); kombi[3] = leer; kombi[4] = itoa(n,buffer,10); kombi[5] = "\n"; for (int z=0;z<6;z++) { ziel.put(kombi[z][0]); if (kombi[z][0] != '\n') { ziel.put(kombi[z][1]); } } } } } ziel.close(); }
Mach was draus
PS: Hab die Schleifenanzahl nur veringert, damits ned zu gross hier wird
-
Da du die Datei binar schreibst ist es kein wunder das du "komische Zeichen siehst", probiers mal
damitfprintf(stream,"%2.2i %2.2i %2.2i %2.2i %2.2i %2.2i\n",i,j,k,l,m,n);
anstelle deines Blocks
kombi[0] = (char*)i; .... fwrite(kombi,1,12,ziel);
@Majenga
Dein Code geht in die Hose, da die Lottozahlen zumindest schon mal mit Schwerpunkt 2 stellig sind,
es sind aber noch andere Probleme eingebaut.
-
Majenga schrieb:
#include <iostream> #include <fstream> using namespace std; void main() { ofstream ziel; ziel.open("lotto.txt", ios::out); string kombi[12]; char buffer[1],leer = ' '; for(int i = 1; i <= 10; i++) { for(int j=1; j <= 10; j++) { for(int n=1; n <= 10; n++) { kombi[0] = itoa(i,buffer,10); kombi[1] = leer; kombi[2] = itoa(j,buffer,10); kombi[3] = leer; kombi[4] = itoa(n,buffer,10); kombi[5] = "\n"; for (int z=0;z<6;z++) { ziel.put(kombi[z][0]); if (kombi[z][0] != '\n') { ziel.put(kombi[z][1]); } } } } } ziel.close(); }
Mach was draus
PS: Hab die Schleifenanzahl nur veringert, damits ned zu gorss hier wird
Wie soll das denn gehen? Du deklarierst den kombi als eindimensionales Feld und behandelst ihn dann unten als zweidimensionales. Entweder ist das falsch, oder du nutzt eine Technik die mir gänzlich unbekannt ist. Geht das so überhaupt?
-
er arbeitet mit string, also ein feld von strings..
string test [4]= { "elise", "betti", "muster", "mann"}; for ( int i=0; i<4; i++) for ( int j=0; j<test[i].length(); j++) cout << test[i][j]<<"\n";
-
Damit greife ich auf ein Zeichen in dem String im Feld zu ^^
also:
string text[10];
text[0] = "test";
char blubb = text[0][2];
cout << blubb;blubb bekommt 'x' zugewiesen.
PS: Copy paste meinen Code..
Bei mir geht er 1 zu 1 wie er da steht...Dann noch die 3 fehlenden Schleifen wieder einfügen und statt 10 bis 49 zählen lasen. Sollte ebenso klappen.
-
Cool, danke sehr. Wisst ihr vielleicht ne Seite wo ich all die Befehle in C++ mal nachschlagen kann. Ich finde nur Seiten bei denen die wichtigen Klassen erklärt sind. Also eine Seite bei dem einfach jede Klasse aus C++ erklärt ist. Sun Microsystems bietet doch eine riesen Referenz Seite für die Java Klassen, sowas ähnliches suche ich für C++.
Weil ich dieses "itoa" gar nicht kenne, wenn ich mich recht erinnere ist das doch sowas wie eine Art Typumwandlung (Cast).
-
Majenga schrieb:
Damit greife ich auf ein Zeichen in dem String im Feld zu ^^
also:
string text[10];
text[0] = "test";
char blubb = text[0][2];
cout << blubb;blubb bekommt 'x' zugewiesen.
PS: Copy paste meinen Code..
Bei mir geht er 1 zu 1 wie er da steht...Dann noch die 3 fehlenden Schleifen wieder einfügen und statt 10 bis 49 zählen lasen. Sollte ebenso klappen.
Jo Majenga, bei mir ist das Problem nun das er die Apostrophen anscheinend nicht ganz kapiert. also die ausgabe sieht so aus: 1[] []2[] []3[] []4[] []5..... Diese eckigen Klammer musst du als Quadrate ansehen, das sind Zeichen die z.B. Newline Zeichen sein können und vom Notepad nicht erkannt werden, aber das sind in diesem Falle nur leerzeichen, und noch nicht mal Microsoft Word kann das erkennen, ich glaube das liegt am ' ' , also am Apostrophen. Ich schaffs nicht die wegzukriegen. Ich muss ja die Leerzeichen als char übergeben. Der Fehler muss irgendwo bei dieser kleinen Schleife bei der z hochgezählt wird liegen. Woran könnte das genau liegen. Danke nochmal für deine Mühe, sonst klappt alles.
-
Warum denn mit char?
#include <iostream> #include <fstream> using namespace std; void main() { fstream ziel("lotto.txt", ios::out|ios::trunc); for(int i = 1; i <= 49; i++) { for(int j = i+1; j <= 49; j++) { for(int k = j+1; k <= 49; k++) { for(int l = k+1; l <= 49; l++) { for(int m = l+1; m <= 49; m++) { for(int n = m+1; n <= 49; n++) { ziel << i << " " << j << " " << k << " " << l << " " << m << " " << n << endl; } } } } } } ziel.close(); }
-
00Wotan schrieb:
Warum denn mit char?
#include <iostream> #include <fstream> using namespace std; void main() { fstream ziel("lotto.txt", ios::out|ios::trunc); for(int i = 1; i <= 49; i++) { for(int j = i+1; j <= 49; j++) { for(int k = j+1; k <= 49; k++) { for(int l = k+1; l <= 49; l++) { for(int m = l+1; m <= 49; m++) { for(int n = m+1; n <= 49; n++) { ziel << i << " " << j << " " << k << " " << l << " " << m << " " << n << endl; } } } } } } ziel.close(); }
Kenn ich schon, das ist toottaaaaalll langsam. Bei diesem Lottoprogramm wird die txt datei 230 MB gross. Was meinst du wie lang ich da warten muss wenn er nur ein paar Kilobytes pro Sekunde reinhaut. Das muss doch schneller gehen.
-
Probier doch mal anstelle von
ziel << i << " " << j << " " << k << " "
<< l << " " << m << " " << n << endl;fprintf(stream,"%2.2i %2.2i %2.2i %2.2i %2.2i %2.2i\n",i,j,k,l,m,n);
könnte schneller sein