Xi'an Petroleum University C++-Computerexperiment, sechs Eingabe- und Ausgabeflussprogrammdesign

Computer-Sechs-Input-Output-Stream-Programmierung

1. Der Zweck des Boardings

1. Verstehen Sie die Struktur der C++-Stream-Klassenbibliothek.

2. Beherrschen Sie die Verwendungsmethoden häufig verwendeter Klassen und ihrer Mitgliedsfunktionen in der Stream-Klassenbibliothek.

3. Verstehen Sie die Verwendung gängiger Steuerzeichen und beherrschen Sie die Eingabe- und Ausgabemethoden des C++-Formats.

4. Kenntnisse in Dateioperationsmethoden sowie in der Eingabe und Ausgabe von Dateiströmen.

2. On-Board-Inhalte

1. Testen Sie die Beispiele in diesem Kapitel.

2. Entwerfen Sie eine Schülerklasse, schreiben Sie die grundlegenden Informationen (Name, Größe, Alter) von N Schülerobjekten in Form eines Binärstroms in eine Datei und zeigen Sie die geschriebenen Dateiinformationen zufällig auf dem Bildschirm an

Testbeispiel

[Beispiel 9.9] Zufälliger Zugriff auf Dateien. Anforderungen:
(1) Entwerfen Sie eine Studentenstruktur einschließlich Name, Studentennummer und Noten.
(2) Schreiben Sie zuerst die Daten von 3 Schülern in die Datei bbb.dat, lesen Sie dann die Daten des zweiten Schülers aus der Datei
und zeigen Sie sie auf dem Bildschirm an.
Schritte auf dem Computer:
(1) Erstellen Sie eine neue Headerdatei für Pluralklassenvorlagen. Wählen Sie das Menü „Datei“ – „Neu“, um das neue Dialogfeld zu öffnen,
wie in Abbildung 5-1 dargestellt. Wählen Sie „C/C++-Header-Datei“ auf der Registerkarte „Dateien“, legen Sie den Speicherpfad auf
„D:\mywork\work6“ und den Dateinamen auf „Student“ fest. Standardmäßig ist „Zum Projekt hinzufügen“ ausgewählt, wie
in Abbildung 6-4 dargestellt.

2)单击“OK”按钮,打开 Student.h 文件,编辑代码如下:
//Student.h
struct Student{
    
    
char name[20];
long number;
int score;
};3)在主文件中 work6.cpp 中编辑测试代码:
#include "Student.h"
#include <fstream.h>
int main(int argc, char* argv[])
{
    
    
Student stu[3] = {
    
    {
    
    "Zhang", 111, 100}, {
    
    "Li", 222, 90}, {
    
    "Wang", 333, 80}}, 
stu2;
char filename[] = "bbb.data";
int n=3, i;
fstream datafile(filename, ios::in|ios::out|ios::binary);
for(i=0; i<3; i++)
datafile.write((char*)&stu[i], sizeof(struct Student));
datafile.seekg(1*sizeof(struct Student), ios::beg);
datafile.read((char*)&stu2, sizeof(struct Student));
datafile.close();
64
cout<<"Name: "<<stu2.name<<endl;
cout<<"Number: "<<stu2.number<<endl;
cout<<"score: "<<stu2.score<<endl;
return 0;
}

(4) Klicken Sie in der Symbolleiste auf das Befehlssymbol „Erstellen“, um work6.exe zu generieren.
(5) Klicken Sie in der Symbolleiste auf das Befehlssymbol „Ausführen“, um work6.exe auszuführen.

  1. Praktische Übung:
    Entwerfen Sie eine Schülerklasse, schreiben Sie die grundlegenden Informationen (Name, Größe, Alter) von N Schülerobjekten in eine Datei in Form eines Binärstroms und zeigen Sie die geschriebenen Dateiinformationen zufällig auf dem Bildschirm an.

Schritte an Bord:

(1) Erstellen Sie eine neue Headerdatei für Pluralklassenvorlagen. Wählen Sie das Menü „Datei“ – „Neu“, um das neue Dialogfeld zu öffnen, wie in Abbildung 6-6 dargestellt. Wählen Sie „C/C++-Header-Datei“ auf der Registerkarte „Dateien“, legen Sie den Speicherpfad auf „D:\mywork\work6“ und den Dateinamen auf „Student2“ fest. Standardmäßig ist „Zum Projekt hinzufügen“ ausgewählt als siehe Abbildung 6-6. Abbildung
6-6 Erstellen Sie eine neue Header-Datei für die Schülerklasse

