Heim  >  Artikel  >  Backend-Entwicklung  >  C-basierte Dateioperationen (FILE*, fstream, windowsAPI)

C-basierte Dateioperationen (FILE*, fstream, windowsAPI)

php是最好的语言
php是最好的语言Original
2018-08-10 11:27:392395Durchsuche

C-basierte Dateioperationen

In ANSI C gibt es zwei Möglichkeiten, Dateien zu bedienen, nämlich Streaming-Dateioperationen und I/O-Dateioperationen, die im Folgenden vorgestellt werden.

1. Streaming-Dateioperation

Diese Methode der Dateioperation hat eine wichtige Struktur: FILE ist in der Header-Datei stdio.h wie folgt definiert:

typedef struct {int level;unsigned flags;char fd;unsigned char hold;int bsize;unsigned char _FAR *buffer;unsigned char _FAR *curp;unsigned istemp;short token;
} FILE;

FILE This Die Struktur enthält die grundlegenden Attribute von Dateioperationen. Die häufig verwendeten Funktionen für solche Dateioperationen sind in der folgenden Tabelle aufgeführt: Funktion Funktion
fclose(. ) Schließen Sie den Stream
fputc() Schreiben Sie ein Zeichen in den Stream
fgetc() Lesen Sie ein Zeichen aus dem Stream
fseek() Suchen Sie das angegebene Zeichen im Stream
fputs() Schreiben Sie die Zeichenfolge to Stream
fgets() Liest eine Zeile oder bestimmte Zeichen aus dem Stream
fprintf() Ausgabe an den Stream im Format
fscanf() Liest aus dem Stream im Format
feof() Wenn das Ende der Datei erreicht ist. Gibt den wahren Wert zurück.
ferror() Gibt seinen Wert zurück, wenn ein Fehler auftritt.
rewind() Setzt den Datei-Locator auf den Anfang der Datei zurück.
remove() Löscht die Datei.
fread () Lies die angegebene Anzahl aus den Stream-Zeichen
fwrite() schreibt die angegebene Anzahl von Zeichen in den Stream
tmpfile() generiert einen temporären Dateistream
tmpnam() generiert einen eindeutigen Dateinamen

Lassen Sie es uns unten vorstellen. Diese Funktionen

1.fopen()

Der Prototyp von fopen ist: FILE *fopen(const char *filename, const char *mode), fopen implementiert drei Funktionen

zur Verwendung Einen Stream öffnen

Eine Datei mit diesem Stream verbinden
Einen FILR-Zeiger auf diesen Stream zurückgeben
Der Parameter Dateiname zeigt auf den Namen der Datei, die geöffnet werden soll, und Modus stellt eine Zeichenfolge dar Seine Werte lauten wie folgt:

Stringbedeutung

r öffnet eine schreibgeschützte Datei, die Datei muss vorhanden sein.
r+ öffnet eine lesbare und beschreibbare Datei. Die Datei muss vorhanden sein.
rb+ öffnet eine Binärdatei zum Lesen und Schreiben und erlaubt nur das Lesen und Schreiben von Daten.
 rt+ read and write öffnet eine Textdatei, die Lesen und Schreiben ermöglicht.
 w Öffnen Sie eine schreibgeschützte Datei. Wenn die Datei vorhanden ist, wird die Dateilänge auf 0 gelöscht, d. h. der Dateiinhalt verschwindet. Wenn die Datei nicht vorhanden ist, erstellen Sie die Datei.
 w+ öffnet eine lesbare und beschreibbare Datei. Wenn die Datei vorhanden ist, wird die Dateilänge auf Null gelöscht, d. h. der Dateiinhalt verschwindet. Wenn die Datei nicht vorhanden ist, erstellen Sie die Datei.
a Öffnen Sie eine schreibgeschützte Datei im Anhängemodus. Wenn die Datei nicht vorhanden ist, wird die Datei erstellt. Wenn die Datei vorhanden ist, werden die geschriebenen Daten am Ende der Datei hinzugefügt, dh der ursprüngliche Inhalt der Datei bleibt erhalten. (EOF-Zeichen sind reserviert)
 a+ Öffnen Sie eine Lese-/Schreibdatei im Anhängemodus. Wenn die Datei nicht vorhanden ist, wird die Datei erstellt. Wenn die Datei vorhanden ist, werden die geschriebenen Daten am Ende der Datei hinzugefügt, dh der ursprüngliche Inhalt der Datei bleibt erhalten. (Das ursprüngliche EOF-Zeichen bleibt nicht erhalten)
wb Öffnen oder erstellen Sie eine neue Binärdatei nur zum Schreiben.
wb+ lesen und schreiben Öffnen oder erstellen Sie eine Binärdatei, die Lesen und Schreiben ermöglicht.
wt+ Lesen und Schreiben Das Öffnen oder Erstellen einer Textdatei ermöglicht das Lesen und Schreiben.
AT+ liest und schreibt, um eine Textdatei zu öffnen, sodass Daten gelesen oder an das Ende des Textes angehängt werden können.
Ab+ öffnet eine Binärdatei zum Lesen und Schreiben und ermöglicht das Lesen oder Anhängen von Daten am Ende der Datei.

Eine Datei kann im Textmodus oder im Binärmodus geöffnet werden. Der Unterschied zwischen beiden besteht darin, dass der Wagenrücklauf im Textmodus als ein Zeichen „n“ betrachtet wird, während er im Binärmodus als zwei betrachtet wird Zeichen 0x0D, 0x0A ; Wenn 0x1B in der Datei gelesen wird, geht der Textmodus davon aus, dass dies das Ende der Datei ist, d. h. das Binärmodell verarbeitet die Datei nicht und der Textmodus konvertiert die Daten entsprechend in eine bestimmte Weg.

Das System öffnet standardmäßig im Textmodus. Sie können den Wert aller Variablen ändern: _fmode=O_TEXT; setzt den Standardöffnungsmodus auf Textmodus. Stellen Sie dann den Standardöffnungsmodus auf den Binärmodus ein.

Diese Funktion gibt einen FILE-Zeiger zurück, sodass es nicht erforderlich ist, ihn nach der Deklaration eines FILE-Zeigers zu initialisieren. Stattdessen wird fopen() verwendet, um einen Zeiger zurückzugeben und ihn mit einer bestimmten Datei zu verbinden schlägt fehl, NULL wird zurückgegeben.

Beispiel:

FILE *fp;

if(fp=fopen("123.456","wb"))
puts("Datei erfolgreich geöffnet"); >else
puts("Erfolg oder Misserfolg beim Öffnen der Datei");

2.fclose()

Die Funktion von fclose() besteht darin, die mit fopen() geöffnete Datei zu schließen ist: int fclose( FILE *fp); Bei Erfolg 0 zurückgeben, EOF nicht zurückgeben.


Denken Sie unbedingt daran, die geöffnete Datei zu schließen, wenn das Programm beendet wird, da sonst Daten verloren gehen können. Ich habe diesen Fehler schon oft gemacht.

Beispiel: fclose(fp);

3.fputc()

Schreiben Sie ein Zeichen in den Stream, der Prototyp ist int fputc(int c, FILE *stream); Gibt dies zurück Zeichen erfolgreich, gibt bei Fehler EOF zurück.


Beispiel: fputc('X',fp);

4.fgetc()

Liest ein Zeichen aus dem Stream, der Prototyp ist int fputc(FILE *stream); Return erfolgreich Dieses Zeichen gibt bei einem Fehler EOF zurück.


Beispiel: char ch1=fgetc(fp);

    fseek()
  1. Diese Funktion wird im Allgemeinen in Dateien verwendet, die im Binärmodus geöffnet werden lokalisieren Die angegebene Position im Stream, der Prototyp ist int fseek(FILE *stream, long offset, int wherece); wenn es erfolgreich 0 zurückgibt, ist der Parameter offset die Anzahl der verschobenen Zeichen, wherece ist die Basis der Bewegung und die Wert ist

Referenzposition des symbolischen konstanten Werts
SEEK_SET 0 Anfang der Datei
SEEK_CUR 1 Aktuelle Lese- und Schreibposition
SEEK_END 2 Ende der Datei

Beispiel: fseek (fp, 1234L,SEEK_CUR);//Bewegen Sie die Lese- und Schreibposition um 1234 Bytes von der aktuellen Position nach hinten (L-Suffix gibt eine lange Ganzzahl an)

fseek(fp,0L,2);//Verschieben Sie die Position am Ende der Datei lesen und schreiben

6.fputs()
Schreiben Sie einen String in den Stream, Prototyp int fputs(const char *s, FILE *stream);

Beispiel : fputs("I Love You",fp);

7.fgets()
Eine Zeile lesen oder Zeichen aus dem Stream angeben. Der Prototyp ist char *fgets(char *s, int n, FILE *stream); from Liest n-1 Zeichen aus dem Stream, der Parameter s wird zum Empfangen der Zeichenfolge verwendet. Bei Erfolg wird der Zeiger von s zurückgegeben, andernfalls wird NULL zurückgegeben.

Beispiel: Wenn der Text der aktuellen Position einer Datei wie folgt lautet:

Love, I Have

Aber……..

Bei Verwendung

fgets(str1,4,file1);

Nach der Ausführung von str1="Lov" werden 4-1=3 Zeichen gelesen, und wenn Sie

fgets( verwenden str1, 23,file1);

Führen Sie dann str="Love, I Have" aus und lesen Sie eine Zeile (mit Ausnahme des „n“ am Ende der Zeile).

8.fprintf()
Eingabe in den Stream entsprechend dem Format, sein Prototyp ist int fprintf(FILE *stream, const char *format[, argument, …]); seine Verwendung ist die gleiche wie printf(), aber anstatt in die Konsole zu schreiben, schreibt es in den Stream

Beispiel: fprintf(fp“,-%s“,4“,Hahaha“);

9 .fscanf()
Aus dem Stream im Format lesen, sein Prototyp ist int fscanf(FILE *stream, const char *format[, address, …]); seine Verwendung ist die gleiche wie scanf(), aber statt lesen von der Konsole, lesen Sie einfach aus dem Stream.

Beispiel: fscanf(fp,"%d%d",&x,&y);

10.feof()
Überprüfen Sie, ob das Ende der Datei erreicht wurde, und Wenn ja, geben Sie true zurück, andernfalls wird 0 zurückgegeben, sein Prototyp ist int feof(FILE *stream);

Beispiel: if(feof(fp))printf("Das Ende der Datei wurde erreicht");

11.ferror()
Der Prototyp ist int ferror(FILE *stream); gibt den neuesten Fehlercode des Streams zurück, der durch clearerr() gelöscht werden kann void clearerr(FILE *stream);

Beispiel: printf(“%d”,ferror(fp));

12.rewind()
Gibt die aktuelle Lese- und Schreibposition zurück zum Anfang der Datei. Der Prototyp ist void rewind(FILE *stream); Tatsächlich entspricht dies der Funktion fseek(fp,0L,SEEK_SET);

Beispiel: rewind(fp);

13.remove()
Eine Datei löschen, der Prototyp ist int remove(const char * filename); Der Parameter ist der zu löschende Dateiname, und bei Erfolg wird 0 zurückgegeben.

Beispiel: remove("c:io.sys");

14.fread()
Lesen Sie die angegebene Anzahl von Zeichen aus dem Stream, der Prototyp ist size_t fread(void ptr, size_t size, size_t n, FILE *stream); Der Parameter ptr dient zum Speichern der gelesenen Daten. Der Zeiger von void kann durch einen beliebigen Zeigertyp ersetzt werden, z. B. char*, int *, usw.; Größe ist die Anzahl der gelesenen Blöcke; n ist die Anzahl der gelesenen Blöcke. Diese Funktion wird im Allgemeinen in Dateien verwendet, die im Binärmodus geöffnet sind.

Beispiel:

char x[4230];
FILE *file1=fopen(“c:msdos.sys”,r”);

fread( x,200,12 ,file1);//Lesen Sie insgesamt 200*12=2400 Bytes

15.fwrite()
entspricht fread und schreibt die angegebenen Daten in den Stream Der Prototyp ist size_t fwrite(const void ptr, size_t size, size_t n, FILE *stream); Der Parameter ptr ist der zu schreibende Datenzeiger. Der Zeiger von void kann durch einen beliebigen Zeigertyp ersetzt werden as char*, int * usw. zum Ersetzen; n ist die Anzahl der zu schreibenden Blöcke; bei Erfolg wird die tatsächliche Anzahl der geschriebenen Blöcke zurückgegeben. Diese Funktion wird im Allgemeinen für Dateien verwendet, die im Binärmodus geöffnet werden.

Beispiel:

char x[]=“I Love You“;
fwire(x, 6,12,fp);//Schreibe 6*12=72 Bytes

Schreibt „I Love“ 12 Mal in den Stream-FP, insgesamt 72 Bytes

16.tmpfile()
Der Prototyp ist FILE *tmpfile(void); generiert eine temporäre Datei , wird im „w+b“-Modus geöffnet und gibt den Zeiger dieses temporären Streams oder NULL zurück, wenn ein Fehler auftritt. Am Ende des Programms wird diese Datei automatisch gelöscht.

Beispiel: FILE *fp=tmpfile();

17.tmpnam();
Der Prototyp ist char *tmpnam(char *s); generiert einen eindeutigen Dateinamen, In Tatsächlich ruft tmpfile() diese Funktion auf, um den erhaltenen Dateinamen zu speichern und diesen Zeiger zurückzugeben. Wenn dies fehlschlägt, wird NULL zurückgegeben.

Beispiel: tmpnam(str1);

2. Direkte E/A-Dateioperation

Dies ist eine weitere von C bereitgestellte Dateioperation, die durch direktes Speichern/Abrufen erfolgt Datei, um die Dateiverarbeitung abzuschließen, und die im vorherigen Artikel erwähnte Streaming-Dateioperation wird über den Puffer ausgeführt. Die Streaming-Dateioperation wird um einen FILE-Zeiger herum ausgeführt, und diese Art von Dateioperation wird um das „Handle“ einer Datei herum ausgeführt Fahren wir fort: Was ist ein Griff? Es handelt sich um eine Ganzzahl und ein eindeutiges Token, das vom System zur Identifizierung einer Datei verwendet wird (in WINDOWS wird das Handle-Konzept auf die Identifizierung aller Geräteressourcen erweitert). Die häufig verwendeten Funktionen für solche Dateioperationen sind wie folgt. Diese Funktionen und einige der verwendeten Symbole sind in io.h und fcntl.h definiert. Bei ihrer Verwendung müssen die entsprechenden Header-Dateien hinzugefügt werden.

Funktionsbeschreibung
open() öffnet eine Datei und gibt ihr Handle zurück
close() schließt ein Handle
lseek() sucht den angegebenen Speicherort der Datei
read()-Block Lesen Sie die Datei
write() Schreiben Sie die Datei in Blöcken
eof() Testen Sie, ob die Datei beendet ist
filelength() Holen Sie sich die Dateilänge
rename() Benennen Sie die Datei um
chsize( ) Ändern Sie die Dateilänge

Diese Funktionen werden im Folgenden einzeln erklärt:

1.open()
Öffnen Sie eine Datei und geben Sie ihr Handle zurück. Wenn dies fehlschlägt, wird ein Wert kleiner als 0 zurückgegeben. Der Prototyp ist int open(const char *path, int access [, unsigned mode]. ); Der Parameterpfad ist der Name der zu öffnenden Datei, der Zugriff ist der zu öffnende Modus und der Modus ist optional. Gibt die Attribute der Datei an und wird hauptsächlich in UNIX-Systemen verwendet. Dieser Parameter hat unter DOS/WINDOWS keine Bedeutung. Die Dateiöffnungsmodi sind wie folgt.

Symbolbedeutung Symbolbedeutung Symbolbedeutung
O_RDONLY Nur-Lese-Modus O_WRONLY Nur-Schreib-Modus O_RDWR Lese-/Schreibmodus
O_NDELAY Wird in UNIX-Systemen verwendet O_APPEND Anhängemodus O_CREAT Erstellen Sie die Datei, wenn sie nicht vorhanden ist
O_TRUNC Schneidet die Dateilänge auf 0 ab. O_EXCL wird zusammen mit O_CREAT verwendet. Wenn die Datei vorhanden ist, wird ein Fehler zurückgegeben der „|“-Operator zum Verbinden, z. B. O_APPEND|O_TEXT Zeigt das Öffnen der Datei im Textmodus und im Anhängemodus an.

Beispiel: int handle=open(“c:msdos.sys”,O_BINARY|O_CREAT|O_WRITE)

2.close()

Schließen Sie ein Handle, der Prototyp ist int close ( int handle); bei Erfolg 0 zurückgeben

Beispiel: close(handle)

3.lseek()

Lokalisieren Sie die angegebene Position, der Prototyp ist: long lseek(int handle, long offset, int fromwhere); aktuelle Position der Datei; SEEK_END: ​​​​das Ende der Datei. Diese Funktion gibt nach der Ausführung den neuen Zugriffsort der Datei zurück.

Beispiel:

lseek(handle,-1234L,SEEK_CUR);//Verschiebe die Zugriffsposition um 1234 Bytes von der aktuellen Position nach vorne.

x=lseek(hnd1,0L,SEEK_END);// Verschieben Sie die Zugriffsposition an das Ende der Datei, x=Die Position des Dateiendes ist die Dateilänge

4.read ()
Aus der Datei wird ein Block gelesen, der Prototyp ist int read(int handle, void *buf, unsigned len); der Parameter buf speichert die gelesenen Daten und len sind die gelesenen Bytes. Die Funktion gibt die tatsächlich gelesenen Bytes zurück.

Beispiel: char x[200];read(hnd1,x,200);

5.write()

Schreiben Sie ein Datenelement in die Datei, der Prototyp ist int write(int handle, void *buf, unsigned len); Die Bedeutung der Parameter ist die gleiche wie bei read() und es werden die tatsächlich geschriebenen Bytes zurückgegeben.

Beispiel: char x[]=“I Love You“;write(handle,x,strlen(x));

7.eof()

Ähnlich wie feof() , Testet, ob die Datei beendet ist, gibt 1 zurück, andernfalls gibt 0 zurück; der Prototyp ist: int eof(int handle);

Beispiel: while(!eof(handle1)){……};

8.filelength()

Gibt die Dateilänge zurück, der Prototyp ist long filelength(int handle); entspricht lseek(handle,0L,SEEK_END)

Beispiel: long x=filelength(handle );

9.rename()

Benennen Sie die Datei um, der Prototyp ist int rename(const char *oldname, const char *newname); Der Parameter oldname ist der alte Dateiname und newname ist der neuer Dateiname. Gibt erfolgreich 0 zurück. Prototyp Es ist int chsize (int handle, long size); der Parameter size stellt die neue Länge der Datei dar und gibt bei Erfolg 0 zurück, andernfalls wird -1 zurückgegeben. Wenn die angegebene Länge kleiner als die Dateilänge ist abgeschnitten werden; wenn die angegebene Länge größer als die Dateilänge ist, dann am Ende der Datei hinzufügen

ios::app: Öffne die Datei im Anhängemodus
ios::ate: Nachdem die Datei geöffnet wurde, wird sie am Ende der Datei positioniert, ios:app enthält dieses Attribut
ios:: binär: Datei im Binärmodus öffnen, der Standardmodus ist der Textmodus. Der Unterschied zwischen den beiden Methoden wird im vorherigen Artikel gezeigt
ios::in: Die Datei wird im Eingabemodus geöffnet (Datei => Programm)
ios::out: Die Datei wird im Ausgabemodus geöffnet (Programm => Datei)
ios::nocreate: Erstellt die Datei nicht, daher schlägt das Öffnen fehl, wenn die Datei nicht existiert.
ios::noreplace: Überschreibt die Datei nicht, daher schlägt das Öffnen der Datei fehl, wenn die Datei vorhanden ist
ios::trunc: Wenn die Datei vorhanden ist, ersetzen Sie die Datei. Die Länge ist auf 0 gesetzt.
Sie können „oder“ verwenden, um die oben genannten Attribute zu verbinden, z. B. ios::out|ios::binary

Der Attributwert der geöffneten Datei ist:

0: Gewöhnliche Datei, für Zugriff geöffnet
1: Schreibgeschützte Datei
2: Versteckte Datei
4: Systemdatei
Sie können „oder“ oder „+“ verwenden, um die oben genannten Attribute zu verbinden, z. B. 3 oder 1 |2, um die Datei mit schreibgeschützten und impliziten Attributen zu öffnen.

Zum Beispiel: Öffnen Sie die Datei c:config.sys im Binäreingabemodus

fstream file1;
file1.open(“c:config.sys”,ios::binary| ios: :in,0);

Wenn die Öffnungsfunktion nur einen Parameter hat, den Dateinamen, wird sie zum Lesen/Schreiben gewöhnlicher Dateien geöffnet, das heißt:

file1.open( "c:config.sys" );96b4fef55684b9312718d5de63fb7121file1.open(“c:config.sys”,ios::in|ios::out,0);

Außerdem hat fstream Dieselbe Struktur wie die Funktion open(). Für das obige Beispiel kann die Datei geöffnet werden, wenn sie definiert ist:

fstream file1(“c:config.sys”);

Insbesondere , fstream hat zwei Unterklassen: ifstream (Eingabedateistream) und ofstream (Ausgabedateistream). ifstream öffnet die Datei standardmäßig im Eingabemodus (Datei => Programm) und ofstream öffnet die Datei standardmäßig im Ausgabemodus.

ifstream file2("c:pdos.def");//Öffne die Datei im Eingabemodus
ofstream file3("c:x.123");//Öffne die Datei im Ausgabemodus

Wählen Sie also in tatsächlichen Anwendungen verschiedene Klassen aus, um sie entsprechend den unterschiedlichen Anforderungen zu definieren: Wenn Sie im Eingabemodus öffnen möchten, verwenden Sie ifstream, um zu definieren; Sie möchten im Ausgabemodus öffnen, verwenden Sie ofstream zum Definieren. Um im Eingabe-/Ausgabemodus zu öffnen, verwenden Sie fstream, um es zu definieren.

2. Schließen Sie die Datei
Die geöffnete Datei muss nach der Verwendung geschlossen werden. fstream stellt die Mitgliedsfunktion close() bereit, um diesen Vorgang abzuschließen, z. B.: file1.close(). ; Schließen Sie einfach die mit Datei1 verbundene Datei.

3. Das Lesen und Schreiben von Dateien ist in das Lesen von Textdateien und Binärdateien unterteilt. Das Lesen von Textdateien ist relativ einfach. Das ist alles Beim binären Lesen ist es komplizierter. Die folgenden zwei Methoden werden im Detail vorgestellt.

1. Das Lesen und Schreiben von Textdateien ist sehr einfach: Verwenden den Inserter (e3bf3651b38af900798f9013b6649213>) zur Eingabe aus der Datei verwenden. Nehmen Sie an, dass Datei1 als Eingabe und Datei2 als Ausgabe geöffnet wird. Ein Beispiel ist wie folgt:

file2<<"I Love You";//Schreiben Sie die Zeichenfolge „I Love You“ in die Datei int i; //From File input ist ein ganzzahliger Wert.

Diese Methode verfügt auch über eine einfache Formatierungsfunktion. Sie können beispielsweise die Ausgabe als Hexadezimalzahl usw. angeben. Die spezifischen Formate sind wie folgt:


Eingabe/Ausgabe der Manipulatorfunktion
Dez-Formate dezimale numerische Dateneingabe und -ausgabe

endl gibt ein Zeilenumbruchzeichen aus und aktualisiert diese Stream-Ausgabe

ends gibt eine Nullzeichenausgabe aus

hex formatiert hexadezimale numerische Dateneingabe und -ausgabe

oct wird als oktale numerische Dateneingabe formatiert und Ausgabe
setpxecision(int p) legt die Anzahl der Präzisionsstellen für die Gleitkommaausgabe fest

Um beispielsweise 123 hexadezimal auszugeben: file1<<< ;123;Um 3,1415926 mit 5 Ziffern auszugeben Präzision: Datei1<<<3.1415926.


2. Lesen und Schreiben von Binärdateien

①put()

put()-Funktion schreibt ein Zeichen in den Stream, sein Prototyp ist ofstream &put(char ch), verwenden Es ist auch relativ einfach, wie zum Beispiel file1.put('c'); das heißt, ein Zeichen 'c' in den Stream zu schreiben.

②get() Die get()-Funktion ist flexibler und verfügt über drei häufig verwendete überladene Formen:

Eine davon ist die Form, die put() entspricht: ifstream &get(char &ch ) ;Die Funktion besteht darin, ein Zeichen aus dem Stream zu lesen und das Ergebnis im Referenzch zu speichern. Wenn es das Ende der Datei erreicht, wird ein Nullzeichen zurückgegeben. Beispielsweise bedeutet file2.get(x); das Lesen eines Zeichens aus der Datei und das Speichern des gelesenen Zeichens in x.

Der Prototyp eines anderen überladenen Formulars ist: int get(); Dieses Formular gibt ein Zeichen aus dem Stream zurück. Wenn das Ende der Datei erreicht ist, wird EOF zurückgegeben, z. B. x=file2.get(). ; und Die Funktion des obigen Beispiels ist dieselbe.

Es gibt eine andere Form des Prototyps: ifstream &get(char *buf,int num,char delim='n'); diese Form liest Zeichen in das Array, auf das buf zeigt, bis num in Zeichen oder dem gelesen wird Das durch delim angegebene Zeichen wird gefunden. Wenn der delim-Parameter nicht verwendet wird, wird das Standard-Neuzeilenzeichen „n“ verwendet. Zum Beispiel:

file2.get(str1,127,'A');//Zeichen aus der Datei in Zeichenfolge str1 lesen, beenden, wenn das Zeichen „A“ angetroffen wird oder 127 Zeichen gelesen werden.

③Datenblöcke lesen und schreiben
Um binäre Datenblöcke zu lesen und zu schreiben, verwenden Sie die Mitgliedsfunktionen read() und write(). Ihre Prototypen lauten wie folgt:

read(unsigned char *buf, int num );
write(const unsigned char *buf,int num);

read() liest num Zeichen aus der Datei in den Puffer, auf den buf zeigt, wenn num Zeichen noch nicht gelesen wurden Wenn das Ende der Datei erreicht ist, können Sie die tatsächliche Anzahl der gelesenen Zeichen mit write() aus dem Cache abrufen, auf den buf zeigt Beachten Sie, dass der Cache-Typ unsigned char * ist. Manchmal ist möglicherweise eine Typkonvertierung erforderlich.

Beispiel:

unsigned char str1[]=“I Love You“;
int n[5]; >ofstream out(“yyy.yyy”);
out.write(str1,strlen(str1));//Alle Zeichenfolge str1 in yyy.yyy schreiben
in.read((unsigned char* )n, sizeof(n));//Lesen Sie die angegebene Ganzzahl aus xxx.xxx und achten Sie auf die Typkonvertierung
in.close();out.close();

vier , EOF erkennen

Die Mitgliedsfunktion eof() wird verwendet, um zu erkennen, ob das Ende der Datei erreicht ist. Wenn das Ende der Datei erreicht ist, wird ein Wert ungleich Null zurückgegeben, andernfalls wird 0 zurückgegeben. Der Prototyp ist int eof();
Beispiel: if(in.eof())ShowMessage("Das Ende der Datei wurde erreicht!");

Dateipositionierung

und C Der Unterschied bei Dateioperationen besteht darin, dass das C++-E/A-System zwei Zeiger verwaltet, die einer Datei zugeordnet sind. Einer ist der Lesezeiger, der den Speicherort des Eingabevorgangs in der Datei angibt; der andere ist der Schreibzeiger, der den Speicherort des nächsten Schreibvorgangs angibt. Bei jeder Eingabe oder Ausgabe ändert sich der entsprechende Zeiger automatisch. Daher ist die Positionierung von C++-Dateien in die Positionierung von Lesepositionen und Schreibpositionen unterteilt. Die entsprechenden Mitgliedsfunktionen sind seeg() und seeg() zum Festlegen der Leseposition, und seenp dient zum Festlegen der Schreibposition. Ihre häufigsten Formen sind wie folgt:


istream &seekg(streamoff offset,seek_dir origin);

ostream &seekp(streamoff offset,seek_dir origin);


streamoff ist in iostream.h definiert , Definieren Sie den maximalen Wert, der durch offset erhalten werden kann. Es handelt sich um eine Aufzählung mit den folgenden Werten:

ios::beg: Beginn der Datei

ios::cur : Aktuelle Position der Datei

ios::end: Dateiende
Diese beiden Funktionen werden im Allgemeinen für Binärdateien verwendet, da Textdateien aufgrund der Zeicheninterpretation des Systems vom erwarteten Wert abweichen können.

Beispiel:

file1.seekg(1234,ios::cur);//Bewegen Sie den Lesezeiger der Datei von der aktuellen Position um 1234 Bytes nach hinten

file2.seekp( 1234 ,ios::beg);//Bewegen Sie den Schreibzeiger der Datei 1234 Bytes vom Anfang der Datei zurück


WINAPI-basierter Dateibetrieb

WINAPI bietet zwei Eine Gruppe Die Anzahl der Dateioperationsfunktionen dient der Kompatibilität mit 16-Bit-Programmen und ist relativ einfach. Die andere Gruppe ist speziell für 32-Bit-Programme konzipiert und schwieriger zu verwenden. Im Folgenden werde ich diese beiden Funktionsgruppen auflisten 🎜>

1. Eine Reihe von Funktionen, die mit 16-Bit-Programmen kompatibel sind

⑴_lopen Prototyp: HFILE _lopen(

LPCSTR lpPathName, // Dateiname

int iReadWrite //Dateizugriffsmethode
);

Funktion: Öffnen Sie die Datei und geben Sie ihr Handle erfolgreich zurück. Ähnlich wie hier gibt es eine OpenFile()-Funktion, die Sie selbst überprüfen können . .

Parameterbeschreibung: lpPathName ist der zu öffnende Dateiname, iReadWrite ist die Dateizugriffsmethode, es gibt drei Hauptmethoden:

OF_READ: Im schreibgeschützten Modus öffnen

OF_READWRITE: Im schreibgeschützten Modus öffnen. Im Schreibmodus öffnen.

OF_WRITE: Im schreibgeschützten Modus öffnen.

Es gibt auch Attribute wie OF_SHARE_COMPAT. Da sie nicht häufig verwendet werden, werde ich sie hier nicht einzeln vorstellen.

⑵_lclose()
Prototyp: HFILE _lclose( HFILE hFile);

Funktion: Datei schließen, 0 erfolgreich zurückgeben

Parameterbeschreibung: hFile: zu behandelndes Handle geschlossen

⑶_lread()

Prototyp: UINT _lread( HFILE hFile, // Dateihandle

LPVOID lpBuffer, // Puffer zum Speichern von Daten

UINT uBytes // Zu lesende Länge
);

Funktion: Lesen Sie die Datei und geben Sie die tatsächliche Anzahl der gelesenen Zeichen zurück. Ähnlich wie hier gibt es eine _hread()-Funktion, mit der Sie die Hilfedatei selbst überprüfen können.

⑷_lwrite()

Prototyp: UINT _lwrite( HFILE hFile, // Dateihandle

LPCSTR lpBuffer, // Puffer zum Speichern von Daten

UINT uBytes // Zu schreibende Länge
);

Funktion: Eine Datei schreiben und die tatsächliche Anzahl der geschriebenen Zeichen zurückgeben. Ähnlich wie hier gibt es auch eine _hwrite()-Funktion, mit der Sie die Hilfedatei selbst überprüfen können.

⑸_llseek()

Prototyp: LONG _llseek( HFILE hFile, // Dateihandle

LONG lOffset, // Bewegungsbetrag

int iOrigin // Referenzposition der Bewegung
) ;

Funktion: Verschieben Sie die Lese- und Schreibposition der Datei und geben Sie die Lese- und Schreibposition der Datei nach dem Verschieben erfolgreich zurück

Parameterbeschreibung: Der Wert von iOrigin ist einer der Folgende drei Situationen:

FILE_BEGIN: Dateikopf

FILE_CURRENT: Aktueller Speicherort der Datei

FILE_END: ​​​​Dateiende

⑹_lcreat()
Prototyp: HFILE _lcreat( LPCSTR lpPathName, // Der zu erstellende Dateiname
int iAttribute // Dateiattribut

Funktion: Eine Datei erstellen und ihr Handle erfolgreich zurückgeben

Parameterbeschreibung: Das Dateiattribut ist das Summe der folgenden Werte:

0: Gewöhnliche Datei

1: Schreibgeschützte Datei

2: Versteckte Datei

4: Systemdatei

Die Verwendung dieser Funktionen ist ähnlich wie Die aufgeführten BCB-Bibliotheksfunktionen Es wird empfohlen, BCB-Bibliotheksfunktionen zu verwenden. Bitte beachten Sie die vorherigen Dateioperationen basierend auf BCB-Bibliotheksfunktionen.

2. Kompatibel mit 32-Bit-Programmen

Datei erstellen
Eine Datei öffnen
Um Dateien zu lesen und zu schreiben, müssen Sie zunächst ein Dateihandle erhalten Durch diese Funktion erhalten Sie das Dateihandle. Diese Funktion ist die Tür zur Dateiwelt.

ReadFile
Liest Byte-Informationen aus einer Datei.
Nachdem Sie die Datei geöffnet und das Dateihandle erhalten haben, können Sie Daten über diese Funktion lesen.

WriteFile
Schreibt Byte-Informationen in die Datei.
Sie können dieser Funktion auch das Dateihandle übergeben, um Dateidaten zu schreiben.

CloseHandle
Schließen Sie das Dateihandle.
Denken Sie nach dem Öffnen der Tür natürlich daran, sie zu schließen.

GetFileTime
Erhalten Sie die Dateizeit.
Es stehen drei Dateizeiten zur Verfügung: Erstellungszeit, letzte Zugriffszeit und letzte Schreibzeit.
Diese Funktion erfordert auch das Dateihandle als Eingabeparameter.

GetFileSize
Ermitteln Sie die Dateigröße.
Da die Dateigröße bis zu mehrere G betragen kann (1G benötigt 30 Bit), kann ein 32-Bit-Doppelbyte-Typ sie nicht genau ausdrücken, sodass der Rückkehrcode die unteren 32 Bit darstellt und es einen Exit-Parameter gibt das kann die hohen 32 Bit weitergeben.
Diese Funktion erfordert auch das Dateihandle als Eingabeparameter.

GetFileAttributes
Dateiattribute abrufen.
Sie können die Archiv-, Schreibschutz-, System-, versteckten und andere Attribute der Datei abrufen.
Diese Funktion erfordert nur einen Dateipfad als Parameter.

SetFileAttributes
Dateiattribute festlegen.
Wenn es erhältlich ist, sollte es natürlich eingestellt werden können.
Sie können die Attribute „Archiv“, „Schreibgeschützt“, „System“, „Ausgeblendet“ und andere Attribute der Datei festlegen.
Diese Funktion erfordert nur einen Dateipfad als Parameter.

GetFileInformationByHandle
Alle Dateiinformationen abrufen
Diese Funktion kann die Informationen abrufen, die alle oben genannten Funktionen abrufen können, z. B. Größe, Attribute usw., und enthält auch einige Informationen, die anderswo nicht abgerufen werden können , wie zum Beispiel: Dateien Label-, Index- und Linkinformationen.
Diese Funktion erfordert das Dateihandle als Eingabeparameter.

GetFullPathName
Den Dateipfad abrufen Diese Funktion ruft den vollständigen Pfadnamen der Datei ab.
Es ist zu beachten, dass das Ergebnis nur dann korrekt ist, wenn sich die Datei im aktuellen Verzeichnis befindet. Wenn Sie den wahren Weg finden möchten. Die Funktion „GetModuleFileName“ sollte verwendet werden.

CopyFile
Datei kopieren
Hinweis: Es können nur Dateien kopiert werden, keine Verzeichnisse

MoveFileEx
Dateien verschieben
Sie können sowohl Dateien als auch Verzeichnisse verschieben, können dies aber nicht erstrecken sich über Laufwerksbuchstaben. (Setzen Sie das Verschiebungsflag unter Windows2000, um einen laufwerksübergreifenden Buchstabenbetrieb zu erreichen.)

DeleteFile
Datei löschen

GetTempPath
Den temporären Windows-Verzeichnispfad abrufen

GetTempFileName
Erstellen Sie eine eindeutige temporäre Datei im temporären Windows-Verzeichnispfad.

SetFilePoint
Bewegen Sie den Dateizeiger.
Diese Funktion wird für erweiterte Lese- und Schreibvorgänge für Dateien verwendet.

Dateien sperren und entsperren

LockFile
UnlockFile
LockFileEx
UnlockFileEx

Die oben genannten vier Funktionen werden zum Sperren und Entsperren von Dateien verwendet. Dies ermöglicht den asynchronen Betrieb von Dateien. Sie können gleichzeitig separate Vorgänge an verschiedenen Teilen der Datei ausführen.

Komprimierung und Dekomprimierung von Dateien

LZOpenFile
Öffnen Sie eine komprimierte Datei zum Lesen

LZSeek
Suchen Sie einen Speicherort in der komprimierten Datei

LZRead
Eine komprimierte Datei lesen

LZClose
Eine komprimierte Datei schließen

LZCopy
Die komprimierte Datei kopieren und während der Verarbeitung erweitern

GetExpandedName
Geben Sie den Dateinamen aus der komprimierten Datei zurück.

Die oben genannten sechs Funktionen sind Funktionen in einer kleinen Erweiterungsbibliothek in der 32-Bit-API und in der Dateikomprimierungserweiterungsbibliothek. Eine Dateikomprimierung kann mit dem Befehl compress erstellt werden.

Datei-Imaging/-Zuordnung

Die 32-Bit-API bietet eine Funktion namens Datei-Imaging/-Zuordnung, die es ermöglicht, Dateien direkt im virtuellen Speicherbereich einer Anwendung abzubilden Vereinfachen und beschleunigen Sie den Dateizugriff.

CreateFileMapping
Erstellen und benennen Sie die Zuordnung

MapViewOfFile
Laden Sie die Dateizuordnung in den Speicher

UnmapViewOfFile
Geben Sie die Ansicht frei und schreiben Sie Änderungen zurück in die Datei

FlushViewOfFile
Aktualisieren Sie die Ansichtsänderungen und schreiben Sie sie auf die Festplatte

Verwandte Empfehlungen:

C# Write File Operation-Geek Academy C# Video Tutorial

C#-Beispiele zum Erstellen, Einfügen von Tabellen, Festlegen von Stilen usw. in Word-Dokumenten

Das obige ist der detaillierte Inhalt vonC-basierte Dateioperationen (FILE*, fstream, windowsAPI). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn