Ofstream will keinen String ausgeben :(

06/29/2015 14:11 KingwondA#1
Hey, ich versuche zur Zeit mein "random" Passwort in einer .txt Datei ausgeben zu lassen, dass will aber einfach nicht passieren.
Ich hab schon mehrere Methoden versucht aber keine hat mir geholfen.
Die Methode die ihr jetzt im Code sehen werdet war die Letzte, die ich versucht hab.
Code:
Code:
#include <iostream>
#include <Windows.h>
#include <string>
#include <cmath>
#include <fstream>

#pragma comment(lib, "winmm.lib")

int main()
{
	static const TCHAR* myTitle = TEXT("Passwort-Generator");
	SetConsoleTitle(myTitle);

	char  Buchstaben[] = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789";
	std::string Passwort;
	int laenge;
	int erstelle;
	int x = 0;
	srand(timeGetTime()); // Seed für "rand()", basierend auf der aktuellen Zeit

	std::cout << "Wie lang soll das Passwort werden: ";
	std::cin >> laenge;

	std::cout << "Wie viele Passwoerter sollen erstellt werden: ";
	std::cin >> erstelle;

	for (int j = 0; j < erstelle; j++)
	{
		for (int i = 0; i < laenge; i++)
		{

			Passwort += Buchstaben[rand() % (sizeof(Buchstaben))];

		}
		std::cout << Passwort << "\n";
		Passwort = "";

		// Datei öffnen und Passwörter reinschreiben
		std::ofstream schreiben;
		schreiben.open("Test.txt", std::ios::binary);
		schreiben << Passwort;
		schreiben.close();

	}



	getchar();
	return 0;
}
Oh^^
Mir fällt grad auf, dass es nicht sinnvoll wäre die
Code:
std::ofstream schreiben;
in der Schleife zu lassen.
06/29/2015 15:25 th0rex#2
Du setzt das Passwort auf "", bevor du es ausgibst.
06/29/2015 15:37 KingwondA#3
Quote:
Originally Posted by C0untLizzi View Post
Du setzt das Passwort auf "", bevor du es ausgibst.
Hab das mal verschoben und nun klappt es, allerdings wird nur 1 Passwort reingeschrieben, nähmlich das Letzte welches erstellt wird.
06/29/2015 16:05 th0rex#4
Liegt daran, dass du den stream immer neu erstellst und die Datei dadurch immer überschrieben wird.Wenn du den Mode beim öffnen auch noch auf app (=append) setzt, sollte das so klappen. Oder du öffnest den Stream vor der Schleife und schließt in danach.
06/29/2015 20:50 KingwondA#5
Sooooo fast geschaft :D
Nur der Zeilenumbruch macht mir zu schaffen -.-
Weil in der .txt Datei schaut es nun so aus:
Hier der Aktuelle Code:
Code:
#include <iostream>
#include <Windows.h>
#include <string>
#include <cmath>
#include <fstream>

#pragma comment(lib, "winmm.lib")

int main()
{
	static const TCHAR* myTitle = TEXT("Passwort-Generator");
	SetConsoleTitle(myTitle);

	std::ofstream schreiben;

	char  Buchstaben[] = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789";
	std::string Passwort;
	int laenge;
	int erstelle;
	int x = 0;
	srand(timeGetTime()); // Seed für "rand()", basierend auf der aktuellen Zeit

	std::cout << "Wie lang soll das Passwort werden: ";
	std::cin >> laenge;

	std::cout << "Wie viele Passwoerter sollen erstellt werden: ";
	std::cin >> erstelle;

	schreiben.open("Test.txt", std::ios::app| std::ios::out);

	for (int j = 0; j < erstelle; j++)
	{
		for (int i = 0; i < laenge; i++)
		{

			Passwort += Buchstaben[rand() % (sizeof(Buchstaben))];

		// Datei schreiben
		schreiben << Passwort << (char)0x0D << (char)0x0A;

		}
		std::cout << Passwort << "\n";
		Passwort = "";

	}
		schreiben.close();

	getchar();
	getchar();
	getchar();
	getchar();
	return 0;
}
06/29/2015 21:06 th0rex#6
Schreib die Variable Passwort einfach nach der inneren For Schleife in die Datei. Also da, wo du sie in der Konsole ausgibst. Ein "\n" oder "\r\n" danach in die Datei zu schreiben ( oder halt std::endl, wenn du den Stream auch noch flushen willst) sollte dann reichen.
06/29/2015 21:18 KingwondA#7
Quote:
Originally Posted by C0untLizzi View Post
Schreib die Variable Passwort einfach nach der inneren For Schleife in die Datei. Also da, wo du sie in der Konsole ausgibst. Ein "\n" oder "\r\n" danach in die Datei zu schreiben ( oder halt std::endl, wenn du den Stream auch noch flushen willst) sollte dann reichen.
Danke für die Hilfe klappt nun einwandfrei :)
#closerequest
06/29/2015 21:25 snow#8
Noch als Tipp:

1) RAII nutzen. Du musst std::ofstream::close() nicht aufrufen, das wird im Destruktor aufgerufen. Die Password-Variable erst in der for-Loop deklarieren.
2) Konstruktor nutzen. Wenn es keinen Grund dafür gibt, die Datei erst später zu öffnen, kannst du Dateinamen + Flags direkt beim Deklarieren übergeben und die Datei wird automatisch geöffnet.
3) <random> verwenden statt rand()

#closed (on request)