ZeroMemory und fread



  • nabend!

    hab eben was komisches bemerkt ...

    datei=fopen("test.txt","rt");
    
      char zeichen[5];
      ZeroMemory(zeichen, sizeof(zeichen));
    
      fread(zeichen , 1 ,5 , datei);
      if (NULL == strcmp(zeichen , "numme"))
      cout<<zeichen<<endl;
    

    ich öffne meine textdatei, in der steht "nummer 1 2 3 4 ", nur zum test 😉

    mein array umfasst 5 elemente.
    diese will ich alle löschen, damit nix unsinniges drin steht.
    dann les ich aus meiner datei genau 5 zeichen und vergleiche diese. -> der vergleich misslingt.
    warum? ... mein versuch: ich lasse ZeroMemory weg und schreibe:

    strcpy(zeichen, "     ");
    

    und siehe da, es klappt.

    logische schlußfolgerung: ZeroMemory tut nicht das selbe wie mein strcpy.

    weiterer versuch: ich schreibe

    ZeroMemory(zeichen, sizeof(zeichen)+1);
    

    und alles funktioniert bestens .... 😕 😮 😕 😮

    wieso das ?!



  • Es steht keine 0 an letzter Stelle. fread() schreibt keine 0 und du lässt zwar ZeroMemory überall 0 hinschreiben, aber fread() überschreibt alle 5 felder wieder...

    Dein 'Test' mit strcpy erzeugt undefiniertes verhalten, weil du 6 Elemente in das Array schreibst. Die 0 am Ende überlebt zufällig und du hast die erwarteten ergebnisse...

    Einfach deine ursprüngliche Version nehmen und das Array um 1 vergrößern.



  • also versteh ich dich richtig, dass ein string immer folgendermaßen zusammengesetzt ist:

    buchstaben xy bla bla + 0 ?

    nimmt die null also eine "endstellung" ein?



  • SirNoname schrieb:

    nimmt die null also eine "endstellung" ein?

    Ja.
    0 zeigt an, dass der String jetzt aus ist.
    "hallo" == {'h', 'a', 'l', 'l', 'o', 0}



  • alles klar, wieder was dazu gelernt 😃 😃 😃

    DANKE und schön abend / nacht noch ... ^^

    (hab das mit der null schonmal irgendwo gelesen, war mir jetzt nur nicht sicher 🙄 )


Anmelden zum Antworten