Seite 1 von 1

dateien mit fread() lesen

Verfasst: Sa Jan 17, 2009 9:57 pm
von darkangel
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).

Re: dateien mit fread() lesen

Verfasst: Sa Jan 17, 2009 10:58 pm
von nufan
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.

Re: dateien mit fread() lesen

Verfasst: Sa Jan 17, 2009 11:15 pm
von cloidnerux
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.

Re: dateien mit fread() lesen

Verfasst: Sa Jan 17, 2009 11:20 pm
von darkangel
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?

Re: dateien mit fread() lesen

Verfasst: Sa Jan 17, 2009 11:32 pm
von nufan
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.

Re: dateien mit fread() lesen

Verfasst: So Jan 18, 2009 9:20 am
von fat-lobyte
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).

Re: dateien mit fread() lesen

Verfasst: Sa Feb 14, 2009 12:35 am
von nufan
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