Kapitel 13 Datei-Eingabe und Ausgabe

Zunächst werden die Dokument Umrissen

1.1 Dateikonzept

Die Datei ist in der Regel auf einer Festplatte oder Solid-State-Laufwerk für einen benannten Speicherbereich. C die Dokumente als eine Serie von aufeinanderfolgenden Bytes, wobei jedes Byte kann einzeln gelesen werden. C bietet zwei Dateimodi: Textmodus und Binär-Modus.

1.2 Textmodus und Binärmodus

1.2.1 Text und binäre Inhalt

Der Inhalt aller Dateien ist in binärer Form (0 oder 1) Lagerung. Wenn jedoch die Datei ursprünglich binärcodierten war Zeichen (beispielsweise ASCII oder Unicode) darstellen Text, ist die Datei eine Textdatei, die den Textinhalt enthält; wenn die Datei in binären den Code in Maschinensprache darstellt oder numerische Daten oder Bilder oder Musik-Codierung, die Datei ist eine Binärdatei, die den binären Inhalt enthält.

1.2.2 Textmodus und Binärmodus

Um die Bearbeitung zu standardisieren, bietet C Sprache zwei Textdateien, Zugriff auf Dateien Dränger: Binär- und Textmodus. Im Binär-Modus kann das Programm Zugriff auf jedes Byte der Datei, im Textmodus, der eigentliche Inhalt des Programminhalts und Dokument gesehen nicht das gleiche.

Programm zum Lesen und Schreiben von Dateien im Textmodus, das Ende der Leitung oder das Ende der Datei in der lokalen Umgebung, die durch die Karte, um den C-Modus. Beispielsweise liest die Datei C-Programm im Textmodus alten Maciontosh im \ r in einer Datei zugeordnet \ n; wenn Daten im Textmodus geschrieben ist, der \ n \ r konvertiert.

Wenn das Programm zum Lesen und Schreiben von Dateien im Binär-Modus, werden das Programm nicht auf die Dateien im Verzeichnis \ r sehen und \ n, wird die Zuordnung nicht auf.

Obwohl C Binär- und Textmodus bietet, aber die Umsetzung dieser beiden Modi können identisch sein, zum Beispiel, UNIX und Linux tut genau die gleiche Methode der beiden Modi.

1.3 I / O-Ebene

Zusätzlich zu den Dateimodus auswählen, können Sie auch zwei Ebenen der I / O wählen: die zugrundeliegende E / A-Standard und erweiterte I / O Das zu Grunde liegende I / O-Betriebssystem stellt die Basis-E / A-Dienste; erweitert Standard-I / O, um das Standard-Paket und die Header-Datei stdio.h definiert die C-Bibliothek.

Zweitens ist die Standard-I / O

2.1 Standard-Dokument

C - Programm wird standardmäßig drei Dateien zu öffnen: Standardeingabe, Standardausgabe und Standardfehler ausgegeben.

Standardmäßig ist die Eingabeeinrichtung ein gemeinsames Standardeingabesystem, in der Regel der Tastatur; Standardausgabegerät allgemein normal Ausgabesystem, in der Regel ein Bildschirm.

Beispiel:

/*本例实在 linux 环境中运行的,open 为系统调用,头文件是 open 函数所需要的文件。*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(void)
{
        int fd;

        //获得文件描述符
        fd = open("./array1.c", O_RDONLY);
        printf("fd is: %d\n", fd);

        return 0;
}
/*运行结果
fd is: 3
*/

Analyse der Ergebnisse: fd = 3, hat, in 0,1,2-Datei geöffnet wird, beschrieben worden ist, das heißt, die oben beschriebene Standardeingabe, Standardausgabe und Standardfehler.

2.2 exit () Funktion

exit () Funktion, um alle geöffneten Dateien, und das Programm endet, vorbei an seine Parameter an einen Teil des Betriebssystemes, für die Verwendung durch andere Programme, wie in UNIX Eltern zu schließen wird zeigen, wie es nicht ist. 0 Transferverfahren normal beendet, das Programm abnormal beendet gibt Wert ungleich Null, auf unterschiedliche Werte aus verschiedenen Gründen Ausgang entspricht.

ANSI C stellt die Verwendung derselben im Gegenzug die Anfangs main () Aufruf mit dem Anruf exit () Wirkung.

Unterschied:

Ⅰ. Wenn die Prozedur Main () in einem rekursiven, Exit () endet das Programm direkt, sondern wird wieder eine Rückkehr Rekursion.

Ⅱ. In anderen Funktionen, exit () kann das gesamte Programm beenden.

2.3 Standard-I / O-Funktionen

2.3.1 fopen ()

Nach dem Erfolg des Programms die Datei zu öffnen, fopen () gibt den Dateizeiger. Typ FILE Dateizeiger ist ein Zeiger auf einen Zeiger.

2.3.2 getc () 和 putc ()

getc () und putc () und getchar () und putchar () Funktion ist ähnlich, außer dass, getc () und putc () können Sie eine Datei angeben können, getchar () und putchar (Dateien) können nur stdin und stdout sein .

Beispiel:

#include <stdio.h>

int main(void)
{
        FILE *rfp;      //读文件的指针
        FILE *wfp;      //写文件的指针
        char ch;

        rfp = fopen("./read", "r");
        wfp = fopen("./write","w");

        while((ch = getc(rfp)) != EOF)
        {
                putc(ch, wfp);  //向 write.c 中写入
                putc(ch, stdout);       //向屏幕输出
        }
    
    	//保存文件
        if(fclose(wfp) != 0)
                printf("Error in closing file write\n");

        return 0;
}

2.3.3 fclose ()

flcose () Funktion schließt die Datei durch fp angegebenen Puffer egalisieren, wenn nötig. Wenn erfolgreich geschlossen, fclose () 0 zurück, andernfalls gibt es EOF.

2.3.5 fscanf () und fprintf () (Hinweis: Dies ist kein Standard-I / O, Datei-I / O)

Diese beiden Funktionen sind ähnlich wie scanf () und printf ().

Beispiel:

/*fprintf() demo*/
#include <stdio.h>

int main(void)
{
        FILE *file;
        double d = 0.3333;
        char *a = "aldskjf";

        file = fopen("fprintf", "w");   //打开文件
        fprintf(file, "%.2f\n%s\n", d, a);      //写入 file 文件中
        fprintf(stdout, "%.2f\n%s\n", d, a);    //写入标准输出中

        return 0;
}
/*fscanf() demo*/
#include <stdio.h>

int main(void)
{
        FILE *file;
        char words[50];

        file = fopen("fprintf", "r");
        while(fscanf(file, "%s", words) == 1)   //从 file 文件中读取内容输出到屏幕
                puts(words);

        return 0;
}

2.3.6 fread () 和 fwrite ()

Zwei E / A-Funktionen, die zuvor erwähnt sind textorientiert und für die Verarbeitung von Zeichenketten. Wenn für die Transformation% verwendet, um den Wert zu speichern, sondern wird der Wert in Zeichendatenwert umgewandelt ändern kann, ist die Änderung rückgängig zu machen. Um die Konsistenz der Werte vor und nach der Lagerung, der genaueste Ansatz ist, einen Computer zu verwenden, um die gleiche Bit zu speichern. Dieser Umwandlungsprozess von digitaler Form auf den String nicht existiert. Diese Art der Notation, die in dem Programm verwendet wird, in dem Datenverarbeitungsverfahren gespeichert ist, als Dateidaten in binärer Form bezeichnet.

Beispiel:

/*fwrite() demo*/
#include <stdio.h>
#define SIZE 7

int main(void)
{
        FILE *arrayfile;
        //定义一个 double 数组
        double array[SIZE] = {4, 5, 1, 1, 4, 6, 7};

        arrayfile = fopen("array", "wb");	//以二进制的形式打开文件
        fwrite(array, sizeof(double), 7, arrayfile);    //把数组中内容写到 books 文件中
		
        fclose(arrayfile);

        return 0;
}
/*结果:
存在文件中的数据(二进制编码):
^@^@^@^@^@^@^P@^@^@^@^@^@^@^T@^@^@^@^@^@^@ð?^@^@^@^@^@^@ð?^@^@^@^@^@^@^P@^@^@^@^@^@^@^X@^@^@^@^@^@^@^\@
*/
/*fread() demo*/
#include <stdio.h>
#define SIZE 7

int main(void)
{
        int i;
        FILE *arrayfile;                //文件指针
        double array[SIZE];

        arrayfile = fopen("array", "rb");       //以二进制的形式打开 array
        fread(array, sizeof(double), SIZE, arrayfile);  //把文件中的内容读到结构数组中 

        //输出
        printf("array: \n");
        for(i = 0; i < SIZE; i++)
                printf("%.2f ", array[i]);
        printf("\n");

        return 0;
}
/*运行结果
array: 
4.00 5.00 1.00 1.00 4.00 6.00 7.00 
*/

2.3.7 Buffer

Standard-I / O des ersten Schritts ist es, die Funktion fopen () aufzurufen. fopen () eine Datei zu öffnen, wird auch ein Puffer (Erstellen zwei Puffer in Schreib-Lese-Modus) angelegt, und die Struktur zu geben gepufferten Daten und Dateien umfasst.

Datei-Eingang. Unter Verwendung von Standard-E / A ruft Schritt 2 a in stdio.h Eingabefunktion, wie fscanf definiert ist (), getc (). Ein Aufruf dieser Funktionen wird die Puffergröße von Datenblöcken der Datei in den Puffer kopiert.

Dateiausgabe. Ähnlich wie Daten in die Datei Eingangspuffer geschrieben. Wenn der Puffer voll ist, werden die Daten in die Datei kopiert werden.

Standard-I / O-Lese- und Schreibdateien zu stark zu vereinfachen, nicht die Puffer im Programm widerspiegeln, müssen nur direkt darauf schreiben.

Beispiel:

/*Linux 的底层级别读写文件 */
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char * argv[])
{
        int rfd;        //读文件的 fd
        int wfd;        //写文件的 fd
        char buf[512];
        ssize_t n;
    
        printf("%s\n%s\n", argv[1], argv[2]);
        //打卡文件
        rfd = open(argv[1], O_RDONLY);	//读模式
        wfd = open(argv[2], O_WRONLY|O_CREAT);		//写模式,没有就创建一个

        while((n = read(rfd, buf, sizeof(buf))) >  0)	//读文件,linux 如果没有读到末尾,n>0
        {
                printf("%zd\n", n);		//输出读了多少内容
                write(wfd, buf, n);		//写文件
        }

        close(rfd);
        if(close(wfd) == 0)	//保存文件,linux 中如果成功保存 close 返回 0
                printf("write successfully\n");

        return 0;
}

Wie man sehen kann, ist die Verwendung der zugrunde liegenden Ebene I / O-Lese- und Schreib Dateien mehr Schritt, Vergleich, viele einfacheres Verfahren 2.3.2.

Referenz-Bücher

C Primer Plus (sechste Ausgabe) Chinesische Version

Veröffentlicht 42 Originalarbeiten · erntete Lob 3 · Aufrufe 2084

Ich denke du magst

Origin blog.csdn.net/stable_zl/article/details/104147975
Empfohlen
Rangfolge