C语言 文件I/O

  • 文件I/O

    上一章介绍了用C编程语言处理的标准输入和输出设备。本章介绍C程序员如何创建,打开,关闭文本或二进制文件进行数据存储。文件代表字节序列,而不管它是文本文件还是二进制文件。C编程语言提供对高级功能的访问以及对存储设备上文件的低级调用(OS级别)。本章将引导您完成文件管理的重要工作。
  • 打开文件

    您可以使用fopen()函数来创建新文件或打开现有文件。此调用将初始化FILE类型的对象,该对象包含控制流所需的所有信息。该函数调用的原型如下-
    
    FILE *fopen( const char * filename, const char * mode );
    
    在这里,filename是一个字符串文字,您将使用它来命名文件,访问mode可以具有以下值之一
    • r - 打开现有的文本文件以供阅读。
    • w - 打开一个文本文件进行写入。 如果不存在,则创建一个新文件。 在这里,程序将从文件开头开始写入内容。
    • a - 打开一个文本文件以在追加模式下写入。 如果不存在,则创建一个新文件。 在这里,您的程序将开始在现有文件内容中追加内容。
    • r+ - 打开一个文本文件以供读取和写入。
    • w+ - 打开一个文本文件以供读取和写入。 如果存在该文件,它将首先将文件的长度截短为零;否则,将其截断。
    • a+ - 打开一个文本文件以供读取和写入。 如果文件不存在,它将创建文件。 阅读将从头开始,但只能附加写作。
    如果您要处理二进制文件,则将使用以下访问模式而不是上述访问模式-
    
    "rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"
    
  • 关闭文件

    要关闭文件,请使用fclose()函数。该函数的原型是-
    int puts(const char *s)函数把字符串 s 和一个尾随的换行符写入到标准输出。
    
    int fclose( FILE *fp );
    
    fclose()函数返回零成功,如果在关闭文件中的错误返回EOF。此函数实际上将缓冲区中仍待处理的所有数据刷新到文件,关闭文件,并释放用于该文件的所有内存。EOF是在头文件stdio.h中定义的常量。
    C标准库提供了各种函数,可以逐字符或以固定长度的字符串形式读取和写入文件。
  • 写入文件

    以下是将单个字符写入流的最简单功能-
    
    int fputc( int c, FILE *fp );
    
    函数fputc()将参数c的字符值写入fp引用的输出流。如果成功,它将返回成功写入的书面字符,否则返回EOF。您可以使用以下函数将以null终止的字符串写入流-
    
    int fputs( const char *s, FILE *fp );
    
    函数fputs()将字符串s写入fp引用的输出流。成功时返回非负值,否则,如果出现任何错误,则返回EOF。您也可以使用int fprintf(FILE * fp,const char * format,...)函数将字符串写入文件。请尝试以下示例。
    确保您有/tmp目录。如果不是,那么在继续之前,必须在计算机上创建此目录。
    
    #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中,并添加一个空字符以终止该字符串。如果此函数在读取最大字符数之前遇到换行符'\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...
    
    让我们详细了解一下这里发生的事情。首先,fscanf()仅读取此内容,因为在此之后,它遇到了一个空格,第二个调用是fgets()的操作,它将读取剩余的行,直到遇到行尾为止。最后,最后一次调用fgets()完全读取第二行。
  • 二进制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);
    
    这两个函数都应用于读取或写入内存块-通常是数组或结构。