文件,对我们并不陌生,文件是数据源(保存数据的地方)的一种,比如大家经常使用的word文档,txt文件,excel文件...都是文件。文件最主要的作用就是保存数据,它既可以保存一张图片,也可以保持视频,声音...
C程序中,文件中数据的输入/输出操作以“流”的方式进行,可以看做是一种数据的流动。
输入流(Input Stream):数据从数据源(例如文件、键盘等)到程序(内存)的传输路径。
输出流(Output Stream):数据从程序(内存)到数据源(例如文件、屏幕等)的传输路径。
一:输入与输出
- 当我们提到输入时,这意味着要向程序(内存)中写入一些数据。输入的数据来源可以是从键盘中、从文件中或从网络中。C语言提供了一系列内置的函数来读取给定的输入,并根据需要写入到程序中。
- 当我们提到输出时,这意味着要在屏幕上、打印机上或文件中显示(或保存)一些数据。同样,C语言提供了一系列内置的函数来输出数据到指定的载体上。
(1)标准文件
C 语言把所有的设备都当作文件,所以设备(比如显示器)被处理的方式与文件相同。以下三个文件会在程序执行时自动打开,以便访问键盘和屏幕。
标准文件 |
文件指针 |
设备 |
标准输入 |
stdin |
键盘 |
标准输出 |
stdout |
屏幕 |
标准错误 |
stderr |
屏幕 |
文件指针是访问文件的方式,我们会讲解如何从键盘获取输入值以及如何把结果输出到屏幕上。
(2)scanf()和printf()函数
C语言中的I/O (输入/输出)通常使用printf()和scanf()两个函数,scanf()函数从标准输入流stdin读取输入,printf()函数把输出写入到标准输出流stdout。这两个函数我们在前面的案例中已经大量使用。
(3)getchar() & putchar() 函数
getchar 函数
getchar() 函数用于从标准输入流(通常是键盘输入)读取一个字符。这个函数在同一个时间内只会读取一个单一的字符。
int getchar(void);
返回值说明:
返回一个整数值,表示读取的字符。
putchar 函数
putchar()函数用于将一个字符写入到标准输出流(通常是屏幕)。这个函数在同一个时间内只会输出一个单一的字符。
int putchar(int character);
返回值说明:
返回一个整数值,是写入的字符的ASCII码值。
参数说明:
character是要写入的字符的ASCII码值。
#include <>
int main()
{
// 从键盘输入一个字符,用char类型变量存储
char ch = getchar();
//输出打印字符
putchar(ch);
return 0;
}
(4)gets()和puts() 函数
gets 函数
gets() 函数用于从标准输入流(通常是键盘)读取一行文本,并将其存储在一个字符数组中(gets() 的参数),直到遇到换行符为止。
char *gets(char *str);
返回值说明:
返回一个指向存储在 str 中的字符串的指针
参数说明:
字符数组(字符串)的指针,用于存储读取的输入数据。
puts 函数
puts() 函数用于将字符串输出到标准输出流(通常是屏幕),并自动添加换行符。它接受一个字符串作为参数,然后将其显示在屏幕上。
int puts(const char *str);
返回值说明:
返回成功写入的字符数,如果写入失败或出现错误,它会返回 特殊值EOF((EOF 是一个定义在 头文件中的常量,值通常为 -1))。
参数说明:
str 是要输出的字符串。
#include <>
int main()
{
// 定义字符数组:用来保存用户从键盘输入的数据
char buffer[100];
// 输入
gets(buffer);
// 输出
puts(buffer);
return 0;
}
二:文件的读写
文件,无论是文本文件还是二进制文件,都以一系列字节的形式存在,C语言提供了一系列函数处理存储设备上的文件。
(1)打开文件
使用fopen( ) 函数来创建一个新的文件或者打开一个已有的文件。该函数位于标准库的 头文件中。
FILE *fopen( const char *filename, const char *mode );
返回值说明:
返回一个指向 FILE 结构的指针,该结构表示文件流,可以使用这个指针来进行文件的读取和写入操作。如果打开文件失败,返回一个空指针(NULL)。
参数说明:
filename是一个以字符串形式指定的文件名,表示要打开的文件的名称,可以包括文件路径和文件名。
mode 是一个以字符串形式指定的打开模式,表示打开文件的方式,可以是以下值之一:
模式 |
描述 |
r |
只读模式。 打开一个已有的文本文件,只允许读取文件。 |
w |
只写模式。 打开一个文本文件,从头写入文件。如果文件不存在,则会创建一个新文件并写入;如果文件存在,则清空文件并从头写入。 |
a |
追加模式。 打开一个文本文件,追加写入文件。如果文件不存在,则会创建一个新文件并写入;如果文件存在,在已有内容后面追加写入。 |
rb |
只读二进制模式。 打开一个已有的二进制文件,只允许读取文件。 |
wb |
只写二进制模式。 打开一个二进制文件,从头写入文件。如果文件不存在,则会创建一个新文件并写入;如果文件存在,则清空文件并从头写入。 |
ab |
追加二进制模式。 打开一个二进制文件,追加写入文件。如果文件不存在,则会创建一个新文件并写入;如果文件存在,在已有内容后面追加写入。 |
r+ |
读写模式。 打开一个文本文件,允许读写文件。 |
w+ |
读写模式。 打开一个文本文件,从头读写文件。如果文件不存在,则会创建一个新文件并读写;如果文件存在,则清空文件并从头读写。 |
a+ |
读写模式。 打开一个文本文件,读取或追加写入文件。如果文件不存在,则会创建一个新文件并读写;如果文件存在,读取或在已有内容后面追加写入。 |
rb+ |
读写二进制模式。 打开一个二进制文件,允许读写文件。 |
r+b | |
wb+ |
读写二进制模式。 打开一个二进制文件,从头读写文件。如果文件不存在,则会创建一个新文件并读写;如果文件存在,则清空文件并从头读写。 |
w+b | |
ab+ |
读写二进制模式。 打开一个二进制文件,读取或追加写入文件。如果文件不存在,则会创建一个新文件并读写;如果文件存在,读取或在已有内容后面追加写入。 |
a+b |
(2)关闭文件
文件读写完毕后,一定要关闭文件,使用fclose( ) 函数可以关闭文件。该函数位于标准库的 头文件中。
int fclose(FILE *stream);
返回值说明:
返回一个整数值,通常为零(0),表示关闭操作成功。如果关闭失败,它返回特殊值EOF (EOF 是一个定义在 头文件中的常量,值通常为 -1)。
参数说明:
stream是一个指向 FILE 结构的指针,表示要关闭的文件流。
(3)写入文件
fputc 函数
fputc() 函数用于逐字符写入文件。位于标准库的 头文件中。
函数原型:
int fputc(int character, FILE *stream);
返回值说明:
返回一个整数值,通常是写入的字符的ASCII码值。如果写入成功,返回的值与输入的 character 值相同;如果写入失败,它返回特殊值 EOF。
参数说明:
character是要写入的字符,通常以整数形式表示,即字符的ASCII码值。
stream是一个指向 FILE 结构的指针,表示要写入字符的文件流。
#include <>
int main()
{
// C语言中如何操作文件
// 第一个参数:文件名字[字符串即可] 第二个参数:一种模式【mode】
FILE *file = fopen("", "a");
// 判断文件是否创建成功
if (file != NULL)
{
// 写入字符
for (int i = 0; i < 10; i++)
{
fputc('y', file);
}
}
// 关闭文件
fclose(file);
return 0;
}
fputs 函数
fputs() 函数用于将字符串写入文件。位于标准库的 头文件中。
函数原型:
int fputs(const char *str, FILE *stream);
返回值说明:
返回一个整数值,如果写入成功,则返回非负整数(通常是成功写入的字符数,具体取决于编译器),否则返回特殊值 EOF。
参数说明:
str是要写入的字符串,通常以 const char* 指针的形式传递。
stream是指向输出流的指针,通常是文件指针。
#include <>
int main()
{
// 文件操作
FILE *file = fopen("", "a");
if (file != NULL)
{
char *str = "大江东去浪淘尽,千古风流人物!";
fputs(str, file);
}
fclose(file);
return 0;
}
fprintf 函数
fprintf() 函数用于格式化写入文件。位于标准库的 头文件中。
函数原型:
int fprintf(FILE *stream, const char *format, ...);
返回值说明:
返回一个整数值,如果写入成功,则返回非负整数(通常是成功写入的字符数,具体取决于编译器),否则返回特殊值 EOF。
参数说明:
stream是一个指向 FILE 结构的指针,表示要写入的文件流。
format是一个格式化字符串,类似于 printf() 函数中的格式化字符串。
...表示可变数量的参数,根据格式化字符串中的格式占位符对应 。
#include <>
int main()
{
FILE *file = fopen("", "a");
if (file != NULL)
{
fprintf(file, "我是祖国的老%s", "花骨朵");
}
fclose(file);
return 0;
}
(4)读取文件
fgetc 函数
fgetc() 函数用于从文件中逐字符读取。位于标准库的 头文件中。
函数原型:
int fgetc(FILE *stream);
返回值说明:
如果读取成功,它返回所读取字符的ASCII码值(0-255之间的整数),如果到达文件结束或发生错误,它返回特殊值 EOF。
参数说明:
stream是一个指向 FILE 结构的指针,表示要写入字符的文件流。
fgets 函数
fgets() 函数从文件中逐行读取,遇到换行符即读取结束,读取的内容中包含换行符。该函数位于标准库的 头文件中。
函数原型:
char *fgets(char *str, int num, FILE *stream);
返回值说明:
如果读取成功,它返回指向 str 的指针;如果到达文件结束或发生错误,它返回一个空指针(NULL)。
参数说明:
- str是一个指向字符数组的指针,用于存储读取的字符串。
- num是要读取的最大字符数(包括字符串终止符 \0),通常是str的长度。
- stream是一个文件流,通常是标准输入流(stdin)或其他文件流,用于指定从哪里读取数据。
fscanf 函数
fscanf() 函数用于从文件中解析数据并存储到变量中,使用空白字符(空格、制表符、换行符等)分隔内容赋值给不同的变量。该函数位于标准库的 头文件中。
函数原型:
int fscanf(FILE *stream, const char *format, ...);
返回值说明:
返回成功读取和分配的参数数目,如果没有成功读取任何参数,它返回 0;如果读取过程中发生错误,它返回特殊值 EOF。
参数说明:
- stream是一个指向 FILE 结构的指针,表示要从中读取数据的文件流。
- format是一个格式化字符串,类似于 printf() 函数中的格式化字符串。
- ... 表示可变数量的参数,根据格式化字符串中的格式指定要存储数据的变量。
#include <>
int main()
{
// 读取模式
FILE *file = fopen("", "r");
if (file != NULL)
{
// char ch = fgetc(file);
// printf("%c", ch); // 读取一个字符
// char ch1 = fgetc(file);
// printf("%c", ch1); // 读取一个字符
// char buffer[5];
// fgets(buffer, 5, file);
// printf("%s", buffer);
char buffer[100];
fscanf(file, "%s", buffer);
printf("%s", buffer);
}
fclose(file);
return 0;
}