2)单击“OK”按钮,打开 Student2.h 文件,编辑代码如下:
//Student2.h
#include <string.h>
class Student{
    
    
public:
char name[20];
float height;
int age;
Student(char *n=" ", float h=1.6, int a=20) : height(h), age(a)
{
    
    
strcpy(name, n);
}
};3)在主文件中 work6.cpp 中编辑测试代码:

#include "stdafx.h"
#include "Student2.h"
#include <fstream.h>
int main(int argc, char* argv[])
{
    
    
int n;
cout<<"please input the number of student: ";
cin>>n;
66
Student *ps, stu;
ps = new Student[n];
char name[20];
float height;
int age;
for(int i=0; i<n; i++)
{
    
    
cout<<endl<<"Name: "; cin>>name; 
cout<<"Height: "; cin>>height;
cout<<"Age: "; cin>>age; 
*(ps+i) = Student(name, height, age);
}
char filename[] = "info.data";
fstream datafile(filename, ios::in|ios::out|ios::binary);
for(i=0; i<n; i++)
datafile.write((char*)(ps+i), sizeof(struct Student));
int num;
cout<<"Please input the number to print: ";
cin>>num;
while(num)
{
    
    
datafile.seekg((num-1)*sizeof(struct Student), ios::beg);
datafile.read((char*)&stu, sizeof(struct Student));
cout<<"Name: "<<stu.name<<endl;
cout<<"Height: "<<stu.height<<endl;
cout<<"Age: "<<stu.age<<endl;
cout<<"Please input the number to print: ";
cin>>num;
}
datafile.close();
return 0;
}

(4) Klicken Sie in der Symbolleiste auf das Befehlssymbol „Erstellen“, um work6.exe zu generieren.
(5) Klicken Sie in der Symbolleiste auf das Befehlssymbol „Ausführen“, um work6.exe auszuführen

Denkfragen

1. In C++ wird der wahlfreie Zugriff auf Dateien durch die Steuerung der Bewegung von Dateizeigern realisiert. Im Allgemeinen sind Textdateien schwer genau zu lokalisieren, daher wird der wahlfreie Zugriff meist für Binärdateien verwendet. Bitte testen. Welche Faktoren müssen bei der Implementierung des wahlfreien Zugriffs auf Dateien in C++ berücksichtigt werden?

Die Implementierung des wahlfreien Zugriffs auf Dateien in C++ erfordert die Berücksichtigung der folgenden Faktoren:

  1. Beim Öffnen einer Datei müssen Sie den richtigen Dateizugriffsmodus und die richtige Öffnungsmethode angeben. Bei Binärdateien sollte für Lese- und Schreibvorgänge der Modus „Binär“ verwendet werden, um versehentliche Änderungen der Daten zu vermeiden.

  2. Die Bewegung der Dateizeigerposition. Der wahlfreie Zugriff kann durch Aufrufen der Funktion fseek erreicht werden, um den Dateizeiger an die gewünschte Stelle zu verschieben. Beim Bewegen des Zeigers müssen Sie auf die Einheit des Versatzes sowie die positive und negative Richtung achten, um sicherzustellen, dass sich der Dateizeiger an die richtige Position bewegt.

  3. Die Größe und das Format der gelesenen oder geschriebenen Daten. Da bei Binärdateien die Größe und das Format der Datentypen variieren können, müssen die Datengröße und das Format, die gelesen oder geschrieben werden sollen, von Fall zu Fall bestimmt werden.

  4. Beim Schließen einer Datei muss sichergestellt werden, dass alle Dateizeiger korrekt auf das Ende der Datei zeigen, um Datenverlust und -beschädigung zu vermeiden.

Hier ist ein einfaches Beispiel, das zeigt, wie man in C++ zufällig auf eine Binärdatei zugreift:

#include <iostream>
#include <fstream>

using namespace std;

int main() {
    // 打开二进制文件
    fstream file("test.bin", ios::out | ios::binary);

    // 写入数据
    int num1 = 12345;
    float num2 = 3.1415926;
    file.write(reinterpret_cast<char*>(&num1), sizeof(num1));
    file.write(reinterpret_cast<char*>(&num2), sizeof(num2));

    // 将文件指针移动到开头
    file.seekg(0);

    // 读取数据
    int num3;
    float num4;
    file.read(reinterpret_cast<char*>(&num3), sizeof(num3));
    file.read(reinterpret_cast<char*>(&num4), sizeof(num4));

    // 输出数据
    cout << "num1 = " << num3 << endl;
    cout << "num2 = " << num4 << endl;

    // 关闭文件
    file.close();
    
    return 0;
}

