Laden...

Scheinbare Leerstring-Ausgabe bei Schreiben in eine Textdatei

Erstellt von OOOO vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.574 Views
OOOO Themenstarter:in
2 Beiträge seit 2014
vor 9 Jahren
Scheinbare Leerstring-Ausgabe bei Schreiben in eine Textdatei

Ich habe ein Programm zum Schreiben in eine Textdatei verfasst, es wird dort eine vorgegebene Anzahl von Random.ASCII-Zeichen in eine Datei geschrieben, es funktioniert auch:


using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;


namespace CodeGenerator
{
    class Program
    {
        
        static int GenerateRandomNumber(int min, int max)
        {
            RNGCryptoServiceProvider c = new RNGCryptoServiceProvider();
            // Ein integer benötigt 4 Byte
            byte[] randomNumber = new byte[4];
            // dann füllen wir den Array mit zufälligen Bytes
            c.GetBytes(randomNumber);
            // schließlich wandeln wir den Byte-Array in einen Integer um
            int result = Math.Abs(BitConverter.ToInt32(randomNumber, 0));
            // da bis jetzt noch keine Begrenzung der Zahlen vorgenommen wurde,
            // wird diese Begrenzung mit einer einfachen Modulo-Rechnung hinzu-
            // gefügt
            return result % max + min;
        }

        static void Main(string[] args)
        {
            Console.WriteLine("Wie lange soll das Passwort sein?");

            int leng=0;
            try
            {
                leng = Int32.Parse(Console.ReadLine());
            }
            catch (Exception ex) { Console.WriteLine("Irgendwas sitmmt mit der eingegebenen Zahl nicht.");
            Console.WriteLine("\nPress any key to continue.");
            Console.ReadKey();
                return;  }

            char[] ca = new char[leng];
            for (int i = 0; i < leng; i++)
            { //Console.WriteLine(GenerateRandomNumber(33,126)); 
                char c = (char) GenerateRandomNumber(33, 126);
                ca[i]=c;

            }
 
            using (StreamWriter file = new StreamWriter((Directory.GetCurrentDirectory()+"\\pw.txt")))
            {
                String s = new String(ca);
                file.Write(s);
            }

            Console.WriteLine("\nPress any key to continue.");
            Console.ReadKey();
        }
    }
}

...ABER: Wenn ich nun mit den Pfeiltasten durch die Ausgabe gehe (wenn ich also von links nach rechts oder umgekehrt durch durch Betätigen der Pfeiltasten mit dem Cursor von einem Zeichen zum nächsten Zeichen der Ausgabe in der Textdatei gehen will), z. B. im Falle von 3$564, dann muss ich an manchen Stellen den Pfeil (nach links bzw. nach rechts) zweimal betätigen, damit der Cursor weitergeht. Ich kann mir dieses Phänomen nicht erklären - woran könnte denn das liegen?

S
145 Beiträge seit 2013
vor 9 Jahren

Ich vermute mal durch deine autmatische Generierung kamen höchst wahrscheinlich Steuerzeichen mit in die Datei.

T
3 Beiträge seit 2014
vor 9 Jahren

Hi OOOO,

also ich bin kein Profi aber mir scheint es so als ob dein Programm Zeichen erstellt die das normale Windows Text Dokument nicht kennt. Wenn du dein Code ausführst und sagst du willst 5 Zeichen kommt es vor das es nur 4 Zeichen in der Text Datei sind und bei einem Zeichen musst du dann doppelt klicken da er intern sieht das es 2 Zeichen sind dieses aber nicht anzeigt, da er es nicht kennt. Wenn du dann die Zeichen nimmst und es noch mal in eine andere .txt Datei kopierst und speicherst und dann wieder die Datei öffnest ist an dieser Stelle das fehlende Zeichen als ? dargestellt.

Nun ich hoffe das dies zur deiner eigentlichen Lösung führt.

Gruß TiNex.

3.170 Beiträge seit 2006
vor 9 Jahren

Hallo,

Deine Modulo-Rechnung in GenerateRandomNumber tut nicht das was sie soll. Überleg mal was da für ein Wert rauskommt wenn z.B. result == (max - 1) ist.

Zudem benutzt Du einen StreamWriter, der als Standard-Encoding UTF-8 benutzt, obwohl Du eigentlich ASCII schreiben willst.
Der Bereich, in dem Du eigentlich arbeiten willst (33-125) ist zwar bei UTF-8 und ASCII identisch, aber durch die falsche Berechgnung erzeugst Du eben nicht nur diese Werte. Dadurch landen dann ungewollte Mutibyte-Zeichenfolgen in der (UTF-8 codierten) Textdatei.

Btw.: Warum benutzt Du nicht die Random-Klasse?

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

OOOO Themenstarter:in
2 Beiträge seit 2014
vor 9 Jahren

Kameraden - vielen vielen Dank für Eure Tipps!

Jetzt (nach einer Codeanpassung) scheint es zu gehen:

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;
using System;


namespace CodeGenerator
{
    class Program
    {

        static int GenerateRandomNumber(int min, int max)
        {
           
            int mi=min;
            int ma=max;
            RNGCryptoServiceProvider c = new RNGCryptoServiceProvider();
            
            // Ein integer benötigt 4 Byte
            byte[] randomNumber = new byte[4];
            
            // dann füllen wir den Array mit zufälligen Bytes
            c.GetBytes(randomNumber);
            
            // schließlich wandeln wir den Byte-Array in einen Integer um
            int result = Math.Abs(BitConverter.ToChar(randomNumber, 0))/100;

            if (result >= mi && result <= ma)
            {
                //Console.WriteLine(result); 
                return result;
            }
         
            return GenerateRandomNumber(mi,ma); 
            
        }

      
        static void Main(string[] args)
        {
            Console.WriteLine("Wie lange soll das Passwort sein?");

            int leng = 0;
            try
            {
                leng = Int32.Parse(Console.ReadLine());
            }
            catch (Exception ex)
            {
                Console.WriteLine("Irgendwas sitmmt mit der eingegebenen Zahl nicht.");
                Console.WriteLine("\nPress any key to continue.");
                Console.ReadKey();
                return;
            }

            char[] ca = new char[leng];
            for (int i = 0; i < leng; i++)
            { //Console.WriteLine(GenerateRandomNumber(33,126)); 

                     char c= (char) GenerateRandomNumber(33, 126);
                     ca[i] = (char) c;

            }

            using (StreamWriter file = new StreamWriter((Directory.GetCurrentDirectory() + "\\pw.txt")))
            {
                String s = new String(ca);
                file.Write(s);
                
            }

            Console.WriteLine("\nPress any key to continue.");
            Console.ReadKey();
        }
    }
}