C - 文件I / O.

最后一章解释了C编程语言处理的标准输入和输出设备.本章介绍了C程序员如何为其数据存储创建,打开,关闭文本或二进制文件.

文件表示一系列字节,无论它是文本文件还是二进制文件文件. C编程语言提供对高级功能的访问以及低级(OS级)调用,以处理存储设备上的文件.本章将引导您完成文件管理的重要调用.

打开文件

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

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

此处, filename 是一个字符串文字,您将用它来命名文件,并访问模式可以具有以下值之一 :

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"

结束a文件

要关闭文件,请使用fclose()函数.这个函数的原型是 :

 
 int fclose(FILE * fp);

fclose( - )函数在成功时返回零,如果出现错误则返回 EOF 在关闭文件.此函数实际上将缓冲区中仍未处理的任何数据刷新到文件,关闭文件,并释放用于该文件的所有内存. EOF是头文件 stdio.h 中定义的常量.

C标准库提供了各种函数来读写文件,字符由字符,或者是固定长度字符串的形式.

编写文件

以下是将单个字符写入流中的最简单函数;

 
 int fputc(int c,FILE * fp);

函数 fputc()将参数c的字符值写入fp引用的输出流.如果出现错误,它将返回写入成功的书写字符,否则 EOF .您可以使用以下函数将以空值终止的字符串写入流 :

 
 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 ,附加 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()只读,因为之后,它遇到了一个空格,第二个调用是 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);

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