一个文件,不管它是文本文件还是二进制文件,都是代表了一系列的字节。C 言语不只供给了访问顶层的函数,也供给了底层(OS)调用来处理存储设备上的文件。本章将解说文件管理的重要调用。
打开文件
您可以运用 fopen( ) 函数来创立一个新的文件或许打开一个已有的文件,这个调用会初始化类型 FILE 的一个目标,类型 FILE 包含了所有用来控制流的必要的信息。下面是这个函数调用的原型:
FILE *fopen( const char *filename, const char *mode );
在这里,filename 是字符串,用来命名文件,访问方式 mode 的值可以是下列值中的一个:
假如处理的是二进制文件,则需运用下面的访问方式来替代上面的访问方式:
"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 目录,假如不存在该目录,则需要在您的计算机上先创立该目录。
/tmp 一般是 Linux 体系上的暂时目录,假如你在 Windows 体系上运转,则需要修改为本地环境中已存在的目录,例如: C:\tmp、D:\tmp等。
#include <stdio.h>
int main()
{
FILE *fp = NULL;
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>
int main()
{
FILE *fp = NULL;
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() 完整地读取第二行。
二进制 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);
这两个函数都是用于存储块的读写 – 通常是数组或结构体。
对 fopen()函数弥补阐明几点:
FILE *fopen( const char * filename, const char * mode );
- 该函数或许执行失败,回来值是NULL,安全起见有必要对回来值进行合法性判别;
- 该函数有多种方式,其中r+和w+看似相同,都是读写其实还是有几点区别的;
- 1.方式r+找不到文件不会主动新建,而w+会;
- 2.方式r+打开文件后,不会铲除文件原数据,若直接开端写入,只会从起始方位开端进行覆盖,而w+会直接清零后,再开端读写;
- 方式的合法性阐明:不能用大写,只能是小写,且rb+和r+b都是合法的,但br+和+rb等都是非法的,w和a也是相同的处理;
- 方式w的主动新建文件是有条件的,只要对应的路径存在(即文件地点的文件夹存在),文件不存在才会新建,否则是不会新建的,回来NULL