📅  最后修改于: 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()会完全读取第二行。
有两个功能,可用于二进制输入和输出-
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);
这两个函数都应用于读取或写入内存块-通常是数组或结构。