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);
这两个函数都应用于读取或写入内存块-通常是数组或结构。