So lesen und schreiben Sie Dateien in C++

青灯夜游
Freigeben: 2023-01-07 11:41:08
Original
24665 Leute haben es durchsucht

Methoden zum Lesen und Schreiben von C++-Dateien: 1. Verwenden Sie die Operatoren „>>“ und „<<“. 2. Verwenden Sie die Methoden „istream::read()“ und „ostream::write()“. 3. Verwenden Sie die Member-Methoden „istream::get()“ und „ostream::put()“.

So lesen und schreiben Sie Dateien in C++

Die Betriebsumgebung dieses Tutorials: Windows 7-System, C++17-Version, Dell G3-Computer.

Methode 1: C++ >> und <<Textdateien lesen und schreiben

Die fstream- oder ifstream-Klasse ist für das Lesen der Datei verantwortlich, und sie alle sind intern >>-Ausgabestream-Operator wurde ebenfalls überlastet. Die Klassen fstream und ofstream sind für das Schreiben von Dateien verantwortlich und haben auch den Ausgabestream-Operator <code><< intern überlastet. 输出流运算符做了重载;同样,fstream 和 ofstream 类负责实现对文件的写入,它们的内部也都对 << 输出流运算符做了重载。

所以,当 fstream 或者 ifstream 类对象打开文件(通常以 ios::in 作为打开模式)之后,就可以直接借助 >> 输入流运算符,读取文件中存储的字符(或字符串);当 fstream 或者 ofstream 类对象打开文件(通常以 ios::out 作为打开模式)后,可以直接借助 << 输出流运算符向文件中写入字符(或字符串)。

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    int x,sum=0;
    ifstream srcFile("in.txt", ios::in); //以文本模式打开in.txt备读
    if (!srcFile) { //打开失败
        cout << "error opening source file." << endl;
        return 0;
    }
    ofstream destFile("out.txt", ios::out); //以文本模式打开out.txt备写
    if (!destFile) {
        srcFile.close(); //程序结束前不能忘记关闭以前打开过的文件
        cout << "error opening destination file." << endl;
        return 0;
    }
    //可以像用cin那样用ifstream对象
    while (srcFile >> x) {
        sum += x;
        //可以像 cout 那样使用 ofstream 对象
        destFile << x << " ";
    }
    cout << "sum:" << sum << endl;
    destFile.close();
    srcFile.close();
    return 0;
}
Nach dem Login kopieren

执行此程序之前,必须在和该程序源文件同目录中手动创建一个 in.txt 文件,假设其内部存储的字符串为:

10 20 30 40 50
Nach dem Login kopieren

建立之后,执行程序,其执行结果为:

sum:150
Nach dem Login kopieren

同时在 in.txt 文件同目录下,会生成一个 out.txt 文件,其内部存储的字符和 in.txt 文件完全一样,读者可自行打开文件查看。

通过分析程序的执行结果不难理解,对于 in.txt 文件中的 "10 20 30 40 50" 字符串,srcFile 对象会依次将 "10"、"20"、"30"、"40"、"50" 读取出来,将它们解析成 int 类型的整数 10、20、30、40、50 并赋值给 x,同时完成和 sum 的加和操作。

同样,对于每次从 in.txt 文件读取并解析出的整形 x,destFile 对象都会原封不动地将其再解析成对应的字符串(如整数 10 解析成字符串 "10"),然后和 " " 空格符一起写入 out.txt 文件。

方法2:C++ read()和write()读写二进制文件

C++ ostream::write()方法写文件

ofstream 和 fstream 的 write() 成员方法实际上继承自 ostream 类,其功能是将内存中 buffer 指向的 count 个字节的内容写入文件,基本格式如下:

ostream & write(char* buffer, int count);
Nach dem Login kopieren

其中,buffer 用于指定要写入文件的二进制数据的起始位置;count 用于指定写入字节的个数。

也就是说,该方法可以被 ostream 类的 cout 对象调用,常用于向屏幕上输出字符串。同时,它还可以被 ofstream 或者 fstream 对象调用,用于将指定个数的二进制数据写入文件。

同时,该方法会返回一个作用于该函数的引用形式的对象。举个例子,obj.write() 方法的返回值就是对 obj 对象的引用。

需要注意的一点是,write() 成员方法向文件中写入若干字节,可是调用 write() 函数时并没有指定这些字节写入文件中的具体位置。事实上,write() 方法会从文件写指针指向的位置将二进制数据写入。所谓文件写指针,是是 ofstream 或 fstream 对象内部维护的一个变量,文件刚打开时,文件写指针指向的是文件的开头(如果以 ios::app 方式打开,则指向文件末尾),用 write() 方法写入 n 个字节,写指针指向的位置就向后移动 n 个字节。

下面的程序演示了如何将学生信息以二进制形式写入文件:

#include <iostream>
#include <fstream>
using namespace std;
class CStudent
{
public:
    char szName[20];
    int age;
};
int main()
{
    CStudent s;
    ofstream outFile("students.dat", ios::out | ios::binary);
    while (cin >> s.szName >> s.age)
        outFile.write((char*)&s, sizeof(s));
    outFile.close();
    return 0;
}
Nach dem Login kopieren

输入:

Tom 60↙
Jack 80↙
Jane 40↙
^Z↙
Nach dem Login kopieren

其中,表示输出换行符,^Z 表示输入Ctrl+Z

Wenn also ein fstream- oder ifstream-Klassenobjekt eine Datei öffnet (normalerweise mit ios::in als Öffnungsmodus), können Sie den Eingabestream-Operator >> 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 .

Tom 烫烫烫烫烫烫烫烫<   Jack 烫烫烫烫烫烫烫蘌   Jane 烫烫烫烫烫烫烫?
Nach dem Login kopieren

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:

istream & read(char* buffer, int count);
Nach dem Login kopieren
Nach dem Login kopieren

Nach der Erstellung führen Sie das Programm aus und das Ausführungsergebnis lautet :

#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;
}
Nach dem Login kopieren
Nach dem Login kopieren

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.

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.

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.

🎜🎜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: 🎜
Tom 60
Jack 80
Jane 40
Nach dem Login kopieren
Nach dem Login kopieren
🎜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: 🎜
ostream& put (char c);
Nach dem Login kopieren
Nach dem Login kopieren
🎜Eingabe: 🎜
#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;
}
Nach dem Login kopieren
Nach dem Login kopieren
🎜Wobei das Ausgabe-Neuzeilenzeichen ^Z</code darstellt > Zeigt die Eingabe der Tastenkombination <code>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↙
Nach dem Login kopieren
Nach dem Login kopieren
🎜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);
Nach dem Login kopieren
Nach dem Login kopieren

其中,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;
}
Nach dem Login kopieren
Nach dem Login kopieren

程序的输出结果是:

Tom 60
Jack 80
Jane 40
Nach dem Login kopieren
Nach dem Login kopieren

注意,程序中第 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);
Nach dem Login kopieren
Nach dem Login kopieren

其中,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;
}
Nach dem Login kopieren
Nach dem Login kopieren

执行程序,输入:

https://www.php.cn/↙
^Z↙
Nach dem Login kopieren
Nach dem Login kopieren

其中,表示输入换行符;^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);
Nach dem Login kopieren

其中,第一种语法格式的返回值就是读取到的字符,只不过返回的是它的 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;
}
Nach dem Login kopieren

程序执行结果为:

https://www.php.cn/
Nach dem Login kopieren

注意,和 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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage