C Tutorial - Smileys mit fread()
C Tutorial - Smileys mit fread()
Hallo, im C-Tutorial "Eine Datei in den Speicher kopieren" bekomme ich bei der verkürzten Version, die nicht den ganzen Speicher der Datei alloziiert, Smileys in 2er Blöcken in die Konsole.
Ich habe das Programm mittels MinGW mit gcc auf nem Win 8 Rechner compiliert.
Konnte es bisher noch nicht auf nem echtem Linux probieren.
Das passiert sowohl in dem MinGW Terminal, das ich benutze, als auch in der DOS Box und der PowerShell Konsole.
Sieht ungefähr so aus:
ha☻ll☻o ☻pr☻og☻ge☻n.☻or☻g
☻
Habe auch versucht, den Quelltext so wie er ist raus zu kopieren, um Fehler zu verhindern. Kommt aber das gleiche.
Hat das Problem noch jemand und was passiert da eigentlich genau?
Danke.
Ich habe das Programm mittels MinGW mit gcc auf nem Win 8 Rechner compiliert.
Konnte es bisher noch nicht auf nem echtem Linux probieren.
Das passiert sowohl in dem MinGW Terminal, das ich benutze, als auch in der DOS Box und der PowerShell Konsole.
Sieht ungefähr so aus:
ha☻ll☻o ☻pr☻og☻ge☻n.☻or☻g
☻
Habe auch versucht, den Quelltext so wie er ist raus zu kopieren, um Fehler zu verhindern. Kommt aber das gleiche.
Hat das Problem noch jemand und was passiert da eigentlich genau?
Danke.
- cloidnerux
- Moderator
- Beiträge: 3125
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: C Tutorial - Smileys mit fread()
Hi und Willkommen im Forum
Bitte mal deinen Source-Code her angeben, damit man das testen kann.
Ansonsten bleibt und nur raten übrig.

