目录

C - 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);

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

↑回到顶部↑
WIKI教程 @2018