 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Christian Kukla Guest
|
Posted: Fri Nov 24, 2006 2:23 am Post subject: Kann ich eine Textdatei Zeichenweise auslesen? |
|
|
Hallo!
Ich habe folgendes Problem: Ich habe eine per random-Funktion erstellte
Datei, die nur aus Einsen und Nullen (und einem EOF) besteht. Ich frage
mich nun, wie ich aus dieser Datei beliebige Stellen auslesen kann. Am
liebsten mit einem Pointer. D.h. also das ich beispielweise einen
Pointer auf das 50. Zeichen in der Datei setzen und mir dann den
"Inhalt" des Pointers anzeigen lassen kann. Alternativ wäre auch die
eingabe in ein Array oder als letzte Möglichkeit in eine Varialbe möglich.
Kennt da jemand eine Lösung?
MfG
Christian |
|
| Back to top |
|
 |
Andreas Huennebeck Guest
|
Posted: Fri Nov 24, 2006 10:11 am Post subject: Re: Kann ich eine Textdatei Zeichenweise auslesen? |
|
|
Christian Kukla wrote:
| Quote: | Ich habe folgendes Problem: Ich habe eine per random-Funktion erstellte
Datei, die nur aus Einsen und Nullen (und einem EOF) besteht. Ich frage
mich nun, wie ich aus dieser Datei beliebige Stellen auslesen kann. Am
liebsten mit einem Pointer. D.h. also das ich beispielweise einen
Pointer auf das 50. Zeichen in der Datei setzen und mir dann den
"Inhalt" des Pointers anzeigen lassen kann.
|
Die C-Funktionen lseek() und read() machen sowas. Da sie meines Wissens
POSIX-Kompatibel sind, sollte das auch auf den meisten Betriebssystemen
funktionieren. Besser ist aber sicher, wenn Du die äquivalenten Funktionen
der IO-Streams verwendest.
Tschau
Andreas
--
Andreas Hünnebeck | email: acmh (AT) gmx (DOT) de
----- privat ---- | www : http://www.huennebeck-online.de
Fax/Anrufbeantworter: 0721/151-284301
GPG-Key: http://www.huennebeck-online.de/public_keys/andreas.asc
PGP-Key: http://www.huennebeck-online.de/public_keys/pgp_andreas.asc |
|
| Back to top |
|
 |
Rud1ger Sch1erz Guest
|
Posted: Fri Nov 24, 2006 10:12 pm Post subject: Re: Kann ich eine Textdatei Zeichenweise auslesen? |
|
|
Christian Kukla <Christian.Kukla@rwth-aachen.de> writes:
| Quote: | Ich habe folgendes Problem: Ich habe eine per random-Funktion
erstellte Datei, die nur aus Einsen und Nullen (und einem EOF)
besteht.
|
Hm, da du im Subject "Textdatei" schreibst, gehe ich mal davon aus,
dass die Nullen und Einsen als ASCII character in der Datei sind,
also: '0', '1'
| Quote: | Ich frage mich nun, wie ich aus dieser Datei beliebige
Stellen auslesen kann. Am liebsten mit einem Pointer. D.h. also das
ich beispielweise einen Pointer auf das 50. Zeichen in der Datei
setzen und mir dann den "Inhalt" des Pointers anzeigen lassen
kann.
|
Jo, warum nimmst du nicht ifstream aus der Standardlib?
,----
| ifstream myinput("Textdatei");
| [...]
|
| // z.B. an Position 50 lesen:
| char c = '0';
| myinput.seekg(50);
| if(myinput) myinput.get(c);
`----
Wenn du gerne mit Subscription (subscript operator [ ]) arbeiten
möchtest, kann du den Zugriff auch noch in eine Klasse verkapseln:
,----
| class RandomSource {
| public:
| RandomSource(const char* fname) : _myinput(fname) { }
| char operator[](size_t pos);
| private:
| ifstream _myinput;
| };
|
| char RandomSource:: operator[](size_t pos)
| {
| char c = '0';
| if(_myinput.seekg(pos)) _myinput.get(c);
|
| if(!_myinput) throw("out of range");
|
| return c;
| }
`----
Ein Miniprogramm könnte so aussehen:
#include <fstream>
using namespace std;
class RandomSource {
public:
RandomSource(const char* fname) : _myinput(fname) { }
char operator[](size_t pos);
private:
ifstream _myinput;
};
char RandomSource:: operator[](size_t pos)
{
char c = '0';
if(_myinput.seekg(pos)) _myinput.get(c);
if(!_myinput) throw("out of range");
return c;
}
int main(int argc, char** argv)
{
int retval = 0;
RandomSource rs("main.cc");
size_t n =0;
try {
for(n = 10; n < 2000; ++n) { // willkürliche Positionswerte
cout << rs[n] << endl; // hier wird auf den Inhalt zugegriffen
}
} catch (const char* myreason) {
cerr << "Aborted at position " << n << ": " << myreason << endl;
retval = 1;
}
return retval;
}
Anmerkung:
HTH,
Rudiger |
|
| Back to top |
|
 |
Rud1ger Sch1erz Guest
|
Posted: Fri Nov 24, 2006 11:25 pm Post subject: Re: Kann ich eine Textdatei Zeichenweise auslesen? |
|
|
Rud1ger Sch1erz <nospam_tigre (AT) yahoo (DOT) es> writes:
Ups, keine Anmerkung. Diese Zeile bitte wegdenken.
Cheers,
Rudiger |
|
| Back to top |
|
 |
Christian Kukla Guest
|
Posted: Sat Nov 25, 2006 4:11 pm Post subject: Re: Kann ich eine Textdatei Zeichenweise auslesen? |
|
|
Morgen!
Vielen Dank für die Antworten!
@Andreas: Auf deine Möglichkeit hab ich es lange versucht. Aber
irgendwie bekomme ich da nur Speicheradressen ausgegeben. Wahrscheinlich
hab ich irgendeinen Fehler in der Syntax oder in der Art, das
auszugeben. Muss ich mich nochmal weiter einlesen. Das zu kennen ist nie
verkehrt.
@Rudiger: Deine Methode sieht sehr vielversprechend aus. Vielen Dank!
Werd ich mal sofort versuchen, in die Tat umzusetzen.
Schönes Wochenende
Christian |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Mon Nov 27, 2006 7:48 pm Post subject: Re: Kann ich eine Textdatei Zeichenweise auslesen? |
|
|
Christian Kukla wrote:
| Quote: | Ich habe folgendes Problem: Ich habe eine per random-Funktion erstellte
Datei, die nur aus Einsen und Nullen (und einem EOF) besteht. Ich frage
mich nun, wie ich aus dieser Datei beliebige Stellen auslesen kann. Am
liebsten mit einem Pointer. D.h. also das ich beispielweise einen
Pointer auf das 50. Zeichen in der Datei setzen und mir dann den
"Inhalt" des Pointers anzeigen lassen kann. Alternativ wäre auch die
eingabe in ein Array oder als letzte Möglichkeit in eine Varialbe möglich.
Kennt da jemand eine Lösung?
|
Wie groß ist die Datei? Wenn sie im Speicher passt, ist die
einfachste Lösung halt, die ganze Datei in den Speicher zu
lesen, und dort darangreifen. Z.B. mit etwas wie:
std::ifstream daten( "..." ) ;
std::vector< char > d( (std::istreambuf_iterator< char >( daten )),
(std::istreambuf_iterator< char >())) ;
Amstonsten: du kannst leider nicht auf eine beliebige Stelle in
einer Textdatei positionnieren. Du musst sie also als binäre
Datei offnen.
--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
| Back to top |
|
 |
Rud1ger Sch1erz Guest
|
Posted: Tue Nov 28, 2006 4:44 pm Post subject: Re: Kann ich eine Textdatei Zeichenweise auslesen? |
|
|
"James Kanze" <james.kanze (AT) gmail (DOT) com> writes:
| Quote: | Amstonsten: du kannst leider nicht auf eine beliebige Stelle in
einer Textdatei positionnieren. Du musst sie also als binäre
Datei offnen.
|
Wie kommst du denn auf *den* dürren Ast?
Was ist dann:
,----
| std::ifstream myinput{"textdatei");
|
| myinput.seekg(beliebige_stelle);
|
| char c = myinput.get();
`----
Cheers,
Rudiger |
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Tue Nov 28, 2006 11:00 pm Post subject: Re: Kann ich eine Textdatei Zeichenweise auslesen? |
|
|
Rud1ger Sch1erz wrote:
| Quote: | "James Kanze" <james.kanze (AT) gmail (DOT) com> writes:
Amstonsten: du kannst leider nicht auf eine beliebige Stelle in
einer Textdatei positionnieren. Du musst sie also als binäre
Datei offnen.
Wie kommst du denn auf *den* dürren Ast?
Was ist dann:
,----
| std::ifstream myinput{"textdatei");
|
| myinput.seekg(beliebige_stelle);
|
Du hast unterschlagen, woher du 'beliebige_stelle' nimmst. Portabel darf
dass nämlich nur ein Wert sein, den du von 'tellg' herbekommen hast
(folgt aus der Beschreibung der fseek-Funktion im C-Standard, auf die
die Beschreibung von seekg verweist).
Unter Unix klappt das mit beliebigen Zahlen. Aber bereits unter Windows
positionierst du damit unter Umständen in die Mitte eines Zeichens
(nämlich des \n, welches als \r\n in der Datei steht).
Stefan |
|
| Back to top |
|
 |
Rud1ger Sch1erz Guest
|
Posted: Wed Nov 29, 2006 5:45 am Post subject: Re: Kann ich eine Textdatei Zeichenweise auslesen? |
|
|
Stefan Reuther <stefan.news (AT) arcor (DOT) de> writes:
| Quote: | Rud1ger Sch1erz wrote:
"James Kanze" <james.kanze (AT) gmail (DOT) com> writes:
Amstonsten: du kannst leider nicht auf eine beliebige Stelle in
einer Textdatei positionnieren. Du musst sie also als binäre
Datei offnen.
Wie kommst du denn auf *den* dürren Ast?
Was ist dann:
,----
| std::ifstream myinput{"textdatei");
|
| myinput.seekg(beliebige_stelle);
Du hast unterschlagen, woher du 'beliebige_stelle' nimmst.
|
Die Ursprungsfrage war, ob man in einer Textdatei zum Lesen frei
positionieren kann. James meint (wenn ich ihn richtig verstanden
habe), das geht nicht, ich meine, das geht sehr wohl.
| Quote: | Portabel darf
dass nämlich nur ein Wert sein, den du von 'tellg' herbekommen hast
(folgt aus der Beschreibung der fseek-Funktion im C-Standard, auf die
die Beschreibung von seekg verweist).
Unter Unix klappt das mit beliebigen Zahlen. Aber bereits unter Windows
positionierst du damit unter Umständen in die Mitte eines Zeichens
(nämlich des \n, welches als \r\n in der Datei steht).
|
Ob an der Stelle, an die ich frei positioniere, sinnvolle Daten
stehen, ist rein vom Kontext der Applikation abhängig und meistens
leider auch vom Betriebssystem (nach meiner Erfahrung). Daten und
Applikation müssen zusammen passen und haben meist starke
Abhängigkeiten voneinander. In diesem Fall geht es um eine Textdatei,
in der nur '0', '1' und EOF vorkommen (lt. O-Poster).
Btw, Wenn ich mich unter Windows mit Get() durch eine Textdatei
schaufel:
std::ifstream myinput{"textdatei");
char c;
while(myinput) c = myinput.get();
Lese ich dann nicht auch die \r und \n Character mit, also beide getrennt?
Cheers,
Rudiger |
|
| Back to top |
|
 |
Georg Maaß Guest
|
Posted: Wed Nov 29, 2006 10:12 am Post subject: Re: Kann ich eine Textdatei Zeichenweise auslesen? |
|
|
Stefan Reuther wrote:
| Quote: | Du hast unterschlagen, woher du 'beliebige_stelle' nimmst. Portabel darf
dass nämlich nur ein Wert sein, den du von 'tellg' herbekommen hast
(folgt aus der Beschreibung der fseek-Funktion im C-Standard, auf die
die Beschreibung von seekg verweist).
Unter Unix klappt das mit beliebigen Zahlen. Aber bereits unter Windows
positionierst du damit unter Umständen in die Mitte eines Zeichens
(nämlich des \n, welches als \r\n in der Datei steht).
|
Ist das wirklich 1 Zeichen? Ist es nicht vielmehr eine
Steuerzeichen-Sequenz von 2 Zeichen?
Kann man nicht genau dieses Problem gerade eben dadurch ausgleichen, daß
man die Datei zum Lesen wahlweise binär oder als Text öffnet? |
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Wed Nov 29, 2006 3:21 pm Post subject: Re: Kann ich eine Textdatei Zeichenweise auslesen? |
|
|
Georg Maaß wrote:
| Quote: | Stefan Reuther wrote:
Du hast unterschlagen, woher du 'beliebige_stelle' nimmst. Portabel darf
dass nämlich nur ein Wert sein, den du von 'tellg' herbekommen hast
(folgt aus der Beschreibung der fseek-Funktion im C-Standard, auf die
die Beschreibung von seekg verweist).
Unter Unix klappt das mit beliebigen Zahlen. Aber bereits unter Windows
positionierst du damit unter Umständen in die Mitte eines Zeichens
(nämlich des \n, welches als \r\n in der Datei steht).
Ist das wirklich 1 Zeichen? Ist es nicht vielmehr eine
Steuerzeichen-Sequenz von 2 Zeichen?
|
Auf Ebene der Datei ja. Beim Einlesen wird es aber automatisch in ein
C++-Zeilenende konvertiert, und das besteht nur aus einem einzelnen
Zeichen. Natürlich kann es aber nur dann richtig konvertiert werden, wenn
man auch beide Bytes liest.
| Quote: | Kann man nicht genau dieses Problem gerade eben dadurch ausgleichen, daß
man die Datei zum Lesen wahlweise binär oder als Text öffnet?
|
Es geht ja speziell darum, was ein seekg bei Textdateien macht. Wenn die
Datei binär geöffnet wird, wird die Konvertierung halt gar nicht gemacht. |
|
| Back to top |
|
 |
Rud1ger Sch1erz Guest
|
Posted: Wed Nov 29, 2006 8:43 pm Post subject: Re: Kann ich eine Textdatei Zeichenweise auslesen? |
|
|
Rolf Magnus <ramagnus@t-online.de> writes:
| Quote: | Georg Maaß wrote:
Ist das wirklich 1 Zeichen? Ist es nicht vielmehr eine
Steuerzeichen-Sequenz von 2 Zeichen?
Auf Ebene der Datei ja. Beim Einlesen wird es aber automatisch in ein
C++-Zeilenende konvertiert, und das besteht nur aus einem einzelnen
Zeichen. Natürlich kann es aber nur dann richtig konvertiert werden, wenn
man auch beide Bytes liest.
|
Hast du da mal ein paar Zeilen Beispielcode?
Cheers,
Rudiger |
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Wed Nov 29, 2006 10:47 pm Post subject: Re: Kann ich eine Textdatei Zeichenweise auslesen? |
|
|
Rud1ger Sch1erz wrote:
| Quote: | Stefan Reuther <stefan.news (AT) arcor (DOT) de> writes:
,----
| std::ifstream myinput{"textdatei");
|
| myinput.seekg(beliebige_stelle);
Du hast unterschlagen, woher du 'beliebige_stelle' nimmst.
Die Ursprungsfrage war, ob man in einer Textdatei zum Lesen frei
positionieren kann. James meint (wenn ich ihn richtig verstanden
habe), das geht nicht, ich meine, das geht sehr wohl.
|
Nein, das geht nicht. Du kannst portabel nur an Stellen springen, wo do
schon gewesen bist (bzw. an den Anfang oder das Ende). "Frei
positionieren" ist bei mir was anderes.
| Quote: | Unter Unix klappt das mit beliebigen Zahlen. Aber bereits unter Windows
positionierst du damit unter Umständen in die Mitte eines Zeichens
(nämlich des \n, welches als \r\n in der Datei steht).
Ob an der Stelle, an die ich frei positioniere, sinnvolle Daten
stehen, ist rein vom Kontext der Applikation abhängig und meistens
leider auch vom Betriebssystem (nach meiner Erfahrung).
|
*Eben*. Du willst aber gerade iostreams verwenden, was C++'s Abstraktion
ist, die dich vom Betriebssystem unabhängig machen soll. Und die hat
bestimmte Restriktionen.
Wenn du bestimmte Eigenschaften des Parameters von 'seekg' ausnutzen
willst (z.B. "das ist die Anzahl Zeichen seit Dateianfang"), musst du
dich auf ein Betriebssystem bzw. eine Betriebssystemfamilie festlegen.
Und wenn du das tust, solltest du das schon dazusagen. Und wenn es eine
Möglichkeit gibt, eine solche Festlegung zu umgehen (z.B. Datei binär
öffnen, wo diese Restriktionen nicht zutreffen), nutze ich doch lieber die.
| Quote: | Btw, Wenn ich mich unter Windows mit Get() durch eine Textdatei
schaufel:
std::ifstream myinput{"textdatei");
char c;
while(myinput) c = myinput.get();
Lese ich dann nicht auch die \r und \n Character mit, also beide getrennt?
|
Nein, die C++-Runtime macht da ein Newline '\n' draus. Es ist also
möglich, dass ein 'get()' den 'tellg()'-Zeiger um 2 weiter setzt. Die
übersprungene Zahl ist dann kein gültiges Argument zu 'seekg()', bzw.
sie ergibt undefiniertes Verhalten.
Stefan |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Thu Nov 30, 2006 7:41 pm Post subject: Re: Kann ich eine Textdatei Zeichenweise auslesen? |
|
|
Rud1ger Sch1erz wrote:
| Quote: | Stefan Reuther <stefan.news (AT) arcor (DOT) de> writes:
Rud1ger Sch1erz wrote:
"James Kanze" <james.kanze (AT) gmail (DOT) com> writes:
Amstonsten: du kannst leider nicht auf eine beliebige Stelle in
einer Textdatei positionnieren. Du musst sie also als binäre
Datei offnen.
Wie kommst du denn auf *den* dürren Ast?
Was ist dann:
,----
| std::ifstream myinput{"textdatei");
|
| myinput.seekg(beliebige_stelle);
Du hast unterschlagen, woher du 'beliebige_stelle' nimmst.
Die Ursprungsfrage war, ob man in einer Textdatei zum Lesen frei
positionieren kann. James meint (wenn ich ihn richtig verstanden
habe), das geht nicht, ich meine, das geht sehr wohl.
|
Es geht auch nicht. Laut ISO 14882:
pos_type seekpos(pos_type sp ,
ios_base::openmode which = ios_base::in | ios_base::out);
Alters the file position, if possible, to correspond to the
position stored in sp (as described below). [...]
If sp has not been obtained by a previous successful call to
one of the positioning functions (seekoff or seekpos) on the
same file the effects are undefined.
Jetzt besteht die Frage, woher kommt beliebige_stelle? Du kannst
wohl an eine beliebige Stell positionnieren, wo du vorher
gewesen warst, wenn du dort tellg aufgerufen hast. Mit
»beliebiger Stelle« aber meinte ich, auf dem n-ten Zeichen, wo n
ein beliebiger ganzzahliger Wert ist. Und das geht halt nicht;
ist ist sogar nicht garantiert, dass du einen int-Wert in
streampos umwandeln kannst.
| Quote: | Portabel darf
dass nämlich nur ein Wert sein, den du von 'tellg' herbekommen hast
(folgt aus der Beschreibung der fseek-Funktion im C-Standard, auf die
die Beschreibung von seekg verweist).
Unter Unix klappt das mit beliebigen Zahlen. Aber bereits unter Windows
positionierst du damit unter Umständen in die Mitte eines Zeichens
(nämlich des \n, welches als \r\n in der Datei steht).
Ob an der Stelle, an die ich frei positioniere, sinnvolle Daten
stehen, ist rein vom Kontext der Applikation abhängig und meistens
leider auch vom Betriebssystem (nach meiner Erfahrung).
|
Die Geschichte mit den CR-LF ist nur ein einfaches Beispiel, die
jeder kennt. Was passiert mit multi-byte Codierungen? Oder auf
einem Betriebssystem, wo Textdateien in Sätzen fester Länge
gespeichert sind, wobei die Sätze nicht immer voll sind.
| Quote: | Daten und
Applikation müssen zusammen passen und haben meist starke
Abhängigkeiten voneinander. In diesem Fall geht es um eine Textdatei,
in der nur '0', '1' und EOF vorkommen (lt. O-Poster).
Btw, Wenn ich mich unter Windows mit Get() durch eine Textdatei
schaufel:
std::ifstream myinput{"textdatei");
char c;
while(myinput) c = myinput.get();
Lese ich dann nicht auch die \r und \n Character mit, also beide getrennt?
|
Normallerweise nicht, es sei dann, du hast die Datei in binärem
Modus geöffnet.
Die Abstraktion liegt aber etwas höher. Eine Text-Datei ist
zuerst eine Folge von Zeilen. Wie das System die Zeilen in
Dateien darstellt, soll eigentlich transparent sein; innerhalb
eines C++-Programmes endet jede Zeile mit einem '\n' Zeichen.
(Das heißt z.B., das wenn du close beim Schreiben einer
Text-Datei machst, und das letzt geschriebene Zeichen nicht '\n'
war, hast du auch ein undefiniertes Verhalten.) Also z.B. gibt
(oder mindestens gab) es Betriebssysteme, wo Text-Dateien in
Sätzen fester Länge geschrieben wurden, mit jedem Satz eine
Zeile (die in der Datei am Ende mit Leerzeichen ausgefüllt wird,
die beim Lesen entfernt werden). Auch unter Windows könnte (und
eigentlich sollte) die Implementierung ein LF ohne vorherige CR
als Fehler betrachten. (Dazu habe ich mindestens eine
Implementierung gesehen, wo die Daten in einer Text-Datei in
EBCDIC waren, obwohl man innerhalb des C-Programmes in ASCII
arbeitet. Auch heute ist es vorstellbar, dass man intern in ISO
8859-15 arbeitet, extern aber mit UTF-8. Also z.B. wenn du einen
char mit dem Wert 0xC4 ('Ä') schreibst, zwei Bytes, 0xC3,0x84
in die Datei geschrieben werden.)
Zufälligerweise (obwohl es tatsächlich kein Zufall war)
entspricht diese interne Darstellung unter Unix genau der
Darstellung in der Datei. Damit kann man pratisch den
Unterschied zwischen Text-Dateien und binären Dateien unter Unix
vergessen. Nur aber unter Unix -- ich kenne kein anderes
Betriebssystem, wo dies der Fall ist. Also, wenn man nicht einen
Strom von Zeilen hat, dann muss man normalerweise in binärem
Modus lesen und schreiben.
--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Thu Nov 30, 2006 8:01 pm Post subject: Re: Kann ich eine Textdatei Zeichenweise auslesen? |
|
|
Rud1ger Sch1erz wrote:
| Quote: | Rolf Magnus <ramagnus@t-online.de> writes:
Georg Maaß wrote:
Ist das wirklich 1 Zeichen? Ist es nicht vielmehr eine
Steuerzeichen-Sequenz von 2 Zeichen?
Auf Ebene der Datei ja. Beim Einlesen wird es aber automatisch in ein
C++-Zeilenende konvertiert, und das besteht nur aus einem einzelnen
Zeichen. Natürlich kann es aber nur dann richtig konvertiert werden, wenn
man auch beide Bytes liest.
Hast du da mal ein paar Zeilen Beispielcode?
|
Wenn du nur sehen willst, was Windows tut, reicht es aus, ein
Paar Zeilen in Text-Modus auszuschreiben, und die in binärem
Modus wieder einzulesen.
Da es aber scheint, dass viele den formellen Unterschied nicht
kenne, erlaube ich mich aus der C-Norm zu zitieren:
Input and output, whether to or from physical devices such
as terminals and tape drives, or whether to or from files
supported on structured storage devices, are mapped into
logical data streams, whose properties are more uniform than
their various inputs and outputs. Two forms of mapping are
supported, for text streams and for binary streams.
A text stream is an ordered sequence of characters composed
into lines, each line consisting of zero or more characters
plus a terminating new-line character. Whether the last line
requires a terminating new-line character is
implementation-defined. Characters may have to be added,
altered, or deleted on input and output to conform to
differing conventions for representing text in the host
environment. Thus, there need not be a onetoone
correspondence between the characters in a stream and those
in the external representation. Data read in from a text
stream will necessarily compare equal to the data that were
earlier written out to that stream only if: the data consist
only of printing characters and the control characters
horizontal tab and new-line; no new-line character is
immediately preceded by space characters; and the last
character is a new-line character. Whether space characters
that are written out immediately before a new-line character
appear when read in is implementation-defined.
A binary stream is an ordered sequence of characters that
can transparently record internal data. Data read in from a
binary stream shall compare equal to the data that were
earlier written out to that stream, under the same
implementation. Such a stream may, however, have an
implementation-defined number of null characters appended to
the end of the stream.
Beachte besonders den zweiten Absatz. Als die C-Norm geschrieben
wurde, gab es noch viele Systeme, die Zeilen in Dateisätzen
feste Länge speichert. Die Norm wurde also ausdrucklich so
formuliert, dass eine Implementierung Zeilen auf einer festen
Länge ausfüllen, und diese zusätzlichen Zeichen beim Lesen
entfernen darf (und dass das Zeichen '\n' in gar nichts in der
Datei umgemappt wird). Oder dass eine Implementierung intern
ASCII verwenden darf, extern aber EBCDIC. Oder dass sie nicht
druckbare Zeichen für besondere Zwecke benutzen darf, z.B. 0x1A
als Dateiende.
Die C++-Norm bezieht sich auf diesem Text. Hat es aber noch
verkopliziert, indem sie eine zusätzliche Phase
locale-abhängiger Codeumwandlung zugefügt hat, die unabhängig
des Ein- und Ausgabemodus stattfinden.
Wenn man all dies in Betracht nimmt, versteht man wohl, warum
man nicht auf einer beliebigen Stelle seeken darf.
--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|