1 文件输入输出函数
1.1 打开和关闭文件
fopen函数
fopen
是 C 标准库中用于打开文件的函数之一。它的原型定义在 <stdio.h>
头文件中,具体格式如下:
FILE *fopen(const char *filename, const char *mode);
这个函数接受两个参数:
filename
:一个以字符串形式表示的文件名,用于指定要打开的文件的名称和路径。mode
:一个以字符串形式表示的打开模式,用于指定文件的打开方式。
fopen
函数返回一个指向 FILE
结构的指针,该结构用于表示文件流。如果打开文件失败,则返回 NULL
。
打开模式指定了文件的打开方式,包括读取、写入、追加等操作。常见的打开模式包括:
"r"
:只读模式,打开一个已存在的文本文件,文件指针位于文件开头。"w"
:写入模式,打开一个文本文件进行写入,如果文件不存在则创建,如果文件已存在则清空内容,文件指针位于文件开头。"a"
:追加模式,打开一个文本文件进行写入,如果文件不存在则创建,文件指针位于文件末尾。"r+"
:读写模式,打开一个已存在的文本文件,文件指针位于文件开头。"w+"
:读写模式,打开一个文本文件进行读写,如果文件不存在则创建,如果文件已存在则清空内容,文件指针位于文件开头。"a+"
:读写模式,打开一个文本文件进行读写,如果文件不存在则创建,文件指针位于文件末尾。
此外,还有对应的二进制文件打开模式,如 "rb"
, "wb"
, "ab"
, "rb+"
, "wb+"
, "ab+"
。
以下是一个示例代码,演示了如何使用 fopen
函数打开文件并进行读取或写入操作:
#include <stdio.h>
int main() {
FILE *file;
char filename[] = "example.txt";
char mode[] = "r";
// 打开一个文件进行读取操作
file = fopen(filename, mode);
// 检查文件是否成功打开
if (file == NULL) {
printf("无法打开文件\n");
return 1;
}
// 进行读取操作...
// 关闭文件
fclose(file);
return 0;
}
在这个示例中,我们使用 "r"
模式打开了一个名为 example.txt
的文件进行读取操作。如果文件打开失败,则输出一条错误信息。最后,使用 fclose
函数关闭文件流。
fclose函数
fclose
是 C 标准库中用于关闭文件的函数之一。它的原型定义在 <stdio.h>
头文件中,具体格式如下:
int fclose(FILE *stream);
这个函数接受一个参数:
stream
:一个指向FILE
结构的指针,表示要关闭的文件流。
fclose
函数用于关闭之前使用 fopen
函数打开的文件。它会刷新文件缓冲区中的数据,将所有的缓冲区数据写入文件,并释放文件相关的资源。成功关闭文件时,返回 0;关闭失败时,返回一个非零值。
以下是一个示例代码,演示了如何使用 fclose
函数关闭文件:
#include <stdio.h>
int main() {
FILE *file;
char filename[] = "example.txt";
char mode[] = "r";
// 打开一个文件进行读取操作
file = fopen(filename, mode);
// 检查文件是否成功打开
if (file == NULL) {
printf("无法打开文件\n");
return 1;
}
// 进行读取操作...
// 关闭文件
if (fclose(file) == 0) {
printf("文件成功关闭\n");
} else {
printf("关闭文件时发生错误\n");
}
return 0;
}
在这个示例中,我们使用 fclose
函数关闭了之前打开的文件。如果关闭成功,则输出一条消息表示文件已成功关闭;如果关闭失败,则输出一条错误消息。
1.2 读取和写入数据
fread函数
fread
是 C 标准库中用于从文件中读取数据的函数之一。它的原型定义在 <stdio.h>
头文件中,具体格式如下:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
这个函数接受四个参数:
ptr
:一个指向数据存储位置的指针,用于存储从文件中读取的数据。size
:要读取的每个数据项的大小(以字节为单位)。nmemb
:要读取的数据项的数量。stream
:一个指向FILE
结构的指针,表示要读取数据的文件流。
fread
函数从指定的文件流中读取数据,并将数据存储到指定的内存位置。它会尝试从文件中读取 size * nmemb
个字节的数据,并将读取到的数据存储到 ptr
指向的内存位置。成功读取的数据项数量将被返回,如果到达文件结尾或发生错误,则返回一个小于 nmemb
的值。
以下是一个示例代码,演示了如何使用 fread
函数从文件中读取数据:
#include <stdio.h>
int main() {
FILE *file;
char filename[] = "example.bin";
char buffer[100];
size_t read_count;
// 打开一个二进制文件进行读取操作
file = fopen(filename, "rb");
// 检查文件是否成功打开
if (file == NULL) {
printf("无法打开文件\n");
return 1;
}
// 从文件中读取数据
read_count = fread(buffer, sizeof(char), 100, file);
// 检查读取结果
if (read_count > 0) {
printf("成功读取了 %zu 个字节的数据\n", read_count);
// 对读取到的数据进行处理...
} else {
printf("读取文件时发生错误\n");
}
// 关闭文件
fclose(file);
return 0;
}
在这个示例中,我们使用 fopen
函数打开了一个名为 example.bin
的二进制文件进行读取操作。然后,我们使用 fread
函数从文件中读取了最多 100 个字节的数据,并将读取到的数据存储到 buffer
数组中。最后,我们检查了读取到的数据项数量,并对读取到的数据进行了处理。
fwrite函数
fwrite
是 C 标准库中用于向文件中写入数据的函数之一。它的原型定义在 <stdio.h>
头文件中,具体格式如下:
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
这个函数接受四个参数:
ptr
:一个指向数据的指针,指向要写入文件的数据。size
:要写入的每个数据项的大小(以字节为单位)。nmemb
:要写入的数据项的数量。stream
:一个指向FILE
结构的指针,表示要写入数据的文件流。
fwrite
函数将数据从指定的内存位置写入到指定的文件流中。它会尝试将 size * nmemb
个字节的数据从 ptr
指向的内存位置写入到文件流中。成功写入的数据项数量将被返回,如果发生错误,则返回一个小于 nmemb
的值。
以下是一个示例代码,演示了如何使用 fwrite
函数向文件中写入数据:
#include <stdio.h>
int main() {
FILE *file;
char filename[] = "example.txt";
char buffer[] = "Hello, world!";
size_t write_count;
// 打开一个文本文件进行写入操作
file = fopen(filename, "w");
// 检查文件是否成功打开
if (file == NULL) {
printf("无法打开文件\n");
return 1;
}
// 向文件中写入数据
write_count = fwrite(buffer, sizeof(char), sizeof(buffer), file);
// 检查写入结果
if (write_count > 0) {
printf("成功写入了 %zu 个字节的数据\n", write_count);
} else {
printf("写入文件时发生错误\n");
}
// 关闭文件
fclose(file);
return 0;
}
在这个示例中,我们使用 fopen
函数打开了一个名为 example.txt
的文本文件进行写入操作。然后,我们使用 fwrite
函数将包含 "Hello, world!" 字符串的缓冲区数据写入到文件中。最后,我们检查了写入到文件的数据项数量,并输出了相应的结果。
1.3 文件检查
feof函数
feof
是 C 标准库中用于检查文件流是否已经到达文件结尾的函数之一。它的原型定义在 <stdio.h>
头文件中,具体格式如下:
int feof(FILE *stream);
这个函数接受一个参数:
stream
:一个指向FILE
结构的指针,表示要检查的文件流。
feof
函数用于检查指定的文件流是否已经到达了文件结尾。如果文件流已经到达了文件结尾,则返回非零值(即真);否则返回 0(即假)。
通常,feof
函数用于在读取文件时判断是否已经读取完整个文件。
以下是一个示例代码,演示了如何使用 feof
函数检查文件流是否已经到达文件结尾:
#include <stdio.h>
int main() {
FILE *file;
char filename[] = "example.txt";
char ch;
// 打开一个文本文件进行读取操作
file = fopen(filename, "r");
// 检查文件是否成功打开
if (file == NULL) {
printf("无法打开文件\n");
return 1;
}
// 读取文件内容并输出
while (!feof(file)) {
ch = fgetc(file);
if (!feof(file)) {
printf("%c", ch);
}
}
// 关闭文件
fclose(file);
return 0;
}
在这个示例中,我们使用 fopen
函数打开了一个名为 example.txt
的文本文件进行读取操作。然后,我们使用 feof
函数在读取文件内容时循环检查文件流是否已经到达了文件结尾。最后,我们关闭了文件流。
ferror函数
ferror
是 C 标准库中用于检查文件流是否发生了错误的函数之一。它的原型定义在 <stdio.h>
头文件中,具体格式如下:
int ferror(FILE *stream);
这个函数接受一个参数:
stream
:一个指向FILE
结构的指针,表示要检查的文件流。
ferror
函数用于检查指定的文件流是否发生了错误。如果文件流发生了错误,则返回非零值(即真);否则返回 0(即假)。
通常,ferror
函数用于在文件操作过程中检查是否发生了错误,以及在发生错误时采取相应的错误处理措施。
以下是一个示例代码,演示了如何使用 ferror
函数检查文件流是否发生了错误:
#include <stdio.h>
int main() {
FILE *file;
char filename[] = "example.txt";
// 打开一个不存在的文件进行写入操作
file = fopen(filename, "w");
// 检查文件是否成功打开
if (file == NULL) {
printf("无法打开文件\n");
return 1;
}
// 在写入数据之前检查文件流是否发生了错误
if (ferror(file)) {
printf("文件流发生了错误\n");
} else {
printf("文件流未发生错误\n");
}
// 关闭文件
fclose(file);
return 0;
}
在这个示例中,我们使用 fopen
函数打开了一个不存在的文件 example.txt
进行写入操作。然后,我们使用 ferror
函数在写入数据之前检查文件流是否发生了错误,并输出相应的消息。最后,我们关闭了文件流。
1.4 文件流中的字符输入输出
fgetc函数
fgetc
是 C 标准库中用于从文件中读取一个字符的函数之一。它的原型定义在 <stdio.h>
头文件中,具体格式如下:
int fgetc(FILE *stream);
这个函数接受一个参数:
stream
:一个指向FILE
结构的指针,表示要读取字符的文件流。
fgetc
函数从指定的文件流中读取一个字符,并返回读取到的字符的 ASCII 码值。如果读取成功,则返回读取到的字符的 ASCII 码值;如果到达文件结尾或发生错误,则返回 EOF
(通常是 -1)。
通常,fgetc
函数用于逐个字符地读取文件内容,直到文件结束。
以下是一个示例代码,演示了如何使用 fgetc
函数从文件中逐个字符地读取内容:
#include <stdio.h>
int main() {
FILE *file;
char filename[] = "example.txt";
char ch;
// 打开一个文本文件进行读取操作
file = fopen(filename, "r");
// 检查文件是否成功打开
if (file == NULL) {
printf("无法打开文件\n");
return 1;
}
// 逐个字符读取文件内容并输出
while ((ch = fgetc(file)) != EOF) {
printf("%c", ch);
}
// 关闭文件
fclose(file);
return 0;
}
在这个示例中,我们使用 fopen
函数打开了一个名为 example.txt
的文本文件进行读取操作。然后,我们使用 fgetc
函数逐个字符地从文件中读取内容,并输出到控制台。当读取到文件结尾时,fgetc
函数返回 EOF
,循环结束。最后,我们关闭了文件流。
fgets函数
fgets
是 C 标准库中用于从文件中读取一行字符串的函数之一。它的原型定义在 <stdio.h>
头文件中,具体格式如下:
char *fgets(char *s, int size, FILE *stream);
这个函数接受三个参数:
s
:一个指向字符数组的指针,用于存储读取到的字符串。size
:要读取的最大字符数(包括结尾的空字符\0
)。stream
:一个指向FILE
结构的指针,表示要读取数据的文件流。
fgets
函数从指定的文件流中读取一行字符串,并将其存储到指定的字符数组中。它会一直读取字符,直到遇到换行符 \n
、到达指定的字符数限制、到达文件结尾或发生错误为止。读取到的字符串将以 null 结尾,并包含换行符(如果存在)。
通常,fgets
函数用于按行读取文本文件的内容。
以下是一个示例代码,演示了如何使用 fgets
函数从文件中逐行读取内容:
#include <stdio.h>
int main() {
FILE *file;
char filename[] = "example.txt";
char buffer[100];
// 打开一个文本文件进行读取操作
file = fopen(filename, "r");
// 检查文件是否成功打开
if (file == NULL) {
printf("无法打开文件\n");
return 1;
}
// 逐行读取文件内容并输出
while (fgets(buffer, sizeof(buffer), file) != NULL) {
printf("%s", buffer);
}
// 关闭文件
fclose(file);
return 0;
}
在这个示例中,我们使用 fopen
函数打开了一个名为 example.txt
的文本文件进行读取操作。然后,我们使用 fgets
函数逐行读取文件内容,并输出到控制台。当读取到文件结尾时,fgets
函数返回 NULL
,循环结束。最后,我们关闭了文件流。
fputc函数
fputc
是 C 标准库中用于向文件中写入一个字符的函数之一。它的原型定义在 <stdio.h>
头文件中,具体格式如下:
int fputc(int c, FILE *stream);
这个函数接受两个参数:
c
:要写入文件的字符,以 ASCII 码值的形式传递。stream
:一个指向FILE
结构的指针,表示要写入数据的文件流。
fputc
函数将指定的字符写入到指定的文件流中,并返回写入的字符的 ASCII 码值。如果写入成功,则返回写入的字符的 ASCII 码值;如果发生错误,则返回 EOF
(通常是 -1)。
通常,fputc
函数用于逐个字符地写入文件内容。
以下是一个示例代码,演示了如何使用 fputc
函数向文件中逐个字符地写入内容:
#include <stdio.h>
int main() {
FILE *file;
char filename[] = "example.txt";
char ch;
// 打开一个文本文件进行写入操作
file = fopen(filename, "w");
// 检查文件是否成功打开
if (file == NULL) {
printf("无法打开文件\n");
return 1;
}
// 向文件中逐个字符地写入内容
for (ch = 'A'; ch <= 'Z'; ch++) {
fputc(ch, file);
}
// 关闭文件
fclose(file);
return 0;
}
在这个示例中,我们使用 fopen
函数打开了一个名为 example.txt
的文本文件进行写入操作。然后,我们使用 fputc
函数逐个字符地向文件中写入从 'A' 到 'Z' 的字母。最后,我们关闭了文件流。
fputs函数
fputs
是 C 标准库中用于向文件中写入字符串的函数之一。它的原型定义在 <stdio.h>
头文件中,具体格式如下:
int fputs(const char *s, FILE *stream);
这个函数接受两个参数:
s
:一个以 null 结尾的字符串,表示要写入文件的字符串。stream
:一个指向FILE
结构的指针,表示要写入数据的文件流。
fputs
函数将指定的字符串写入到指定的文件流中,并返回一个非负数表示成功,或者返回 EOF
(通常是 -1)表示失败。
与 fputs
相似的还有 puts
函数,但 puts
函数将字符串写入标准输出(通常是屏幕),而不是文件。
以下是一个示例代码,演示了如何使用 fputs
函数向文件中写入字符串:
#include <stdio.h>
int main() {
FILE *file;
char filename[] = "example.txt";
char str[] = "Hello, world!";
// 打开一个文本文件进行写入操作
file = fopen(filename, "w");
// 检查文件是否成功打开
if (file == NULL) {
printf("无法打开文件\n");
return 1;
}
// 向文件中写入字符串
if (fputs(str, file) != EOF) {
printf("成功写入字符串到文件\n");
} else {
printf("写入文件时发生错误\n");
}
// 关闭文件
fclose(file);
return 0;
}
在这个示例中,我们使用 fopen
函数打开了一个名为 example.txt
的文本文件进行写入操作。然后,我们使用 fputs
函数将字符串 "Hello, world!" 写入到文件中。最后,我们关闭了文件流。
1.5 文件流中的标准输入输出
fprintf函数
fprintf
是 C 标准库中用于向文件中写入格式化数据的函数之一。它的原型定义在 <stdio.h>
头文件中,具体格式如下:
int fprintf(FILE *stream, const char *format, ...);
这个函数接受一个或多个参数:
stream
:一个指向FILE
结构的指针,表示要写入数据的文件流。format
:一个以字符串形式表示的格式化控制字符串,用于指定输出的格式。...
:表示可变数量的参数列表,用于传递要格式化输出的数据。
fprintf
函数根据指定的格式控制字符串,将格式化数据写入到指定的文件流中。它的用法类似于 printf
函数,但 fprintf
输出到文件流而不是标准输出流。
以下是一个示例代码,演示了如何使用 fprintf
函数向文件中写入格式化数据:
#include <stdio.h>
int main() {
FILE *file;
char filename[] = "example.txt";
int num = 10;
float pi = 3.14159;
// 打开一个文本文件进行写入操作
file = fopen(filename, "w");
// 检查文件是否成功打开
if (file == NULL) {
printf("无法打开文件\n");
return 1;
}
// 向文件中写入格式化数据
fprintf(file, "整数:%d\n", num);
fprintf(file, "浮点数:%f\n", pi);
// 关闭文件
fclose(file);
return 0;
}
在这个示例中,我们使用 fopen
函数打开了一个名为 example.txt
的文本文件进行写入操作。然后,我们使用 fprintf
函数向文件中写入了一个整数和一个浮点数,并指定了相应的格式。最后,我们关闭了文件流。
fscanf函数
fscanf
是 C 标准库中用于从文件中读取格式化数据的函数之一。它的原型定义在 <stdio.h>
头文件中,具体格式如下:
int fscanf(FILE *stream, const char *format, ...);
这个函数接受一个或多个参数:
stream
:一个指向FILE
结构的指针,表示要读取数据的文件流。format
:一个以字符串形式表示的格式化控制字符串,用于指定输入的格式。...
:表示可变数量的参数列表,用于传递要读取的数据。
fscanf
函数根据指定的格式控制字符串,从指定的文件流中读取数据并将其存储到指定的变量中。它的用法类似于 scanf
函数,但 fscanf
从文件流中读取数据而不是标准输入流。
以下是一个示例代码,演示了如何使用 fscanf
函数从文件中读取格式化数据:
#include <stdio.h>
int main() {
FILE *file;
char filename[] = "example.txt";
int num;
float pi;
// 打开一个文本文件进行读取操作
file = fopen(filename, "r");
// 检查文件是否成功打开
if (file == NULL) {
printf("无法打开文件\n");
return 1;
}
// 从文件中读取格式化数据
fscanf(file, "整数:%d\n", &num);
fscanf(file, "浮点数:%f\n", &pi);
// 输出读取到的数据
printf("整数:%d\n", num);
printf("浮点数:%f\n", pi);
// 关闭文件
fclose(file);
return 0;
}
在这个示例中,我们使用 fopen
函数打开了一个名为 example.txt
的文本文件进行读取操作。然后,我们使用 fscanf
函数从文件中读取了一个整数和一个浮点数,并将它们存储到相应的变量中。最后,我们输出了读取到的数据,并关闭了文件流。
文件定位
fseek函数
fseek
是 C 标准库中用于设置文件位置指针的函数之一。它的原型定义在 <stdio.h>
头文件中,具体格式如下:
int fseek(FILE *stream, long int offset, int whence);
这个函数接受三个参数:
stream
:一个指向FILE
结构的指针,表示要设置位置指针的文件流。offset
:偏移量,表示要移动的字节数。whence
:指定起始位置的方式,可以是SEEK_SET
、SEEK_CUR
或SEEK_END
。
fseek
函数用于设置指定文件流的位置指针,以便在文件中进行随机访问。根据 whence
参数的不同,offset
表示相对于文件起始位置、当前位置或文件末尾的偏移量。成功设置位置指针后,fseek
返回 0;如果发生错误,则返回一个非零值。
以下是 whence
参数的三种取值:
SEEK_SET
:将位置指针设置到文件开头加上offset
字节处。SEEK_CUR
:将位置指针设置到当前位置加上offset
字节处。SEEK_END
:将位置指针设置到文件末尾加上offset
字节处。
以下是一个示例代码,演示了如何使用 fseek
函数在文件中设置位置指针:
#include <stdio.h>
int main() {
FILE *file;
char filename[] = "example.txt";
long int offset = 10;
// 打开一个文本文件进行读取操作
file = fopen(filename, "r");
// 检查文件是否成功打开
if (file == NULL) {
printf("无法打开文件\n");
return 1;
}
// 设置位置指针到文件末尾
if (fseek(file, -offset, SEEK_END) == 0) {
printf("位置指针成功设置到文件末尾向前 %ld 字节\n", offset);
} else {
printf("设置位置指针时发生错误\n");
}
// 关闭文件
fclose(file);
return 0;
}
在这个示例中,我们使用 fopen
函数打开了一个名为 example.txt
的文本文件进行读取操作。然后,我们使用 fseek
函数将位置指针设置到文件末尾向前偏移 10 个字节处。如果设置成功,我们输出相应的消息;如果设置失败,我们输出错误消息。最后,我们关闭了文件流。