Bitte mal deinen Source-Code her angeben, damit man das testen kann.
Ansonsten bleibt und nur raten übrig.
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
Re: C Tutorial - Smileys mit fread()
Hallo,
sorry, ich dachte, meine Beschreibung sei eindeutig.
Weiß jetzt nicht, wie ich es anders formulieren soll.
Ich habe den Sourcecode aus dem Abschnitt "Eine Datei in den Speicher kopieren" des C-Tutorials genommen, ihn in eine Datei file05.c kopiert, im MinGW Terminal "gcc -o file05 file05.c" eingegeben, die exe ausgeführt und das kam raus.
Hier nochmal der Quellcode:
Was jetzt noch komischer ist:
ich habe die exe - Datei in Dropbox kopiert, um sie zu Hause auf meinem Rechner unter Win 7 zu testen. Jetzt schlägt Avira Alarm, ich hätte da einen "HEUR/APC (Cloud)" Virus drin.
Der Win 8 Rechner auf der Arbeit ist relativ frisch installiert und ein Arbeitsrechner mit Antivirenprogramm. Das Programm habe ich selbst kompiliert.
Hat mir Dropbox da jetzt nen Virus untergejubelt?
sorry, ich dachte, meine Beschreibung sei eindeutig.
Weiß jetzt nicht, wie ich es anders formulieren soll.
Ich habe den Sourcecode aus dem Abschnitt "Eine Datei in den Speicher kopieren" des C-Tutorials genommen, ihn in eine Datei file05.c kopiert, im MinGW Terminal "gcc -o file05 file05.c" eingegeben, die exe ausgeführt und das kam raus.
Hier nochmal der Quellcode:
Code: Alles auswählen
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
FILE *file = fopen("datei.txt", "a+");
if( file )
{
long int read;
char buffer[2];
while(( read = fread( buffer, sizeof( char ), 2, file ) ))
printf( "%*s", read, buffer );
printf( "\n" );
fclose(file);
}
else
printf( "Datei konnte nicht geöffnet werden.\n" );
return EXIT_SUCCESS;
}
Was jetzt noch komischer ist:
ich habe die exe - Datei in Dropbox kopiert, um sie zu Hause auf meinem Rechner unter Win 7 zu testen. Jetzt schlägt Avira Alarm, ich hätte da einen "HEUR/APC (Cloud)" Virus drin.
Der Win 8 Rechner auf der Arbeit ist relativ frisch installiert und ein Arbeitsrechner mit Antivirenprogramm. Das Programm habe ich selbst kompiliert.
Hat mir Dropbox da jetzt nen Virus untergejubelt?
- cloidnerux
- Moderator
- Beiträge: 3125
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: C Tutorial - Smileys mit fread()
Avira dazu:ich habe die exe - Datei in Dropbox kopiert, um sie zu Hause auf meinem Rechner unter Win 7 zu testen. Jetzt schlägt Avira Alarm, ich hätte da einen "HEUR/APC (Cloud)" Virus drin.
http://www.avira.com/de/support-threats ... 5/tlang/de
Deine Programme, vor allem wenn sie Pointer inkorrekt (aus)nutzen, können als Virus erkannt werden, aufgrund ihres Verhaltens.
Zur not aber einfach nochmal lokal compilieren.
Dein Sourcecode sieht korrekt aus.
Was nicht korrekt funktioniert ist:
Code: Alles auswählen
printf("%*s", read, buffer);
Der Workaround:
Code: Alles auswählen
if( file )
{
long int read;
char buffer[3]; //1 Byte mehr für das Null-Byte reservieren
buffer[2] = '\0'; //Null-Byte auch wirklich auf 0 setzten
while(( read = fread( buffer, sizeof( char ), 2, file ) )) //Datei lesen
{
printf( "%s", buffer ); //Ausgeben
memset(buffer, 0, 3); //Buffer wieder komplett auf 0 setzten, damit keine Artefakte entstehen
}
printf( "\n" );
fclose(file);
}
Ich habe aber gerade die Vermutung, dass deine Textdatei falsch sein könnte.
Dein Terminal Akzeptiert 8-Bit ASCII(UTF-8) Zeichen.
Wenn dein Texteditor aber mehr kann und dein Text als UTF-16 oder ähnlich gespeichert hat, dann ist es erklärlich warum dein Text nicht richtig gelesen wird.
Mit welchem Programm hast du die Textdatei erstellt, welches Zeichenformat wurde benutzt?
Edit 2: @Xin
Gibt es hier egt kein durchgestrichen?
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
Re: C Tutorial - Smileys mit fread()
Hallo cloidnerux,
vielen Dank für die Infos.
Also mit der Aussage "mein Quellcode" kann ich nicht wirklich leben, denn der Quellcode stammt ja von dem Tutorial Schreiber
Was mir aber bis auf ein paar Ausnahmen sehr gut gefällt.
Deine Erklärung klingt ziemlich gut. Denke mittlerweile auch, dass es an meiner Textdatei liegen muss.
Hab die bestehende exe jetzt noch mal unter WINE probiert, hier kommen auch komische Zeichen.
Dann hab ich das Ganze nochmal raus kopiert und unter meinem Linux compiliert, da kommen Klammeraffen.
Meine Textdatei hab ich wie viele der Quellcodes auch unter besagtem Win 8 mit einem frisch installiertem und upgedatetem Notepadd++ erstellt, ohne an den Einstellungen etwas zu ändern.
Muss ich am Montag mal nachsehen, was da Standardmäßig für ein Format eingestellt ist.
Jedenfalls hab ich sowohl unter dem MinGW auf der Arbeit als auch hier unter Linux die Datei mittels cat anzeigen lassen und da kommt der Text ganz normal.
Aber zufrieden bin ich noch nicht. Ich habe jetzt mal mit Kate eine neue Textdatei erzeugt, das heraus kopierte Programm neu compiliert und siehe da, auch mit der unter Linux erzeugten Datei kommen Klammeraffen in die Ausgabe.
(Und nebenbei bemerkt auch eine Warnung bezüglich zweier long ints wo nur ints sein dürften.)
Auffällig ist halt, dass die Zeichen alle 2 Bytes kommen und unser Buffer halt nur 2 char groß ist. Oder sollte das der Anschauungseffekt des Programms sein?
Edit:
Ok, danke. Das muss ich mir nochmal durch den Kopf gehen lassen
Allerdings kommt die Ausgabe auch unter Linux (Ubuntu 14.04, 64bit) und somit ist das kein Windows Fehler (Zumal es da ja auch mit gcc compiliert worden ist). Vielleicht könntest du diesen Teil im Tutorial nochmal ausführlicher erklären? Kann mir nicht vorstellen, dass ich da der Einzige sein soll, der da komische Zeichen hat.
vielen Dank für die Infos.
Also mit der Aussage "mein Quellcode" kann ich nicht wirklich leben, denn der Quellcode stammt ja von dem Tutorial Schreiber

