最后一章解释了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"
要关闭文件,请使用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()完全读取第二行.
有两个函数,可用于二进制输入和输出 :
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);
这两个函数都应该用于读取或写入内存块 - 通常是数组或结构.