C语言 文件I/O

上一章介绍了用C编程语言处理的标准输入和输出设备,本章介绍C程序员如何创建,打开,关闭文本或二进制文件进行数据存储。

打开文件

您可以使用 fopen()函数来创建新文件或打开现有文件。该函数调用的原型如下-

FILE *fopen( const char * filename, const char * mode );

在这里, filename 是一个字符串文字,您将使用它来命名文件,访问 mode 可以具有以下值之一-

No. Mode 描述
1 r 打开现有的文本文件以供阅读。
2 w 打开一个文本文件进行写入。如果不存在,则创建一个新文件。
3 a 打开一个文本文件以在追加模式下写入。如果不存在,则创建一个新文件。
4 r+ 打开一个文本文件以供读取和写入。
5 w+ 打开一个文本文件以供读取和写入。
6 a+ 打开一个文本文件以供读取和写入。

如果您要处理二进制文件,则将使用以下访问模式而不是上述访问模式-

    "rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"

关闭文件

要关闭文件,请使用fclose()函数。该函数的原型是-

int fclose( FILE *fp );

fclose() - 函数成功返回零,如果关闭文件出错,则返回 EOF 。

C标准库提供了各种函数,可以逐字符或以固定长度的字符串形式读取和写入文件。

写入文件

以下是将单个字符写入文件的最简单函数-

 int fputc( int c, FILE *fp );

函数 fputc()将参数c的字符值写入fp引用的输出流。如果出现错误,它将返回成功写入的书面字符,否则返回 EOF。您可以使用以下函数将以null终止的字符串写入流-

int fputs( const char *s, FILE *fp );

您还可以使用 int fprintf(FILE fp,const char format,…) 函数将字符串写入文件,请尝试以下示例。

#include <stdio.h>

main() {
   FILE *fp;

   fp=fopen("/tmp/test.txt", "w+");
   fprintf(fp, "This is testing for fprintf...\n");
   fputs("This is testing for fputs...\n", fp);
   fclose(fp);
}

编译并执行上述代码后,它将在/tmp目录中创建一个新文件 test.txt ,并使用两个不同的函数编写两行。

读取文件

下面给出的是从文件读取单个字符的最简单函数-

int fgetc( FILE * fp );

fgetc()函数从fp引用的输入文件中读取字符,返回值是读取的字符,如果有错误,则返回 EOF ,以下函数允许从流中读取字符串-

 char *fgets( char *buf, int n, FILE *fp );

函数 fgets()从fp引用的输入流中读取最多n-1个字符。它将读取的字符串复制到缓冲区 buf 中,并附加一个 null 字符以终止该字符串。

如果此函数在读取最大字符数之前遇到换行符’\n’或文件EOF的末尾,则它仅返回直到该点为止已读取的字符,包括换行符。您还可以使用 int fscanf(FILE * fp,const char * format,...)函数从文件中读取字符串,但是遇到第一个空格字符后它将停止读取。

 #include <stdio.h>

 main() {

    FILE *fp;
    char buff[255];

    fp=fopen("/tmp/test.txt", "r");
    fscanf(fp, "%s", buff);
    printf("1 : %s\n", buff );

    fgets(buff, 255, (FILE*)fp);
    printf("2: %s\n", buff );

    fgets(buff, 255, (FILE*)fp);
    printf("3: %s\n", buff );
    fclose(fp);

 }

编译并执行上述代码后,它将读取上一部分中创建的文件,并产生以下输出-

1 : This
2: is testing for fprintf...
3: This is testing for fputs...

二进制I/O函数

有两个函数,可用于二进制输入和输出-

size_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);
size_t fwrite(const void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);

这两个函数都应用于读取或写入内存块-通常是数组或结构。