datei operationen
-
proggingmania schrieb:
CStoll schrieb:
Theoretisch kann jeder Wert zwischen 0x00 und 0xFF (als signed char ist das 0..127;-128..-1) in deiner Datei vorkommen (und damit auch als Rückgabewert von getch() auftreten). Also kannst du nicht einfach einen Wert in diesem Bereich auswählen und als EOF festlegen.
Also, ich habe nichts festgelegt, das haben schon andere gemacht:
// Definiert in stdio.h: #define EOF (-1)
Bei näherer Betrachtung also weder char, noch int.
Und bei noch näherer Betrachtung ist das ein int (es gibt keine typlosen Werte in C, darum gibt es auch Regeln, welchen Typ ein Literal hat)
Es ist ja nicht so, das die -1 in der Datei selbst irgendwo am Ende steht, das ist quasi nur eine Ende-Der-Datei-Indikator.
Sonst würde ja, wenn man einen Buchstaben in einer Textdatei im ANSI-Format abspeichert mindestens noch ein zusätzliches Byte für die -1 gebraucht werden und aus einem gespeicherten 'A' hätte man auf einmal eine doppelt so grosse ( 2 Byte ) Datei. NönöööSo, und jetzt hast du dich endgültig in deiner eigenen Argumentation verheddert. Ich versuche mal, es für dich zu ordnen:
- ein char ist genau 1 Byte groß (per Definition des ANSI-Standards)
- jeder mögliche char-Wert kann in einer Datei vorkommen
- die EOF-Kennung kann nicht in der Datei stehen
=> EOF kann kein char sein
-
c.rackwitz schrieb:
ein scheiss troll, nix anderes.
ich hab mir schon ein greasemonkey script gesucht um den spacken aus meinem blickfeld zu haben.
Beherrsch dich bitte.
-
Frag mal am besten einen C Programmierer, ob -1 in char reinpasst, lol.
-
proggingmania schrieb:
Frag mal am besten einen C Programmierer, ob -1 in char reinpasst, lol.
-1 passt sogar in nur 2 bits rein.
--> http://en.wikipedia.org/wiki/Two's_complement
aber es geht hier nicht um den zahlenwert, sondern darum, dass das höchste bit (oder ein anderes ausserhalb der breite con 'char') bei EOF immer gesetzt sein muss.
-
Tim schrieb:
Beherrsch dich bitte.
Wo er doch recht hat...
Entweder Troll oder absolut lernresistent.
@proggingmania:
Falls Du wider Erwarten kein Troll sein solltest, les Dir die Beiträge nochmal durch, es geht hier nicht darum ob -1 in ein char passt sondern darum den Char-Wert -1 (in der Datei Hex 0xFF) eindeutig von EOF aka dem Int-Wert -1 (Hex 0xFFFFFFFF) unterscheiden zu können. Oder brechen alle Deine Programme das Lesen ab wenn in der Datei mal Hex 0xFF vorkommt?Für mich ist damit btw EOD.
-
LordJaxom schrieb:
Tim schrieb:
Beherrsch dich bitte.
Wo er doch recht hat...
Stimmt, "recht haben" legitimiert ja alles...
-
wer braucht schon eine legitimierung um zu fluchen?
wenn ich nicht ausfallend geworden waere, waer mein standpunkt wahrscheinlich untergegangen.edit: heisst nicht, dass mein verhalten hier hinpassen wuerde
-
LordJaxom schrieb:
Oder brechen alle Deine Programme das Lesen ab wenn in der Datei mal Hex 0xFF vorkommt?
Ja, alle, entweder bei (char)0xFF oder bei (int)0xFF, je nachdem wie ich den Wert da reinschreibe.
LordJaxom schrieb:
Für mich ist damit btw EOD.
Ok, geht in ordung.
-
proggingmania schrieb:
LordJaxom schrieb:
Oder brechen alle Deine Programme das Lesen ab wenn in der Datei mal Hex 0xFF vorkommt?
Ja, alle, entweder bei (char)0xFF oder bei (int)0xFF, je nachdem wie ich den Wert da reinschreibe.
Dir ist aber klar, daß (int)0xFF (=255) etwas anderes ist als EOF?
-
CStoll schrieb:
Dir ist aber klar, daß (int)0xFF (=255) etwas anderes ist als EOF?
Ja, denn ( EOF == -1 ) != ( (int)0xFF == 255 )
-
in einem char ist das aber der gleiche wert :p
-
c.rackwitz schrieb:
in einem char ist das aber der gleiche wert :p
jetzt fängst du auch noch damit an...
EOF passt *nicht* in einen 'char'
-
tuerlich nicht. der wird abgeschnitten. deswegen ist in einem char -1 == 255 (modulo 256), weshalb getchar() auch einen ganzen int zurueckgibt (scheinbar daten >=0 und eof == -1).
lesen, dann fluchen. meinen verstand habe ich noch. du auch?
-
Kuckuck.
Ich wusste bisher gar nicht, das es implementationsabhängig ist,
ob char dem Datentyp signed char oder unsigned char entspricht.
Der Datentyp char kann also je nach Compiler signed oder unsigned sein.
Bei meinem Compiler ist char signed und darum gibts auch keine
Probleme beim EOF einlesen.
Probleme hätten auftreten können, wenn in einer Datei der Wert 0xFF stünde.
0xFF würde als EOF ausgelegt werden, eventuell noch folgende Werte würden nicht gelesen und das ist großer Käse.Wäre char signed, dann könnte ich glaub ich auf das EOF ziemlich lange warten,
oder das Programm würde abstürzen, denn EOF wird von signed char nicht erkannt.
Wie gut das es nun mittlerweile auch schon bis zu mir durchgedrungen ist.
Darüber hab ich mir offen gestanden bisher gar einen Kopp gemacht und darum an dieser Stelle Dank an diejenigen, die mich eines besseres belehrt haben.Ach und übrigens wird die Modulo-Arithmetik nur bei unsigned Datentypen angewendet, kann also nie negativ werden und abgesehen davon 255 modulo(256) ist 255.
255%256 == 255 && 255%256 != -1
Ich wünsche allen Boardies noch einen schönen Tag !
-
proggingmania schrieb:
Probleme hätten auftreten können, wenn in einer Datei der Wert 0xFF stünde.
0xFF würde als EOF ausgelegt werden, eventuell noch folgende Werte würden nicht gelesen und das ist großer Käse.nein, das ist kein problem. EOF ist kleiner als 0 oder grösser als 0xff
-
vista schrieb:
nein, das ist kein problem
doch doch
Denn:
(signed char)0xFF == EOF;
Was dann beim Einlesen zum Abbruch der Schleife führt, alles was noch eventuell folt wird nicht mehr eingelesen.
-
proggingmania schrieb:
alles was noch eventuell folt
Kauf dich tüte deutsch, hat mich auch gehilft, das heißt folgt du Vogel.
MfG
-
proggingmania schrieb:
Denn:
(signed char)0xFF == EOF;
nö, EOF ist (int)-1 und weil ein 'int' mindestens 16 bits haben muss, ist z.b. EOF 0xffff oder 0x1ffff oder 0x3ffff oder 0x7ffff usw... aber niemals nur 0xff
-
Yes sir, das ist dem Lesevorgang aber egal, weil doch nur Byteweise gelesen wird.
In deinem Beispiel wäre das erst 0x1f , dann 0x2f und bei 0xFF würde EOF interpretiert.
Stimmt oder hab ich Recht.
-
proggingmania schrieb:
In deinem Beispiel wäre das erst 0x1f , dann 0x2f und bei 0xFF würde EOF interpretiert.
Stimmt oder hab ich Recht.nee, weil EOF und 0xff sich unterscheiden.
0xff in einem 16bit 'int' ist 0x00ff und EOF ist im selben datentyp 0xffff.
weil der computer ganze ints betrachtet, wenn es um EOF geht, gibt's dabei keine verwechselung.