File I/O
最后一章解释了C编程语言处理的标准输入和输出设备。 本章介绍C程序员如何为其数据存储创建,打开,关闭文本或二进制文件。
文件表示字节序列,无论它是文本文件还是二进制文件。 C编程语言提供对高级功能的访问以及低级(OS级)调用,以处理存储设备上的文件。 本章将指导您完成文件管理的重要调用。
打开文件
您可以使用fopen( )函数创建新文件或打开现有文件。 此调用将初始化FILE类型的对象,该对象包含控制流所需的所有信息。 这个函数调用的原型如下 -
FILE *fopen( const char * filename, const char * mode );
这里, filename是一个字符串文字,您将用它来命名您的文件,访问mode可以具有以下值之一 -
Sr.No. | 模式和说明 |
---|---|
1 | r 打开现有文本文件以供阅读。 |
2 | w 打开文本文件进行写入。 如果它不存在,则创建一个新文件。 在这里,您的程序将开始从文件的开头编写内容。 |
3 | a 打开文本文件以便以附加模式写入。 如果它不存在,则创建一个新文件。 在这里,您的程序将开始在现有文件内容中附加内容。 |
4 | r+ 打开文本文件以进行读写。 |
5 | w+ 打开文本文件以进行读写。 如果文件存在,它首先将文件截断为零长度,否则创建一个文件(如果它不存在)。 |
6 | a+ 打开文本文件以进行读写。 如果文件不存在,它会创建该文件。 读数将从头开始,但只能附加写入。 |
如果您要处理二进制文件,那么您将使用以下访问模式而不是上面提到的模式 -
"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"
关闭一个文件 (Closing a File)
要关闭文件,请使用fclose()函数。 这个功能的原型是 -
int fclose( FILE *fp );
fclose(-)函数在成功时返回零,如果在关闭文件时出错,则返回EOF 。 此函数实际上将缓冲区中仍未处理的任何数据刷新到文件,关闭文件,并释放用于该文件的所有内存。 EOF是头文件stdio.h定义的常量。
C标准库提供了各种功能,用于逐个字符地读取和写入文件,或者以固定长度字符串的形式。
写一个文件 (Writing a File)
以下是将单个字符写入流的最简单函数 -
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 ,并使用两个不同的函数写入两行。 我们将在下一节中阅读此文件。
Reading a File
以下是从文件中读取单个字符的最简单的功能 -
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...
让我们更详细地了解这里发生的事情。 首先, fscanf()读取This因为之后,它遇到了一个空格,第二个调用是fgets() ,它读取剩余的行直到它遇到行尾。 最后,最后一次调用fgets()完全读取第二行。
Binary 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);
这两个函数都应该用于读取或写入存储器块 - 通常是数组或结构。