Deine Erklärung klingt ziemlich gut. Denke mittlerweile auch, dass es an meiner Textdatei liegen muss.
Hab die bestehende exe jetzt noch mal unter WINE probiert, hier kommen auch komische Zeichen.
Dann hab ich das Ganze nochmal raus kopiert und unter meinem Linux compiliert, da kommen Klammeraffen.
Meine Textdatei hab ich wie viele der Quellcodes auch unter besagtem Win 8 mit einem frisch installiertem und upgedatetem Notepadd++ erstellt, ohne an den Einstellungen etwas zu ändern.
Muss ich am Montag mal nachsehen, was da Standardmäßig für ein Format eingestellt ist.
Jedenfalls hab ich sowohl unter dem MinGW auf der Arbeit als auch hier unter Linux die Datei mittels cat anzeigen lassen und da kommt der Text ganz normal.
Aber zufrieden bin ich noch nicht. Ich habe jetzt mal mit Kate eine neue Textdatei erzeugt, das heraus kopierte Programm neu compiliert und siehe da, auch mit der unter Linux erzeugten Datei kommen Klammeraffen in die Ausgabe.
(Und nebenbei bemerkt auch eine Warnung bezüglich zweier long ints wo nur ints sein dürften.)
Auffällig ist halt, dass die Zeichen alle 2 Bytes kommen und unser Buffer halt nur 2 char groß ist. Oder sollte das der Anschauungseffekt des Programms sein?
Edit:
Ok, danke. Das muss ich mir nochmal durch den Kopf gehen lassen