Im obigen Beispiel haben wir zunächst eine Binärdatei namens „test.bin“ geöffnet und eine Ganzzahl und eine Gleitkommazahl hineingeschrieben. Anschließend wird der Dateizeiger durch Aufrufen der Seekg-Funktion an den Anfang der Datei verschoben und anschließend werden die beiden Daten gelesen und ausgegeben. Schließlich wurde die Datei geschlossen.

2. Testen Sie den Unterschied zwischen der Suchp-Funktion und der Suchg-Funktion, um die Verschiebung des Dateizeigers zu realisieren.
In C++ gibt es zwei Arten von Dateizeigern: Lesezeiger und Schreibzeiger. Zur Vereinfachung der Bedienung stellt die C++-Standardbibliothek die Funktionen „seegg“ und „seep“ bereit, um die Verschiebung der beiden Zeigerpositionen zu realisieren.

Die Suchfunktion ist eine Funktion zum Ändern der Position des aktuellen Dateilesezeigers. Dadurch kann der Dateilesezeiger an einer beliebigen Position in der Datei positioniert werden, wodurch beim Lesen von Daten ein Direktzugriff realisiert wird. Die Funktion „seep“ ist eine Funktion zum Ändern der Position des aktuellen Dateischreibzeigers. Dadurch kann der Dateischreibzeiger an einer beliebigen Position in der Datei positioniert werden, wodurch beim Einfügen und Ändern von Daten ein Direktzugriff realisiert wird.

Das Folgende ist ein einfaches Beispiel, das zeigt, wie die Funktionen „seekg“ und „seep“ zum Implementieren der Dateizeigerverschiebung verwendet werden:

#include <iostream>
#include <fstream>

using namespace std;

int main() {
    // 打开文件
    fstream file("test.txt", ios::out | ios::in);

    // 写入数据
    file << "0123456789";

    // 重定位读指针(从开头开始向右移动3个字符)
    file.seekg(3, ios::beg);

    // 读取一个字符
    char ch;
    file.get(ch);
    cout << ch << endl;   // 输出3

    // 重定位写指针(从当前位置开始向右移动2个字符)
    file.seekp(2, ios::cur);

    // 插入一个字符
    file.put('A');

    // 重定位读指针(从开头开始向右移动2个字符)
    file.seekg(2, ios::beg);

    // 读取一个字符
    file.get(ch);
    cout << ch << endl;   // 输出0

    // 关闭文件
    file.close();
    
    return 0;
}

Im obigen Beispiel haben wir zunächst eine Datei namens „test.txt“ geöffnet und eine Zahlenfolge hineingeschrieben. Anschließend wird der Dateilesezeiger durch Aufrufen der Funktion seegg an die vierte Zeichenposition der Zeichenfolge verschoben und anschließend dieses Zeichen gelesen und ausgegeben. Als nächstes verschieben wir den Dateischreibzeiger durch Aufrufen der Funktion seep auf die letzten beiden Zeichen des aktuellen Lesezeigers und fügen dann einen Großbuchstaben „A“ in die Datei ein. Schließlich rufen wir die Funktion „seegg“ erneut auf, um den Dateilesezeiger auf die dritte Zeichenposition der Zeichenfolge zu verschieben, und lesen dieses Zeichen dann erneut und geben es aus.

Es ist ersichtlich, dass wir durch die Verwendung der Suchg- und Suchp-Funktionen die Position des Dateizeigers flexibel steuern und so einen flexiblen Zugriff und eine flexible Änderung von Dateidaten realisieren können. Es ist zu beachten, dass die Berechnungsmethoden und Bedeutungen der Offset-Parameter der beiden Funktionen geringfügig unterschiedlich sind. Bitte wählen Sie entsprechend der jeweiligen Situation den entsprechenden Parametertyp und Parameterwert aus.

3. Ergänzen und verbessern Sie den Themeninhalt von [Üben am Computer], sortieren Sie die Schülerinformationen nach Benutzerbedürfnissen (nach Größe, Alter) und zeigen Sie dann die Informationen von N Schülern an.

Ich denke du magst

Origin blog.csdn.net/shaozheng0503/article/details/130645396
Empfohlen
Rangfolge