Servus
Ich habe mehr oder weniger gerade erst angefangen mich mit C zu beschäftigen(, zumindest bin ich noch relativ unerfahren^^,) und wollte als einfachen Versuch einmal eine .txt-Datei mit der Funktion fread() lesen und in der Konsole ausgeben lassen.
(PS:Ich arbeite derzeit noch unter Windows.)
Das Problem ist nun jedoch, dass der Text nicht vollkommen korrekt wiedergegeben wird.
Um mich an diverse andere Vorhaben heranzuarbeiten wollte ich nämlich erreichen, dass die Datei Blockweise(,am besten immer ein Zeichen,) ausgelesen wird.
Quellcode:
#include <stdio.h>
int main()
{
char c[1];
FILE *readmezeiger;
readmezeiger=fopen("readme.txt","rb");
while((fread(c,sizeof(c),1,readmezeiger))!=0)
{
printf("%s",c);
}
return 0;
}
readme.txt(auszulesende Datei):
-----------------------------------
test test test123....
-----------------------------------
FALLS DIES NUN FUNKTIONIERT HAT; MUESSTE ALLES GANZ NORMAL ZU LESEN SEIN.
Wenn ich nun jedoch versuche das Programm auszuführen, wird mir jedoch etwas sehr merkwürdiges ausgegeben.(Ich veruche einfach mal einen Screenshot anzuhängen.--->c[1].JPG9)
Ändere ich nun jedoch den Quelltext ab...:
#include <stdio.h>
int main()
{
char c[10];
FILE *readmezeiger;
readmezeiger=fopen("readme.txt","rb");
while((fread(c,sizeof(c),1,readmezeiger))!=0)
{
printf("%s",c);
}
return 0;
}
...,wird mir abermals etwas ausgegeb(--->c[10].JPG).
Könnte mir jemand bitte weiterhelfen und mir verraten, wo das Problem(/mein Denkfehler) liegt?
Danke im Vorraus.
PS: Ich weiß, dass es funktioniert, wenn der wert in [] größer ist, als die Gesamtzeichenzahl des Textes(, also wenn ich z.B 10000 eingebe).
dateien mit fread() lesen
dateien mit fread() lesen
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Re: dateien mit fread() lesen
Hallo!
Bitte verwende für deine Codes Code-Tags.
Das sieht dann so aus:
Wenn ich mit dem Editor versuche eine Binärdatei zu öffnen steht da:
Außerdem solltest du deine Codes ein bisschen sicherer gestalten (prüfen ob Datei richtig geöffnet vor der Verwendung usw.). Aufs schließen der Datei verzichtest du vollkommen...
So würde ich es machen:
Binärdatei schreiben:
Datei auslesen:
Übergebe ich dem ersten Programm als Argumente ""test " "test " "test123"" wird es mit dem zweiten Programm auch korrekt ausgegeben.
Bitte verwende für deine Codes Code-Tags.
Das sieht dann so aus:
Code: Alles auswählen
Code-Tag
Blockweise und immer ein Zeichen? Dann ist es doch Zeichenweise und nicht Blockweise.darkangel hat geschrieben:Blockweise(,am besten immer ein Zeichen
Hast du den Text mit einem Editor einfach so reingeschrieben? Du öffnest eine Binärdatei ("rb"). Ist es jedoch eine Textdatei kommt Müll raus (jedenfalls unter Windows wenn ich mich recht erinnere, bei Ubuntu gehts manchmal aber nicht immer?! *Zaunpfahl an Experten*). Dazu müsstest du ein eigenes Programm schreiben, dass eine binäre Datei anlegt.darkangel hat geschrieben: readme.txt(auszulesende Datei):
-----------------------------------
test test test123....
-----------------------------------
Wenn ich mit dem Editor versuche eine Binärdatei zu öffnen steht da:
Komischerweise gehts manchmal und manchmal nicht...Die Zeichenkodierung konnte nicht festgestellt werden.
Bitte stellen Sie sicher, dass Sie nicht versuchen, eine Binärdatei zu öffnen.
Wählen Sie eine Zeichenkodierung aus dem Menü und versuchen Sie es erneut.
Außerdem solltest du deine Codes ein bisschen sicherer gestalten (prüfen ob Datei richtig geöffnet vor der Verwendung usw.). Aufs schließen der Datei verzichtest du vollkommen...
So würde ich es machen:
Binärdatei schreiben:
Code: Alles auswählen
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main (int argc, char *argv[])
{
FILE *writebin;
int i;
if ((writebin = fopen ("test.txt", "wb")))
{
for (i = 1; i < argc; i++)
fwrite (argv[i], sizeof (char), strlen (argv[i]), writebin);
fclose (writebin);
}
else
printf ("File konnte nicht angelegt werden: %s\n", strerror (errno));
return 0;
}
Code: Alles auswählen
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main()
{
char c;
FILE *readmezeiger;
readmezeiger = fopen("test.txt", "rb");
if (readmezeiger)
{
while((fread (&c, sizeof(c), 1, readmezeiger)) != 0)
printf("%c", c);
fclose (readmezeiger);
}
else
printf ("File konnte nicht geöffnet werden: %s\n", strerror (errno));
return 0;
}
- cloidnerux
- Moderator
- Beiträge: 3125
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: dateien mit fread() lesen
Das müll Rauskommt, hängt mit UNICODE und ASCII zusammen.
fopen ließt nach ASCII und viele Editoren schreiben ncah UNICODe oder anderen=>Müll.
Wenn man ein Text unter Linux schreibt, ih n speichert und unter Windows öffnet, kommt auch müll Raus.
fopen ließt nach ASCII und viele Editoren schreiben ncah UNICODe oder anderen=>Müll.
Wenn man ein Text unter Linux schreibt, ih n speichert und unter Windows öffnet, kommt auch müll Raus.
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
Re: dateien mit fread() lesen
Ah..danke.
Ja, ich habe die Datei einfach mit einem Texteditor geschrieben.
Was ich nicht ganz verstehe ist die Sache mit dem binären Schreiben und lesen.
Kann ich die Datei auch einfach "nicht-binär" öffnen?
Mit "r" statt "rb" funktioniert es ja leider nicht ohne weiteres.
Könntest du oder irgendjemand anderes mir eventuel den Unterscheid zwischen den beiden Modi erklären.
Mein Ziel ist es eigentlich, ein einfaches Programm zur Verschluesselung(,keine besonders gute allerdings^^), das ich früher einmal in Virtual Pascal geschrieben habe in C neu zu schreiben.
Bei Pascal hat es allerdings keinerlei Unterschied gemacht ob binäre( oder formatierte( vielleicht bring ich gerade auch alles durcheinander)) oder was auch immer für eine Datei.
Heißt das, bei C kommt es auch immer direkt auf den Datei-typ an, oder nur daraf ob binär oder nicht?
Kann man dieses "ASCII-UNICODE"-Problem allgemein umgehen?
Ja, ich habe die Datei einfach mit einem Texteditor geschrieben.
Was ich nicht ganz verstehe ist die Sache mit dem binären Schreiben und lesen.
Kann ich die Datei auch einfach "nicht-binär" öffnen?
Mit "r" statt "rb" funktioniert es ja leider nicht ohne weiteres.
Könntest du oder irgendjemand anderes mir eventuel den Unterscheid zwischen den beiden Modi erklären.
Mein Ziel ist es eigentlich, ein einfaches Programm zur Verschluesselung(,keine besonders gute allerdings^^), das ich früher einmal in Virtual Pascal geschrieben habe in C neu zu schreiben.
Bei Pascal hat es allerdings keinerlei Unterschied gemacht ob binäre( oder formatierte( vielleicht bring ich gerade auch alles durcheinander)) oder was auch immer für eine Datei.
Heißt das, bei C kommt es auch immer direkt auf den Datei-typ an, oder nur daraf ob binär oder nicht?
Kann man dieses "ASCII-UNICODE"-Problem allgemein umgehen?
Re: dateien mit fread() lesen
Ich habe mir schon öfters txts von Ubuntu auf den Vista-Desktop kopiert. Die Absätze fehlen zwar teilweise, aber lesbar ist sie trotzdem.cloidnerux hat geschrieben:Wenn man ein Text unter Linux schreibt, ih n speichert und unter Windows öffnet, kommt auch müll Raus.
Umgekehrt gibt es überhaupt keine Probleme beim Lesen von Windows-txts unter Ubuntu.
Ja, du kannst die Datei als Textdatei öffnen.darkangel hat geschrieben:Kann ich die Datei auch einfach "nicht-binär" öffnen?
Es funktioniert schon, nur du musst andere Funktionen zum Lesen verwenden.darkangel hat geschrieben:Mit "r" statt "rb" funktioniert es ja leider nicht ohne weiteres.
Zeichenweise kannst du z.B. mit fgetc. Ein Beispiel zur Funktion findest du dort auch.
Naja so ganz genau weiß ich das auch nicht. Jedenfalls enthält die Textdatei ASCII-Zeichen und in der Binärdatei sind die Zeichen binär dargestellt.darkangel hat geschrieben:Könntest du oder irgendjemand anderes mir eventuel den Unterscheid zwischen den beiden Modi erklären.
- fat-lobyte
- Beiträge: 1398
- Registriert: Sa Jul 05, 2008 12:23 pm
- Wohnort: ::1
- Kontaktdaten:
Re: dateien mit fread() lesen
Das liegt an der Codierung von Newlines.nufan hat geschrieben:Ich habe mir schon öfters txts von Ubuntu auf den Vista-Desktop kopiert. Die Absätze fehlen zwar teilweise, aber lesbar ist sie trotzdem.cloidnerux hat geschrieben:Wenn man ein Text unter Linux schreibt, ih n speichert und unter Windows öffnet, kommt auch müll Raus.
Umgekehrt gibt es überhaupt keine Probleme beim Lesen von Windows-txts unter Ubuntu.
Linux: "Line Feed": \x10
Windows: "Carraiage Return + Line Feed": \x13\x10
MacOS X: "Carriage Return": \x13
Ob du die Datei als Binär oder als Text öffnen sollst hängt davon ab, ob du eine Textdatei "erwartest" oder nicht.darkangel hat geschrieben:Könntest du oder irgendjemand anderes mir eventuel den Unterscheid zwischen den beiden Modi erklären.
Wenn du die Datei binär öffnest, kriegst du jedes Byte genau so in dein Programm herein, wie es auf der Festplatte steht.
Wenn du die Datei als Text öffnest, werden alle Newlines des Betriebssystemformats einfach in "\n" umgewandelt. (Ich glaube manche konvertieren sogar kompliziertere Codierungen zu ASCII).
Haters gonna hate, potatoes gonna potate.
Re: dateien mit fread() lesen
Nur zur Info:fat-lobyte hat geschrieben:Das liegt an der Codierung von Newlines.nufan hat geschrieben:Ich habe mir schon öfters txts von Ubuntu auf den Vista-Desktop kopiert. Die Absätze fehlen zwar teilweise, aber lesbar ist sie trotzdem.cloidnerux hat geschrieben:Wenn man ein Text unter Linux schreibt, ih n speichert und unter Windows öffnet, kommt auch müll Raus.
Umgekehrt gibt es überhaupt keine Probleme beim Lesen von Windows-txts unter Ubuntu.
Linux: "Line Feed": \x10
Windows: "Carraiage Return + Line Feed": \x13\x10
MacOS X: "Carriage Return": \x13
MacOS verwendet seit X ebenfalls Line Feed.
Bin darauf gestoßen, als ich heute ein unter Linux geschriebenes File-Programm auf Windows testen wollte. Dabei ging ich mit fgetc immer bis zum \n und dann mit fseek ein Zeichen zurück. Bei Windows ist \n aber eigentlich 2 Zeichen, deshalb fehlten bei mir immer Zeichen...
Quelle