文件操作
(一)文件的打开和关闭
在了解文件的打开和关闭之前,先了解文件指针。 每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名FILE. 一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。 创建文件指针变量
FILE* pf;
定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区。通过文件指针变量能够找到与它关联的文件。
FILE * fopen ( const char * filename, const char * mode );
int fclose ( FILE * stream );
打开文件的方式:
文件使用方式 | 含义 | 如果指定文件不存在 |
---|
“r”(只读) | 为了输入数据,打开一个已经存在的文本文件 | 出错 | “w”(只写) | 为了输出数据,打开一个文本文件 | 建立一个新的文件 | “a”(追加) | 向文本文件尾添加数据 | 出错 | “rb”(只读) | 为了输入数据,打开一个二进制文件 | 出错 | “wb”(只写) | 为了输出数据,打开一个二进制文件 | 建立一个新的文件 | “ab”(追加) | 向二进制文件尾添加数据 | 出错 | “r+”(读写) | 为了读和写,打开一个文本文件 | 出错 | “w+”(读写) | 为了读和写,建立一个文本文件 | 建立一个新的文件 | “a+”(读写) | 打开一个文件,在文件尾进行读和写 | 建立一个新的文件 | “rb+”(只读) | 为了读和写,打开一个二进制文件 | 出错 | “wb+”(只写) | 为了读和写,建立一个二进制文件 | 建立一个新的文件 | “ab+”(追加) | 打开一个二进制文件,在文件尾进行读和写 | 建立一个新的文件 |
int main() {
FILE* pf = fopen("test.txt", "w");
if (NULL == pf) {
perror("fopen");
return 1;
}
fclose(pf);
pf = NULL;
return 0;
}
(二)文件的顺序读写
功能 | 函数名 | 适用于 |
---|
字符输入函数 | fgetc | 所有输入流 | 字符输出函数 | fputc | 所有输出流 | 文本行输入函数 | fgets | 所有输入流 | 文本行输出函数 | fputs | 所有输出流 | 格式化输入函数 | fscanf | 所有输入流 | 格式化输出函数 | fprintf | 所有输出流 | 二进制输入 | fread | 文件 | 二进制输出 | fwrite | 文件 |
a. 字符输入/输出函数
int main() {
FILE* pf = fopen("test.txt", "w");
if (NULL == pf) {
perror("fopen");
return 1;
}
int i = 0;
for (i = 0; i < 26; i++) {
fputc('a' + i, pf);
}
fclose(pf);
pf = NULL;
return 0;
}
int main() {
FILE* pf = fopen("test.txt", "r");
if (NULL == pf) {
perror("fopen");
return 1;
}
int ch = 0;
while ((ch=fgetc(pf)) != EOF) {
printf("%c ", ch);
}
fclose(pf);
pf = NULL;
return 0;
}
b. 文本行输入/输出函数
fputs("hello\n", pf);
fputs("xiaoming\n", pf);
int main() {
FILE* pf = fopen("test.txt", "r");
if (NULL == pf) {
perror("fopen");
return 1;
}
char arr[10] = " ";
fgets(arr, 6, pf);
printf("%s ", arr);
fclose(pf);
pf = NULL;
return 0;
}
c. 格式化输入/输出函数
struct S
{
char name[10];
int age;
float score;
};
int main() {
struct S s = { "zhangsan",20,95.5f };
FILE* pf = fopen("test.txt", "w");
if (NULL == pf) {
perror("fopen");
return 1;
}
fprintf(pf,"%s %d %f", s.name, s.age, s.score);
fclose(pf);
pf = NULL;
return 0;
}
struct S
{
char name[10];
int age;
float score;
};
int main() {
struct S s = {0};
FILE* pf = fopen("test.txt", "r");
if (NULL == pf) {
perror("fopen");
return 1;
}
fscanf(pf,"%s %d %f", s.name, &(s.age), &(s.score));
printf("%s %d %f", s.name, s.age, s.score);
fclose(pf);
pf = NULL;
return 0;
}
d. 二进制输入/输出
int main() {
struct S s = { "zhangsan",20,95.5f };
FILE* pf = fopen("test.txt", "wb");
if (NULL == pf) {
perror("fopen");
return 1;
}
fwrite(&s, sizeof(s), 1, pf);
fclose(pf);
pf = NULL;
return 0;
}
int main() {
struct S s = { 0 };
FILE* pf = fopen("test.txt", "rb");
if (NULL == pf) {
perror("fopen");
return 1;
}
fread(&s, sizeof(s), 1, pf);
printf("%s %d %f", s.name, s.age, s.score);
fclose(pf);
pf = NULL;
return 0;
}
(三)文件的随机读写
fseek 根据文件指针的位置和偏移量来定位文件指针。
origin | 参考位置 |
---|
SEEK_SET | 文件开头 | SEEK_CUR | 文件指针的当前位置 | SEEK_END | 文件结束 |
int main() {
FILE* pf = fopen("test.txt", "r");
if (NULL == pf) {
perror("fopen");
return 1;
}
int ch = fgetc(pf);
fseek(pf, 2, SEEK_CUR);
ch = fgetc(pf);
printf("%c ", ch);
fclose(pf);
pf = NULL;
return 0;
}
|