探索C语言中的文件操作
前言
本章了解linux系统下的文件,文件指什么?怎么对文件进行操作?
1 文件
1.1 什么是文件
在操作系统中,不同硬件设备也被看做一个文件。
例如:通常把显示器称为标准输出文件、把键盘称为标准输入文件
(信息来源:C语言中的文件是什么? (biancheng.net))
1.2 操作文件的流程
打开文件 --> 读写文件 --> 关闭文件
1.3 文件读写
在C语言中,文件有多种读写方式,可以一个字符一个字符地读取,也可以读取一整行,还可以读取若干个字节。文件的读写位置也非常灵活,可以从文件开头读取,也可以从中间位置读取。
2 文件流
文件流(File Streams)是指在程序中用于读取和写入文件的抽象概念。它提供了一种逻辑上的数据流,使得程序可以像读写内存或其他数据源一样读写文件。
2.1 打开文件流
使用相应的函数或方法打开文件流,将文件与文件流关联起来。
这通常涉及指定文件的路径、打开模式(读取、写入、追加等)以及访问权限等参数。
fopen()函数
函数声明:FILE* fopen(const char* filename, const char* mode);
该函数接受两个参数:
-
filename
:表示要打开的文件的路径和名称,以字符串形式提供。 -
mode
:表示打开文件的模式,以字符串形式提供。模式参数可以是以下之一:-
"r"
:只读模式,打开已存在的文件进行读取。 -
"w"
:写入模式,创建一个新文件进行写入。如果文件已存在,则会清空文件内容。 -
"a"
:追加模式,打开已存在的文件进行追加写入。如果文件不存在,则创建一个新文件。 -
"rb"
、"wb"
、"ab"
:类似的模式,但用于以二进制形式读取或写入文件。
-
fopen()
函数会返回一个指向FILE
结构的指针,该指针用于后续对文件流进行操作。
#include <stdio.h>
int main() {
FILE* file = fopen("file.txt", "r");
if (file == NULL) {
printf("Failed to open the file.\n");
return 1;
}
// 文件流打开成功,可以进行后续的读取或写入操作
// 关闭文件流
fclose(file);
return 0;
}
2.2 读取文件流
2.2.1 fscanf()函数
作用:它可以根据格式字符串的要求,从文件流中读取数据并将其存储到相应的变量中。
函数声明:int fscanf(FILE* stream, const char* format, ...);
它接受三个参数:
-
stream
:指向要读取的文件流的指针(通过fopen()
函数打开文件后返回的指针)。 -
format
:格式字符串,用于指定读取数据的格式和要读取的数据类型。 -
...
:可变参数,用于指定要读取数据的目标变量。
#include <stdio.h>
int main() {
FILE* file = fopen("file.txt", "r");
if (file == NULL) {
printf("Failed to open the file.\n");
return 1;
}
int num1, num2;
fscanf(file, "%d %d", &num1, &num2); // 从文件中读取两个整数
printf("Read integers: %d, %d\n", num1, num2);
fclose(file);
return 0;
}
2.2.2 fgets()函数
作用:fgets()
函数用于从文件流中逐行读取文本内容。它可以读取包括换行符在内的整行文本,并将其存储到指定的缓冲区中。
函数声明:char* fgets(char* str, int size, FILE* stream);
它接受三个参数:
-
str
:指向存储读取文本的字符数组(缓冲区)的指针。 -
size
:缓冲区的大小,用于限制读取的字符数。 -
stream
:指向要读取的文件流的指针(通过fopen()
函数打开文件后返回的指针)
#include <stdio.h>
int main() {
FILE* file = fopen("file.txt", "r");
if (file == NULL) {
printf("Failed to open the file.\n");
return 1;
}
char buffer[100];
while (fgets(buffer, sizeof(buffer), file) != NULL) {
printf("%s", buffer); // 打印读取的文本行
}
fclose(file);
return 0;
}
2.3 写入文件流
2.3.1 fprintf()函数
作用:用于将格式化的数据写入文件流
函数声明:int fprintf(FILE* stream, const char* format, ...);
它接受多个参数:
-
stream
:指向要写入的文件流的指针(通过fopen()
函数打开文件后返回的指针)。 -
format
:格式字符串,用于指定要写入的数据的格式和输出样式。 -
...
:可变参数,用于指定要写入的数据。
#include <stdio.h>
int main() {
FILE* file = fopen("file.txt", "w");
if (file == NULL) {
printf("Failed to open the file.\n");
return 1;
}
int num = 123;
double pi = 3.14159;
char str[] = "Hello, World!";
fprintf(file, "Number: %d\n", num);
fprintf(file, "Pi: %.2f\n", pi);
fprintf(file, "String: %s\n", str);
fclose(file);
return 0;
}
2.3.2 fputc()函数
作用:用于将单个字符 写入文件流
函数声明:int fputs(const char *str, FILE *stream);
它接受两个参数:
-
c
:要写入的字符(以整数形式传递,因为字符是通过其ASCII码表示的)。 -
stream
:指向要写入的文件流的指针(通过fopen()
函数打开文件后返回的指针)。
#include <stdio.h>
int main() {
FILE* file = fopen("file.txt", "w");
if (file == NULL) {
printf("Failed to open the file.\n");
return 1;
}
fputc('H', file); // 写入字符'H'
fputc('e', file); // 写入字符'e'
fputc('l', file); // 写入字符'l'
fputc('l', file); // 写入字符'l'
fputc('o', file); // 写入字符'o'
fclose(file);
return 0;
}
2.3.3 fputs()函数
作用:用于将字符串写入文件流
函数声明:int fputs(const char* str, FILE* stream);
它接受两个参数:
-
str
:指向要写入的字符串的指针。 -
stream
:指向要写入的文件流的指针(通过fopen()
函数打开文件后返回的指针)。
返回:一个非负整数表示成功写入的字符数。如果写入失败,它会返回EOF
(-1)。
#include <stdio.h>
int main() {
FILE* file = fopen("file.txt", "w");
if (file == NULL) {
printf("Failed to open the file.\n");
return 1;
}
char str1[] = "Hello, World!";
char str2[] = "This is a line of text.";
fputs(str1, file);
fputs("\n", file); // 写入换行符
fputs(str2, file);
fclose(file);
return 0;
}
2.4 定位文件流指针
文件流通常有一个指针,指示当前读写位置。可以使用相关函数或方法来定位指针到文件中的特定位置,以便进行随机访问或修改。
2.4.1 fseek()函数
在C语言中,可以使用fseek()
函数来定位文件流的指针。fseek()
函数允许将文件流的指针移动到文件中的特定位置,以便进行读取或写入操作。
函数原型:int fseek(FILE* stream, long offset, int origin);
它接受三个参数:
-
stream
:指向要定位的文件流的指针(通过fopen()
函数打开文件后返回的指针)。 -
offset
:表示指针移动的字节数,可以是正数、负数或零。 -
origin
:表示指针的起始位置,可以是以下常量之一:-
SEEK_SET
:从文件开头开始计算偏移量。 -
SEEK_CUR
:从当前指针位置开始计算偏移量。 -
SEEK_END
:从文件末尾开始计算偏移量。
-
#include <stdio.h>
int main() {
FILE* file = fopen("file.txt", "r");
if (file == NULL) {
printf("Failed to open the file.\n");
return 1;
}
// 将文件指针移动到文件的第三个字节处
fseek(file, 2, SEEK_SET);
// 读取并打印文件中的剩余内容
int ch;
while ((ch = fgetc(file)) != EOF) {
putchar(ch);
}
fclose(file);
return 0;
}
2.5 关闭文件流
在操作完成后,应当使用相应的函数或方法关闭文件流,释放相关的资源。关闭文件流时,通常会将缓冲区中的数据刷新到文件中。
2.5.1 fclose()函数
在C语言中,可以使用fclose()
函数来关闭文件流。fclose()
函数用于关闭之前通过fopen()
、freopen()
等函数打开的文件流,并释放与文件流相关的资源。
函数原型:int fclose(FILE* stream);
它接受一个参数:
-
stream
:指向要关闭的文件流的指针。
#include <stdio.h>
int main() {
FILE* file = fopen("file.txt", "r");
if (file == NULL) {
printf("Failed to open the file.\n");
return 1;
}
// 读取文件中的内容
// ...
// 关闭文件流
fclose(file);
return 0;
}
上一篇: C 读写文件操作
下一篇: 实现文件复制的C语言实现