C-Sprache – Dateioperation (2)

Vorwort

        Im vorherigen Artikel haben wir die damit verbundenen Funktionen von Dateioperationen kennengelernt. Heute werden wir uns mit dem Wissen über Binärdateien und Dateipuffer befassen.


1. Textdateien und Binärdateien

Je nachdem, wie die Daten organisiert sind, werden DatendateienTextdateienoderBinärdateien< genannt /span> a>.

  • Die Daten werden in binärer Form im Speicher abgelegt. Werden sie ohne Konvertierung in den externen Speicher ausgegeben, handelt es sich um eine Binärdatei.
  • Wenn es im ASCII-Code in einem externen Speicher gespeichert werden soll, muss es vor der Speicherung konvertiert werden. In Form von ASCII-Zeichen gespeicherte Dateien sind Textdateien.

Wie werden Daten im Speicher gespeichert?

  • Zeichen werden immer im ASCII-Format gespeichert und numerische Daten können entweder im ASCII- oder Binärformat gespeichert werden.
  • Wenn es beispielsweise eine Ganzzahl von 10000 gibt und diese in Form eines ASCII-Codes auf die Festplatte ausgegeben wird, belegt sie 5 Bytes auf der Festplatte (ein Byte für jedes Zeichen), während sie bei der Ausgabe in binärer Form vorhanden ist belegt nur 4 Bytes auf der Festplatte (VS2013-Test).

#include <stdio.h>
int main()
{
	int a = 10000;
	FILE* pf = fopen("test.txt", "wb");
	fwrite(&a, 4, 1, pf);//二进制的形式写到文件中
	fclose(pf);
	pf = NULL;
	return 0;
}

        Nachdem wir diesen Code ausgeführt haben, werden beim Öffnen des Dokuments „test.txt“ im Textmodus verstümmelte Zeichen angezeigt. Wenn wir es im Binärmodus öffnen, kann es normal angezeigt werden.


2. Feststellung des Abschlusses des Dateilesens

2.1 Missbrauchtes Feof

Denken Sie daran: Während des Dateilesevorgangs kann der Rückgabewert der feof-Funktion nicht verwendet werden, um direkt zu bestimmen, ob die Datei beendet ist.
Stattdessen wird es verwendet, wenn das Lesen der Datei endet, um zu bestimmen, ob das Lesen fehlschlägt oder das Ende der Datei erreicht ist.
1. Überprüfen Sie, ob das Lesen der Textdatei abgeschlossen ist und bestimmen Sie, ob der Rückgabewert EOF (fgetc) oder NULL (fgets) ist.
Zum Beispiel:

  • fgetc bestimmt, ob es sich um EOF handelt.
  • fgets bestimmt, ob der Rückgabewert NULL ist.

2. Beurteilen Sie das Ende des Lesens der Binärdatei und beurteilen Sie, ob der Rückgabewert kleiner als die tatsächlich zu lesende Zahl ist.
Zum Beispiel:

  • fread ermittelt, ob der Rückgabewert kleiner als die tatsächlich zu lesende Zahl ist.

Korrekte Verwendung:
Beispiel für eine Textdatei
:

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
	int c; // 注意:int,非char,要求处理EOF
	FILE* fp = fopen("test.txt", "r");
	if (!fp) {
		perror("File opening failed");
		return EXIT_FAILURE;
	}
	//fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOF
	while ((c = fgetc(fp)) != EOF) // 标准C I/O读取文件循环
	{
		putchar(c);
	}
	
	//判断是什么原因结束的
	if (ferror(fp))
		puts("I/O error when reading");
	else if (feof(fp))
		puts("End of file reached successfully");
	fclose(fp);
}

Hinweis:1.ferror – Nachdem die Datei gelesen wurde, wird damit ermittelt, ob während des Lesevorgangs der Datei ein Fehler aufgetreten ist< /span> und endet.

            2.feof – Nachdem die Datei gelesen wurde, wird damit ermittelt, ob die Datei gerade gelesen wird.Das Dateiende-Flag wurde festgestellt Und Ende.


Beispiel für eine Binärdatei:

