📜  C-文件I / O

📅  最后修改于: 2020-12-19 05:31:28             🧑  作者: Mango


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

文件代表字节序列,而不管它是文本文件还是二进制文件。 C编程语言提供对高级功能的访问以及对存储设备上文件的低级调用(OS级别)。本章将引导您完成文件管理的重要工作。

开启档案

您可以使用fopen()函数来创建新文件或打开现有文件。此调用将初始化FILE类型的对象,该对象包含控制流所需的所有信息。该函数调用的原型如下-

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

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

Sr.No. Mode & Description
1

r

Opens an existing text file for reading purpose.

2

w

Opens a text file for writing. If it does not exist, then a new file is created. Here your program will start writing content from the beginning of the file.

3

a

Opens a text file for writing in appending mode. If it does not exist, then a new file is created. Here your program will start appending content in the existing file content.

4

r+

Opens a text file for both reading and writing.

5

w+

Opens a text file for both reading and writing. It first truncates the file to zero length if it exists, otherwise creates a file if it does not exist.

6

a+

Opens a text file for both reading and writing. It creates the file if it does not exist. The reading will start from the beginning but writing can only be appended.

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

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

关闭档案

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

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 

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 

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

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