Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

  • »problemlöser64« ist der Autor dieses Themas

Beiträge: 20

Beruf: Schüler informationstechnisches Gymnasium

  • Private Nachricht senden

1

13.10.2010, 16:03

C++ Die mit fread() ausgelesenen Zeichen mit printf() anzeigen lassen

Hallo, ich will per fread aus einer Datei auslesen, und zwar 10 Zeichen. Mein Ansatz dazu:

C-/C++-Quelltext

1
2
3
char buffer[10]; 
fread(buffer, 10, 1, pDatei); 
printf(buffer);


doch jetzt zeigt es die 10 Zeichen aus der Datei an und dannach noch irgendwelche Kryptozeichen. Diese Kryptozeichen,

also irgendwelche aus dem ASCI-Satz, hätte ich gerne weg. Wieso gibt printf mehr aus bzw. wie kann ich das verhindern?

2

13.10.2010, 16:10

Hallo problemlöser64,

schau dir die Funktion fread noch mal etwas genauer an.

Der zweite Parameter gibt die Größe (in Bytes) der zu lesenden Elemente an und der dritte Parameter die Anzahl der Elemente. Du liest also 1 Zeichen aus mit einer Größe von 10 Bytes... was du aber willst ist genau das Gegenteil: 10 Zeichen von der Größe 1Byte.

Gruß
SaRu_

  • »problemlöser64« ist der Autor dieses Themas

Beiträge: 20

Beruf: Schüler informationstechnisches Gymnasium

  • Private Nachricht senden

3

13.10.2010, 16:19

OK, du hast recht, jetzt habe ich die beiden Parameter vertauscht, also:

C-/C++-Quelltext

1
2
3
char buffer[10];
fread(buffer, 1, 10, pDatei); 
printf(buffer);


Nur leider hat sich nichts verändert. Es werden immer noch irgendwelche Kryptozeichen mitangezeigt.

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

4

13.10.2010, 16:21

http://www.cplusplus.com/reference/clibrary/cstdio/printf/
Folgendes:

C-/C++-Quelltext

1
printf("%s",buffer);

müsste es doch sein, oder?

EDIT: ansonsten http://www.cplusplus.com/reference/clibrary/cstdio/puts/

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

MCP

Alter Hase

Beiträge: 513

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

5

13.10.2010, 16:24

Mach den Buffer etwas größer, lies trotzdem weiter 10 Zeichen ein und häng ein '\0' an buffer[10]:

C-/C++-Quelltext

1
2
3
4
char buffer[11];
fread(buffer, 1, 10, pDatei);
buffer[10] = '\0';
printf(buffer);


Was passiert jetzt?

  • »problemlöser64« ist der Autor dieses Themas

Beiträge: 20

Beruf: Schüler informationstechnisches Gymnasium

  • Private Nachricht senden

6

13.10.2010, 16:30

Cool, das mit dem angehängten \0 hat funktioniert. Was ist das für ein ASCI-Zeichen? Ist das das $-Zeichen?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

7

13.10.2010, 16:40

zu solltest deine einführung zu den c-strings nochmal lesen. das '\0' ist die nullterminierung die zeigt, dass der string zuende ist. bei dir wurde der speicherbereich hinter dem reservierten bereich gelesen. das sind zufällige bitfolgen die natürlich keinen sinn ergeben.

edit:
*zeilenumbruch '\n' durch richtiges zeichen '\0' ersetzt. danke BurningWave^^
ich hab noch nie '\0' benutzt(weil man es in c++ einfach nicht brauch). deshalb hab ichs wohl verwechselt^^
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (13.10.2010, 18:51)


  • »problemlöser64« ist der Autor dieses Themas

Beiträge: 20

Beruf: Schüler informationstechnisches Gymnasium

  • Private Nachricht senden

8

13.10.2010, 16:50

So was hab ich sehr stark vermutet, dass es mehr liest, als ich will. Und was steht dann da im Speicher, an der Stelle, an der der String aufhört, also beim \0?

  • »problemlöser64« ist der Autor dieses Themas

Beiträge: 20

Beruf: Schüler informationstechnisches Gymnasium

  • Private Nachricht senden

9

13.10.2010, 17:06

Ah, ich habs rausgefunden, danke für eure Antworten!

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

10

13.10.2010, 17:49

zu solltest deine einführung zu den c-strings nochmal lesen. das '\n' ist die nullterminierung die zeigt, dass der string zuende ist. bei dir wurde der speicherbereich hinter dem reservierten bereich gelesen. das sind zufällige bitfolgen die natürlich keinen sinn ergeben.


Mit '\n' meint NachoMan wohl '\0' ('\n' erzeugt einen Zeilenumbruch) ;)

'\0' entspricht einfach 0x00.

Werbeanzeige