#include <stdio.h>
enum { SIZE = 5 };
int main(void)
{
	double a[SIZE] = { 1.,2.,3.,4.,5. };
	FILE* fp = fopen("test.bin", "wb"); // 必须用二进制模式
	fwrite(a, sizeof * a, SIZE, fp); // 写 double 的数组
	fclose(fp);
	double b[SIZE];
	fp = fopen("test.bin", "rb");
	size_t ret_code = fread(b, sizeof * b, SIZE, fp); // 读 double 的数组
	if (ret_code == SIZE) {
		puts("Array read successfully, contents: ");
		for (int n = 0; n < SIZE; ++n) printf("%f ", b[n]);
		putchar('\n');
	}
	else { // error handling
		if (feof(fp))
			printf("Error reading test.bin: unexpected end of file\n");
		else if (ferror(fp)) {
			perror("Error reading test.bin");
		}
	}
	fclose(fp);
}

        Wenn der Code (if (ret_code == SIZE)) erreicht, wird beurteilt, ob während des Lesevorgangs so viele Datenbytes erfolgreich gelesen wurden. Wenn ja, wird er ausgedruckt. Wenn nicht, wird er anhand von feof und beurteilt ferror. , welcher Fehler aufgetreten ist, der zum Abbruch des Lesevorgangs geführt hat.


3. Dateipuffer

        Ansic-Standard verwendet „ Cushion File System Das sogenannte Buffer-Dateisystem bezieht sich auf Jede im Programm verwendete Datei öffnet ein „ Dateipuffer". Die vom Speicher an die Festplatte ausgegebenen Daten werden zuerst an den Puffer im Speicher gesendet und dann zusammen an die Festplatte gesendet, nachdem der Puffer gefüllt ist. Wenn Daten von der Festplatte zum Computer gelesen werden, werden die Daten aus der Festplattendatei gelesen und in den Speicherpuffer eingegeben (der Puffer ist gefüllt), und dann werden die Daten vom Puffer an den Programmdatenbereich (Programmvariablen, usw.) nacheinander. Die Größe des Puffers wird durch das C-Kompilierungssystem bestimmt.

        Warum werden die Daten nicht direkt auf der Festplatte abgelegt, sondern über den Puffer? Wenn wir Funktionen wie fputc und fwrite verwenden, müssen wir die Systemschnittstelle aufrufen. Bei häufigem Aufruf verringert sich die Effizienz des Betriebssystems, da das System nicht nur dieses eine Programm bedient. Wenn die Daten von ausgegeben werden Speicher auf die Festplatte, es wird zuerst an den Speicher gesendet. Der Puffer wird gefüllt und zusammen an die Festplatte gesendet. Dies kann die Effizienz des Betriebssystems erheblich verbessern.

Beweisen Sie die Existenz des Puffers:

#include <stdio.h>
#include <windows.h>
//VS2022 WIN11环境测试
int main()
{
	FILE* pf = fopen("test.txt", "w");
	fputs("abcdef", pf);//先将代码放在输出缓冲区
	printf("睡眠10秒-已经写数据了,打开test.txt文件,发现文件没有内容\n");
	Sleep(10000);
	printf("刷新缓冲区\n");
	fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到文件(磁盘)
	//注:fflush 在高版本的VS上不能使用了
	printf("再睡眠10秒-此时,再次打开test.txt文件,文件有内容了\n");
	Sleep(10000);
	fclose(pf);
	//注:fclose在关闭文件的时候,也会刷新缓冲区
	pf = NULL;
	return 0;
}

10 Sekunden lang schlafen – Daten wurden geschrieben. Öffnen Sie die Datei test.txt und stellen Sie fest, dass die Datei keinen Inhalt hat.

Weitere 10 Sekunden ruhen lassen – zu diesem Zeitpunkt öffnen Sie die Datei test.txt erneut und die Datei enthält Inhalt.

Eine Schlussfolgerung kann hier gezogen werden:         Aufgrund der Existenz des Puffers ist die C-Sprache wird ausgeführt. Beim Öffnen einer Datei muss der Puffer aktualisiert oder die Datei geschlossen werden am Ende des Dateivorgangs. Andernfalls kann es zu Problemen beim Lesen und Schreiben von Dateien kommen.

Supongo que te gusta

Origin blog.csdn.net/2301_76618602/article/details/133742185
Recomendado
Clasificación