dateien mit fread() lesen

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
darkangel
Beiträge: 17
Registriert: Sa Jan 17, 2009 9:26 pm
Kontaktdaten:

dateien mit fread() lesen

Beitrag von darkangel » Sa Jan 17, 2009 9:57 pm

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)
c[1].JPG

Ä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).
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).
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: dateien mit fread() lesen

Beitrag von nufan » Sa Jan 17, 2009 10:58 pm

Hallo!

Bitte verwende für deine Codes Code-Tags.
Das sieht dann so aus:

Code: Alles auswählen

Code-Tag
darkangel hat geschrieben:Blockweise(,am besten immer ein Zeichen
Blockweise und immer ein Zeichen? Dann ist es doch Zeichenweise und nicht Blockweise.
darkangel hat geschrieben: readme.txt(auszulesende Datei):

-----------------------------------
test test test123....
-----------------------------------
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.
Wenn ich mit dem Editor versuche eine Binärdatei zu öffnen steht da:
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.
Komischerweise gehts manchmal und manchmal nicht...

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;

}
Datei auslesen:

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;

}
Übergebe ich dem ersten Programm als Argumente ""test " "test " "test123"" wird es mit dem zweiten Programm auch korrekt ausgegeben.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: dateien mit fread() lesen

Beitrag von cloidnerux » Sa Jan 17, 2009 11:15 pm

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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

darkangel
Beiträge: 17
Registriert: Sa Jan 17, 2009 9:26 pm
Kontaktdaten:

Re: dateien mit fread() lesen

Beitrag von darkangel » Sa Jan 17, 2009 11:20 pm

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?

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: dateien mit fread() lesen

Beitrag von nufan » Sa Jan 17, 2009 11:32 pm

cloidnerux hat geschrieben:Wenn man ein Text unter Linux schreibt, ih n speichert und unter Windows öffnet, kommt auch müll Raus.
Ich habe mir schon öfters txts von Ubuntu auf den Vista-Desktop kopiert. Die Absätze fehlen zwar teilweise, aber lesbar ist sie trotzdem.
Umgekehrt gibt es überhaupt keine Probleme beim Lesen von Windows-txts unter Ubuntu.
darkangel hat geschrieben:Kann ich die Datei auch einfach "nicht-binär" öffnen?
Ja, du kannst die Datei als Textdatei öffnen.
darkangel hat geschrieben:Mit "r" statt "rb" funktioniert es ja leider nicht ohne weiteres.
Es funktioniert schon, nur du musst andere Funktionen zum Lesen verwenden.
Zeichenweise kannst du z.B. mit fgetc. Ein Beispiel zur Funktion findest du dort auch.
darkangel hat geschrieben:Könntest du oder irgendjemand anderes mir eventuel den Unterscheid zwischen den beiden Modi erklären.
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.

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: dateien mit fread() lesen

Beitrag von fat-lobyte » So Jan 18, 2009 9:20 am

nufan hat geschrieben:
cloidnerux hat geschrieben:Wenn man ein Text unter Linux schreibt, ih n speichert und unter Windows öffnet, kommt auch müll Raus.
Ich habe mir schon öfters txts von Ubuntu auf den Vista-Desktop kopiert. Die Absätze fehlen zwar teilweise, aber lesbar ist sie trotzdem.
Umgekehrt gibt es überhaupt keine Probleme beim Lesen von Windows-txts unter Ubuntu.
Das liegt an der Codierung von Newlines.
Linux: "Line Feed": \x10
Windows: "Carraiage Return + Line Feed": \x13\x10
MacOS X: "Carriage Return": \x13
darkangel hat geschrieben:Könntest du oder irgendjemand anderes mir eventuel den Unterscheid zwischen den beiden Modi erklären.
Ob du die Datei als Binär oder als Text öffnen sollst hängt davon ab, ob du eine Textdatei "erwartest" oder nicht.
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.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: dateien mit fread() lesen

Beitrag von nufan » Sa Feb 14, 2009 12:35 am

fat-lobyte hat geschrieben:
nufan hat geschrieben:
cloidnerux hat geschrieben:Wenn man ein Text unter Linux schreibt, ih n speichert und unter Windows öffnet, kommt auch müll Raus.
Ich habe mir schon öfters txts von Ubuntu auf den Vista-Desktop kopiert. Die Absätze fehlen zwar teilweise, aber lesbar ist sie trotzdem.
Umgekehrt gibt es überhaupt keine Probleme beim Lesen von Windows-txts unter Ubuntu.
Das liegt an der Codierung von Newlines.
Linux: "Line Feed": \x10
Windows: "Carraiage Return + Line Feed": \x13\x10
MacOS X: "Carriage Return": \x13
Nur zur Info:
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

Antworten