目录
介绍
C语言提供了一套强大而灵活的文件IO库,允许你在程序中读取和写入文件。文件IO是许多应用程序的关键组成部分,包括文本处理、配置文件读写、数据存储等等。
两种文件操作方式:既可以使用由操作系统直接提供的系统调用函数接口,也可以使用标准C库提供的库函数调用。
在系统调用和C库中,都有一组函数专门用于文件操作的:比如打开文件、关闭文件、读写文件。如果是系统调用----文件IO(系统IO);如果是库函数调用---标准IO。
本文将介绍C语言中标准文件IO(库函数调用)的基本概念和操作,并附带代码示例。
打开文件
在C语言中,要操作一个文件,首先需要打开它。你可以使用fopen
函数来打开一个文件。
const char *mode:指针,字符串首地址,字符串表示打开的方式 "w":只写方式打开文本文件,如果打开文件存在则清空文件,文件不存在则创建文件,在文件开始位置进行操作 "w+":读写方式打开文本文件,如果打开文件存在则清空文件,文件不存在则创建文件,在文件开始位置进行操作 | |
返回的文件指针,是一种FILE结构体的地址(指向FILE类型的指针),FILE结构体就描述打开文件的各种信息。下面是一个示例:
#include <stdio.h>
int main()
{
FILE * fd;//声明一个文件指针
fd = fopen("data.txt","r");//以只读的方式打开data.txt文件
if(fd == NULL)//判断是否为空,为空表示打开失败
{
printf("文件打开失败\n");
}
fclose(fd);//关闭文件
}
上面的代码使用fopen
函数以只读方式打开一个名为"data.txt"的文件。如果文件打开成功,fopen
将返回一个指向FILE
结构的指针,否则返回NULL
。
在程序执行时,默认会为当前程序打开三个文件:
读写文件
标准IO函数,读写接口非常多:
第一组:每次一个字符的读写标准IO函数接口:fgetc() 和 fputc()
第二组:每次一行的读写标准IO函数:fgets() 和 fputs()
第三组:每次读写若干数据块的标准IO函数:fread() 和 fwrite()
注意:文件io的读写函数每一组都是相互匹配的,不能混用。
fgetc() 和 fputc()
下面是一个示例:
#include <stdio.h>
int main()
{
fputc('a',stdout);//将字符a写入终端文件中
char c;
c = fgetc(stdin);//从键盘文件中获取一个字符
printf("%c\n",c);
}
上面的代码使用fputc()将一个字符写入终端文件中等价于printf(),fgetc()从从键盘文件中读取数据,等价于scanf()。
fgets() 和 fputs()
int fputs(const char *s, FILE *stream); | |
下面是一个示例:
#include <stdio.h>
int main()
{
char buf[20];
fgets(buf,sizeof(buf),stdin);//从键盘文件中读取数据,等价于scanf()
fputs(buf,sizeof(buf),stdout);//将数据写入终端文件中,等价于printf()
printf("%s\n",buf);
}
上面的代码使用fputs()将字符串数据写入终端文件中等价于printf(),fgetc()从从键盘文件中读取数据,等价于scanf()。
fread() 和 fwrite()
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); | ||
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream); | |
因为fread、fwrite是严格按照数据块和数据块大小来处理,而不会对数据格式做处理,数据中的特殊字符'\0','\n'不会受到影响,可以用于二进制文件操作。
缓冲机制
标准IO的缓冲机制:
使用标准IO读写操作,在打开文件时会创建缓冲区,用于读写文件
读:从内核中读取一段数据到缓冲区,应用程序读操作就从缓冲区中读取
写:写入文件时,先把数据写入缓冲区,当缓冲区满足一定条件,才会写入文件
三种缓冲机制:
无缓冲-----stderr
行缓冲:只要在缓冲区遇到 '\n',把缓冲区数据刷新到文件-----stdin、stdout
全缓冲:只要缓冲区满,把缓冲区数据刷新到文件----其他用标准io打开的文件
需要注意的是,如果程序正常退出,缓冲区中的数据通常会被自动刷新。但是,如果程序异常终止,可能会导致缓冲区中的数据丢失。因此,在重要数据的情况下,最好手动刷新缓冲或使用 fflush()
来确保数据写入文件。
关闭文件
无论是读取还是写入文件,在完成操作后都应该关闭文件,以释放资源并确保文件的完整性。使用fclose
函数来关闭文件,如上述示例中所示。
总结
文件IO是C语言编程中非常重要的一部分,本文介绍了如何打开、读取和写入文件,以及如何关闭文件。通过这些基本操作,你可以进行更复杂的文件处理,例如配置文件解析、日志记录和数据存储等任务。