Allerdings kommt die Ausgabe auch unter Linux (Ubuntu 14.04, 64bit) und somit ist das kein Windows Fehler (Zumal es da ja auch mit gcc compiliert worden ist). Vielleicht könntest du diesen Teil im Tutorial nochmal ausführlicher erklären? Kann mir nicht vorstellen, dass ich da der Einzige sein soll, der da komische Zeichen hat.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: C Tutorial - Smileys mit fread()
Ich glaube Avira liegt hier nicht ganz verkehrt.... der Quelltext ist falsch. Ich habe ihn im Tutorial bereits geändert.
Bitte ändere folgendes:
und bitte gib mal Deine Datei 'datei.txt' unter Linux auf die Konsole aus:
Wenn das bei Dir anders aussieht, bitte sagen 
Bitte ändere folgendes:
Code: Alles auswählen
FILE *file = fopen("datei.txt", "a+");
zu
FILE *file = fopen("datei.txt", "r");
Code: Alles auswählen
xin@prgn:~$ hd datei.txt
00000000 48 61 6c 6c 6f 20 70 72 6f 67 67 65 6e 2e 6f 72 |Hallo proggen.or|
00000010 67 0a |g.|
00000012

Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
- cloidnerux
- Moderator
- Beiträge: 3125
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: C Tutorial - Smileys mit fread()
Das hat bei mir nicht geholfen, da printf die Längenangabe des Strings einfach ignoriert.Bitte ändere folgendes:
zuCode: Alles auswählen
FILE *file = fopen("datei.txt", "a+");
Code: Alles auswählen
FILE *file = fopen("datei.txt", "r");
Die selbe Ausgabe mit den Smilies kommt auch bei folgendem Code:
Code: Alles auswählen
while(( read = fread( buffer, sizeof( char ), 2, file ) ))
printf( "%*s", 0, buffer );
Es liegt am printf, siehe mein Edit:Edit:
Ok, danke. Das muss ich mir nochmal durch den Kopf gehen lassen![]()
Allerdings kommt die Ausgabe auch unter Linux (Ubuntu 14.04, 64bit) und somit ist das kein Windows Fehler (Zumal es da ja auch mit gcc compiliert worden ist). Vielleicht könntest du diesen Teil im Tutorial nochmal ausführlicher erklären? Kann mir nicht vorstellen, dass ich da der Einzige sein soll, der da komische Zeichen hat.
Und nochmal die Frage an Xin, kann man im Forum was durchstreichen?cloidnerux hat geschrieben:Was nicht korrekt funktioniert ist:Der Formatstring "%*s" soll bedeuten, dass ein String ausgegeben wird, dessen Länge in dem Argument vor dem String angegeben ist(read). Unter Windows wird es schlichtweg ignoriert und es wird so lange string ausgegeben, bis ein Null-Byte(0, '\0') kommt, daher kommen die Lustigen Smilies alle 3 Zeichen und die Warnung deines Virenwächters, weil dein Programm über die Grenzen eines Arrays hinaus liest.Code: Alles auswählen
printf("%*s", read, buffer);
Der Workaround:Code: Alles auswählen
if( file ) { long int read; char buffer[3]; //1 Byte mehr für das Null-Byte reservieren buffer[2] = '\0'; //Null-Byte auch wirklich auf 0 setzten while(( read = fread( buffer, sizeof( char ), 2, file ) )) //Datei lesen { printf( "%s", buffer ); //Ausgeben memset(buffer, 0, 3); //Buffer wieder komplett auf 0 setzten, damit keine Artefakte entstehen } printf( "\n" ); fclose(file); }
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: C Tutorial - Smileys mit fread()
Ich habe das unter Linux ausprobiert und das Programm mit "a+" ergibt keinen Sinn und funktioniert auch nicht.cloidnerux hat geschrieben:Das hat bei mir nicht geholfen, da printf die Längenangabe des Strings einfach ignoriert.
Die selbe Ausgabe mit den Smilies kommt auch bei folgendem Code:Win 7 74-Bit, GCC 4.8.1Code: Alles auswählen
while(( read = fread( buffer, sizeof( char ), 2, file ) )) printf( "%*s", 0, buffer );
Ich kann mir nicht vorstellen, dass Windows da einen anderen "Standard" hat - ausprobiert habe ich es jetzt aber noch nicht...
Bisher nicht.cloidnerux hat geschrieben:Und nochmal die Frage an Xin, kann man im Forum was durchstreichen?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
- cloidnerux
- Moderator
- Beiträge: 3125
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: C Tutorial - Smileys mit fread()
Bei mir macht es keinen unterschied ob "a+" oder "r".Ich habe das unter Linux ausprobiert und das Programm mit "a+" ergibt keinen Sinn und funktioniert auch nicht.
Ich hab es gerade auch mal unter Fedora getestet mit GCC 4.8.3, da macht es auch keinen unterschied ob "a+" oder "r", das Ergebnis ist das selbe.
Es scheint, als ob es das Sternchen für die längen angabe so nicht gibt.Ich kann mir nicht vorstellen, dass Windows da einen anderen "Standard" hat - ausprobiert habe ich es jetzt aber noch nicht...
Auch nochmal unter Fedora getestet mit
Code: Alles auswählen
printf("%*s", 0, buffer);
Wenn ich aber wieder buffer auf 3 Elemente erhöhe und das dritte Element auf 0 setzte, funktioniert es, bis auf das Artefakt bei ungerader anzahl Zeichen.
Wollen wir das mal einführen?Bisher nicht.
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
- cloidnerux
- Moderator
- Beiträge: 3125
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: C Tutorial - Smileys mit fread()
Und hier die Lösung des ganzen: Der Format string ist Falsch.
Im Tutorial heißt es:
Es muss aber heißen:
Es fehlt der Punkt vor dem Sternchen um die Längenangabe zu aktivieren, getestet unter Win 7 und Fedora 20.
Im Tutorial heißt es:
Code: Alles auswählen
while(( read = fread( buffer, sizeof( char ), 2, file ) ))
printf( "%*s", read, buffer );
Code: Alles auswählen
while(( read = fread( buffer, sizeof( char ), 2, file ) ))
printf( "%.*s", read, buffer );
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum