Heim  >  Artikel  >  Backend-Entwicklung  >  So lesen und schreiben Sie Dateien in C++

So lesen und schreiben Sie Dateien in C++

青灯夜游
青灯夜游Original
2021-06-28 15:18:3524404Durchsuche

Methoden zum Lesen und Schreiben von C++-Dateien: 1. Verwenden Sie die Operatoren „>>“ und „1794b11f746942aa391849b57d31562d> und 980075ab31de4820b987adc9224745e9>-Ausgabestream-Operator wurde ebenfalls überlastet. Die Klassen fstream und ofstream sind für das Schreiben von Dateien verantwortlich und haben auch den Ausgabestream-Operator 8b1069cdfa113ffbf7c416b3bce87ee9> 输出流运算符做了重载;同样,fstream 和 ofstream 类负责实现对文件的写入,它们的内部也都对 711147ca53566b790587e7a90a118b85> 输入流运算符,读取文件中存储的字符(或字符串);当 fstream 或者 ofstream 类对象打开文件(通常以 ios::out 作为打开模式)后,可以直接借助 f1accf135e72c8b38c1a4c56f3ebeda4> direkt verwenden, um die darin gespeicherten Zeichen (oder Zeichenfolgen) zu lesen ;Wenn das fstream- oder ofstream-Klassenobjekt die Datei öffnet (normalerweise unter Verwendung von ios::out als Öffnungsmodus), können Sie mit Hilfe des Ausgabestream-Operators << direkt Zeichen (oder Zeichenfolgen) in die Datei schreiben . <p><pre class="brush:js;toolbar:false">Tom 烫烫烫烫烫烫烫烫&lt; Jack 烫烫烫烫烫烫烫蘌 Jane 烫烫烫烫烫烫烫?</pre></p>Bevor Sie dieses Programm ausführen, müssen Sie manuell eine in.txt-Datei im selben Verzeichnis wie die Programmquelldatei erstellen. Gehen Sie davon aus, dass die intern gespeicherte Zeichenfolge lautet: <p><pre class="brush:php;toolbar:false">istream &amp; read(char* buffer, int count);</pre></p>Nach der Erstellung führen Sie das Programm aus und das Ausführungsergebnis lautet : <p> <pre class="brush:php;toolbar:false">#include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; class CStudent { public: char szName[20]; int age; }; int main() { CStudent s; ifstream inFile(&quot;students.dat&quot;,ios::in|ios::binary); //二进制读方式打开 if(!inFile) { cout &lt;&lt; &quot;error&quot; &lt;&lt;endl; return 0; } while(inFile.read((char *)&amp;s, sizeof(s))) { //一直读到文件结束 cout &lt;&lt; s.szName &lt;&lt; &quot; &quot; &lt;&lt; s.age &lt;&lt; endl; } inFile.close(); return 0; }</pre></p>Gleichzeitig wird eine out.txt-Datei im selben Verzeichnis wie die in.txt-Datei generiert. Die darin gespeicherten Zeichen sind genau die gleichen wie in der in.txt-Datei Schau es dir an. <p><strong>Es ist nicht schwer zu verstehen, wenn man die Ausführungsergebnisse des Programms analysiert. Für die Zeichenfolge „10 20 30 40 50“ in der in.txt-Datei konvertiert das srcFile-Objekt nacheinander „10“, „20“, „30“. ", "40", "50" werden ausgelesen, in Ganzzahlen vom Typ int 10, 20, 30, 40, 50 analysiert und x zugewiesen, und gleichzeitig wird die Additionsoperation mit der Summe abgeschlossen. </strong></p>In ähnlicher Weise analysiert das destFile-Objekt jede Ganzzahl x, die aus der in.txt-Datei gelesen und analysiert wird, unverändert in die entsprechende Zeichenfolge (z. B. wird die Ganzzahl 10 in die Zeichenfolge „10“ analysiert) und schreibt sie dann in die Datei out.txt zusammen mit „ “ Leerzeichen. <p></p>🎜🎜Methode 2: C++ read() und write() zum Lesen und Schreiben von Binärdateien🎜🎜🎜🎜🎜C++ ostream::write()-Methode zum Schreiben von Dateien🎜🎜🎜Die write()-Mitgliedsmethode von ofstream und fstream erbt tatsächlich von Die Funktion der ostream-Klasse besteht darin, die Anzahl der Bytes, auf die der Puffer im Speicher zeigt, in eine Datei zu schreiben. Das Grundformat lautet wie folgt: 🎜<pre class="brush:php;toolbar:false">Tom 60 Jack 80 Jane 40</pre>🎜Dabei wird der Puffer verwendet, um die Startposition anzugeben Binärdaten, die in die Datei geschrieben werden sollen; count wird verwendet, um die Anzahl der zu schreibenden Bytes anzugeben. 🎜🎜Mit anderen Worten, diese Methode kann vom Cout-Objekt der Ostream-Klasse aufgerufen werden und wird häufig zum Ausgeben von Zeichenfolgen auf dem Bildschirm verwendet. Gleichzeitig kann es auch von ofstream- oder fstream-Objekten aufgerufen werden, um eine bestimmte Anzahl von Binärdaten in eine Datei zu schreiben. 🎜🎜Gleichzeitig gibt diese Methode ein Objekt in Form einer Referenz zurück, die auf die Funktion einwirkt. Beispielsweise ist der Rückgabewert der Methode obj.write() eine Referenz auf das Objekt obj. 🎜🎜Zu beachten ist, dass die Member-Methode write() eine Reihe von Bytes in die Datei schreibt, beim Aufruf der Funktion write() jedoch nicht der konkrete Ort angegeben wird, an dem diese Bytes in die Datei geschrieben werden. Tatsächlich schreibt die Methode write() Binärdaten von dem Speicherort, auf den der Dateischreibzeiger zeigt. Der sogenannte Dateischreibzeiger ist eine Variable, die intern vom ofstream- oder fstream-Objekt verwaltet wird. Beim ersten Öffnen der Datei zeigt der Dateischreibzeiger auf den Anfang der Datei (wenn sie im ios::app-Modus geöffnet wird). zeigt auf das Ende der Datei. Mit der Methode write() werden n Bytes geschrieben und die Position, auf die der Schreibzeiger zeigt, wird um n Bytes nach hinten verschoben. 🎜🎜Das folgende Programm zeigt, wie Schülerinformationen in binärer Form in eine Datei geschrieben werden: 🎜<pre class="brush:js;toolbar:false">ostream&amp; put (char c);</pre>🎜Eingabe: 🎜<pre class="brush:js;toolbar:false">#include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int main() { char c; //以二进制形式打开文件 ofstream outFile(&quot;out.txt&quot;, ios::out | ios::binary); if (!outFile) { cout &lt;&lt; &quot;error&quot; &lt;&lt; endl; return 0; } while (cin &gt;&gt; c) { //将字符 c 写入 out.txt 文件 outFile.put(c); } outFile.close(); return 0; }</pre>🎜Wobei <code>↙ das Ausgabe-Neuzeilenzeichen ^Zdarstellt > Zeigt die Eingabe der Tastenkombination Strg+Z an, um die Eingabe zu beenden. 🎜🎜Nach der Ausführung des Programms wird automatisch eine Students.dat-Datei generiert, die 72 Bytes an Daten enthält. Wenn Sie diese Datei mit „Notepad“ öffnen, sehen Sie möglicherweise die folgenden verstümmelten Zeichen: 🎜

https://www.php.cn/↙
^Z↙
🎜Das ist erwähnenswert Zeile 13 des Programms gibt an, dass der Öffnungsmodus der Datei ios::out | ist, d. h. sie wird im binären Schreibmodus geöffnet. Auf der Windows-Plattform ist es unbedingt erforderlich, die Datei im Binärmodus zu öffnen, da sonst ein Fehler auftreten kann. 🎜🎜Außerdem schreibt Zeile 15 das s-Objekt in die Datei. Die Adresse von s ist die Adresse des Speicherpuffers, der in die Datei geschrieben werden soll, aber &s ist nicht vom Typ char *, daher ist eine erzwungene Typkonvertierung erforderlich. Die Datei muss nach der Verwendung geschlossen werden, andernfalls wird der Inhalt der Datei gelöscht Die Datei ist nach Programmende möglicherweise unvollständig. 🎜🎜🎜C++ istream::read()-Methode liest Dateien 🎜🎜🎜Die read()-Methode von ifstream und fstream erbt tatsächlich von der istream-Klasse und ihre Funktion ist genau das Gegenteil der write()-Methode, nämlich Lesen Zählen Sie Wörter aus den Dateiabschnittsdaten. Das Syntaxformat dieser Methode lautet wie folgt: 🎜
istream & read(char* buffer, int count);

其中,buffer 用于指定读取字节的起始位置,count 指定读取字节的个数。同样,该方法也会返回一个调用该方法的对象的引用。

和 write() 方法类似,read() 方法从文件读指针指向的位置开始读取若干字节。所谓文件读指针,可以理解为是 ifstream 或 fstream 对象内部维护的一个变量。文件刚打开时,文件读指针指向文件的开头(如果以 ios::app 方式打开,则指向文件末尾),用 read() 方法读取 n 个字节,读指针指向的位置就向后移动 n 个字节。因此,打开一个文件后连续调用 read() 方法,就能将整个文件的内容读取出来。

通过执行 write() 方法的示例程序,我们将 3 个学生的信息存储到了 students.dat 文件中,下面程序演示了如何使用 read() 方法将它们读取出来:

#include <iostream>
#include <fstream>
using namespace std;
class CStudent
{
public:
    char szName[20];
    int age;
};
int main()
{
    CStudent s;       
    ifstream inFile("students.dat",ios::in|ios::binary); //二进制读方式打开
    if(!inFile) {
        cout << "error" <<endl;
        return 0;
    }
    while(inFile.read((char *)&s, sizeof(s))) { //一直读到文件结束
        cout << s.szName << " " << s.age << endl;   
    }
    inFile.close();
    return 0;
}

程序的输出结果是:

Tom 60
Jack 80
Jane 40

注意,程序中第 18 行直接将 read() 方法作为 while 循环的判断条件,这意味着,read() 方法会一直读取到文件的末尾,将所有字节全部读取完毕,while 循环才会终止。

方法3:C++ get()和put()读写文件

在某些特殊的场景中,我们可能需要逐个读取文件中存储的字符,或者逐个将字符存储到文件中。这种情况下,就可以调用 get() 和 put() 成员方法实现。

C++ ostream::put()成员方法

我们知道,fstream 和 ofstream 类继承自 ostream 类,因此 fstream 和 ofstream 类对象都可以调用 put() 方法。

当 fstream 和 ofstream 文件流对象调用 put() 方法时,该方法的功能就变成了向指定文件中写入单个字符。put() 方法的语法格式如下:

ostream& put (char c);

其中,c 用于指定要写入文件的字符。该方法会返回一个调用该方法的对象的引用形式。例如,obj.put() 方法会返回 obj 这个对象的引用。

举个例子:

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    char c;
    //以二进制形式打开文件
    ofstream outFile("out.txt", ios::out | ios::binary);
    if (!outFile) {
        cout << "error" << endl;
        return 0;
    }
    while (cin >> c) {
        //将字符 c 写入 out.txt 文件
        outFile.put(c);
    }
    outFile.close();
    return 0;
}

执行程序,输入:

https://www.php.cn/↙
^Z↙

其中,表示输入换行符;^ZCtrl+Z 的组合键,表示输入结束。

由此,程序中通过执行 while 循环,会将 "https://www.php.cn/" 字符串的字符逐个复制给变量 c,并逐个写入到 out.txt 文件。

注意,由于文件存放在硬盘中,硬盘的访问速度远远低于内存。如果每次写一个字节都要访问硬盘,那么文件的读写速度就会慢得不可忍受。因此,操作系统在接收到 put() 方法写文件的请求时,会先将指定字符存储在一块指定的内存空间中(称为文件流输出缓冲区),等刷新该缓冲区(缓冲区满、关闭文件、手动调用 flush() 方法等,都会导致缓冲区刷新)时,才会将缓冲区中存储的所有字符“一股脑儿”全写入文件。

C++ istream::get()成员方法

和 put() 成员方法的功能相对的是 get() 方法,其定义在 istream 类中,借助 cin.get() 可以读取用户输入的字符。在此基础上,fstream 和 ifstream 类继承自 istream 类,因此 fstream 和 ifstream 类的对象也能调用 get() 方法。

当 fstream 和 ifstream 文件流对象调用 get() 方法时,其功能就变成了从指定文件中读取单个字符(还可以读取指定长度的字符串)。值得一提的是,get() 方法的语法格式有很多(请猛击这里了解详情),这里仅介绍最常用的 2 种:

int get();
istream& get (char& c);

其中,第一种语法格式的返回值就是读取到的字符,只不过返回的是它的 ASCII 码,如果碰到输入的末尾,则返回值为 EOF。第二种语法格式需要传递一个字符变量,get() 方法会自行将读取到的字符赋值给这个变量。

本节前面在讲解 put() 方法时,生成了一个 out.txt 文件,下面的样例演示了如何通过 get() 方法逐个读取 out.txt 文件中的字符:

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    char c;
    //以二进制形式打开文件
    ifstream inFile("out.txt", ios::out | ios::binary);
    if (!inFile) {
        cout << "error" << endl;
        return 0;
    }
    while ( (c=inFile.get())&&c!=EOF )   //或者 while(inFile.get(c)),对应第二种语法格式
    {
        cout << c ;
    }
    inFile.close();
    return 0;
}

程序执行结果为:

https://www.php.cn/

注意,和 put() 方法一样,操作系统在接收到 get() 方法的请求后,哪怕只读取一个字符,也会一次性从文件中将很多数据(通常至少是 512 个字节,因为硬盘的一个扇区是 512 B)读到一块内存空间中(可称为文件流输入缓冲区),这样当读取下一个字符时,就不需要再访问硬盘中的文件,直接从该缓冲区中读取即可。

更多编程相关知识,请访问:编程视频!!

Das obige ist der detaillierte Inhalt vonSo lesen und schreiben Sie Dateien in C++. 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
Vorheriger Artikel:So konvertieren Sie C++-TypenNächster Artikel:So konvertieren Sie C++-Typen