probleme mit dem einlesen von txt
-
hi Leute
ich nutze mac und den 98 Stadtrat
ich wollte eine txt einlesen jedoch funktionier das bei mir irgendwie nicht so richtig
in der txt steht irgendein text wenn ich mir den nach dem einlesen in C ausgeben lasse kommen da leider nur sinnlose Zeichen heraus.
dies ist mein quelltext:#include <stdio.h> #include <string.h> #include <ctype.h> #define MAX_DATEILAENGE 100000//Byte int main (void) { FILE * datei; char text[MAX_DATEILAENGE+1]; char dateiname[] = "bastard-operator1.txt"; char c; char formatstring[10]; int i; datei = fopen ("bastard-operator1","r"); if (datei==NULL) { printf("Datei kann nicht geöffnet werden.\n"); return 1; } //VERSION 1 EINLESEN /* for(i=0;((c=getc(datei))!=EOF && i<MAX_DATEILAENGE);i++) { text[i]=c; } */ //VERSION 2 EINLESEN /* fscanf(datei,"%100000c", text); */ //VERSION 3 EINLESEN /* if(datei !=NULL) { fscanf(datei, formatstring, text); } */ fclose (datei); for (i=0;i<MAX_DATEILAENGE; i++) { printf("%c",text[i]); } return 0; }
und so sieht die Ausgabe der txt aus
`T?Y?VMo????Pb?Y?Pb?Y?x(???Eo??T?Y??Ko?x(???T?9??P?x(???x(???Pb?Y?x(???@]?Y??Jo?x(???Pb?Y?@?o???'??c?Y??c?Y?p?o??Eo??c?Y?Ї???Eo?`V?Y??Ko?Ї???T?9??P?Ї???Ї????c?Y?Ї????^?Y??Jo?Ї????c?Y?p?o??W?Y?VMo???b`?e?Y?pe?Y??o??Eo??e?Y???ֈ?Eo?X?Y??Ko???ֈ?T?9??P???ֈ???ֈ??e?Y???ֈ??`?Y??Jo???ֈ??e?Y?p?o??Y?Y?VMo?S!??pg?Y?@g?Y???o??Eo?PZ?Y?VMo?pg?Y??????Eo??Y?Y??Ko??????T?9??P???????????pg?Y??????`b?Y??Jo??????pg?Y???o?@h?Y?X?$??Eo??Z?Y??Ko?X?$??T?9??P?X?$??X?$???i?Y?@?o??Eo??Jo? [?Y!X?$??@h?Y?`?o??????????? \?Y?VMo??c?Y??Jo??j?Y???????h?Y?H?o?VMo??i?Y???o??Eo?0j?Y?H?o??Eo?j?Y???ڏ?Eo??\?Y??Ko???ڏ?T?9??P???ڏ???ڏ?j?Y???ڏ?e?Y??Jo? ^?Y???ڏ?T?9??P?j?Y?@?o?????Pe?Y??Jo?`]?Y????Em??????`j?Y?H?o?T?9??P?Pb?Y?x(???x(???x(???p]?Y?'Bo?x(????Eo?x(????]?Y???o?x(???Pb?Y???o?T?9??P?x(???Pb?Y?Eo??Eo?x(???@b?Y?k?o??l?Y?=Ao?Pk?Y???o?_?Y?VMo?s*7m?Y?@l?Y?????Eo??^?Y??Ko??o?H?Ј?T?9??P??
der txt text sieht aber so aus:
Bastard Operator from Hell
von Simon Travaglia
Heute ist Backup-Tag. Mein Lieblingtag! Andererseits hat es natuerlich
gewisse Vorteile, der Operator zu sein.
Ich linke das tape device nach /dev/null - viel oekonomischer.
Zumindest was meine Arbeitszeit angeht, weil ich nicht alle 5 Minuten
Baender wechseln muss.
Ausserdem dauert das Backup nur noch etwa 12 Minuten, also kann es nicht
ganz schlecht sein!Ein Benutzer ruft an.
"Wissen Sie, warum das System so langsam ist?" fragt er.
"Wahrscheinlich liegt's an..." Ich schaue nach, was heute dran ist
"...der Taktfrequenz.""Ah." Wenn sie nicht wissen, wovon man redet, sind sie meistens zufrieden.
"Wissen Sie wann das repariert wird?"
über antworten würde ich mich sehr freuen denn ich habe keine Ahnung woran es liegt
Mit freundlichen Grüßen
XY;)edit durch SeppJ: Codetags.
-
Puh, das ist kniffelig. Stadträte in Verwendung mit Mac-Nutzung sind in der Vergangenheit dafür bekannt gewesen, Probleme beim Einlesen von Dateien zu machen - siehe hier. Da findest du dann auch direkt eine Teillösung.
-
XY_) schrieb:
ich wollte eine txt einlesen jedoch funktionier das bei mir irgendwie nicht so richtig
in der txt steht irgendein text wenn ich mir den nach dem einlesen in C ausgeben lasse kommen da leider nur sinnlose Zeichen heraus.Wo liest Du denn ein? Das ist doch alles auskommentiert!?
Benutz die Code-Tags (Knopf "C" unter dem
Smiley), wenn Du Code postest.
-
Nutze in Zukunft bitte die Codetags für Quellcode! Zu finden unter dem Editfenster bei den Smileys. Der alleroberste Thread in diesem Forum ist eine kurze Anleitung.
Ebenso sollten überbreite Ausgaben in Codetags gesetzt werden oder, in diesem Fall besser, nur ein kurzer, repräsentativer Auszug präsentiert werden.Ich habe dieses Mal die entsprechenden Formatierungen für dich eingefügt, beim nächsten Mal musst du selber dran denken. Nutze die Vorschau!
Hast du vor der Ausgabe mal geprüft, ob die Datei überhaupt eingelesen wurde? Außerdem böte es sich wohl auch an, nur so viele Zeichen aus zu geben, wie du auch zuvor eingelesen hast.
Deine Variable c muss vom Typ int sein, so wie du sie benutzt, denn die EOF-Konstante ist nicht unbedingt vom Typ char.
Bei allen deinen Versionen wäre es zu empfehlen, dass du am Ende ein Nullzeichen ans Array anhängst, so dass du die Funktionen zur Zeichenkettenverarbeitung nutzen kannst, anstatt alles zeichenweise von Hand zu machen. Denn offensichtlich handelt es sich um Zeichenketten, die du hier verarbeitest, nicht irgendwelche binären Rohdaten. Es böte sich sogar an, direkt das Einlesen mit entsprechenden Funktionen vorzunehmen (die dann natürlich auch selbstständig gleich ein Nullzeichen anhängen).
Die erste Variante sollte passen, wenn du c zu int machst.
Die zweite sollte auch passen.
Die dritte ist Quatsch, du definierst ja nirgends einen passenden Inhalt für den Formatstring.Alle Angaben ohne Gewähr, da der Code unformatiert und daher schwer zu lesen ist.
PS: 98 Stadtrat? Oder eher 89 Standard? Einen 98-Standard gibt es nicht in C. Es gibt 89, 99, 11. Es gibt einen 98-Standard für C++, das ist aber, trotz des Namens, eine ganz andere Sprache.
-
fread
geht auch noch: http://www.cplusplus.com/reference/cstdio/fread/size_t anzahl; ... anzahl = fread(text, 1, MAX_DATEILAENGE, datei); text[anzahl] = '\0';