文件的打开与关闭
文件的打开
fopen()函数文件打开
函数原型
FILE *fopen(char *filename,char *mode);
函数参数
1.*filename 为文件名
2.*mode 为打开方式(注打开方式表)
打开方式 | 含义 |
“r” | 以只读的方式打开文件(文件必须已存在) |
“w” | 以只写的方式打开文件 |
“a” | 以只追加的方式打开文件 |
”+“ | 与上面的字符组合 |
”t“ | 以文本形式打开(可以省略) |
”b“ | 以二进制形式打开 |
函数返回值
文件的相关信息(文件名,当前位置指针,缓冲区状况)
若打开错误则返回空指针NULL(可以判断是否正确打开)
函数功能
以mode形式打开名为filename的文件
函数应用
#include <stdio.h>
#include <stdlib.h>
int main() {
// 以写模式打开文件
FILE *opFile = fopen("test.txt", "w");
if (opFile == NULL) {
puts("Couldn't open file");
exit(0);
} else {
fputs("includehelp", opFile);
puts("Write operation successful");
fclose(opFile);
}
return 0;
}
文件的关闭
fclose()函数关闭
函数原型
int fclose(FILE *fp);
函数参数
*fp 为程序前面获取文件的指针(对于以‘w’方式打开的文件在关闭之前会刷新缓冲区)
函数返回值
正常关闭返回 0;出错时为 非零值
函数功能
关闭 fp 指向文件
函数应用
#include <stdio.h>
#include <stdlib.h>
int main() {
// 以读模式打开文件
FILE *fp = fopen("test.txt", "r");
if (fp == NULL) {
perror("Error opening file");
return 1;
}
// 读取文件内容并打印
char buffer[100];
while (fgets(buffer, sizeof(buffer), fp)!= NULL) {
printf("%s", buffer);
}
// 关闭文件
if (fclose(fp)!= 0) {
perror("Error closing file");
return 1;
}
return 0;
}
文件的读与写
读/写字符函数
1.fgetc()函数
若想将指定文件中的字符读取到程序中,并将字符赋予某个变量可用此函数
函数原型
int fgetc(FILE *fp);
函数参数
*fp 为已打开文件的文件指针
函数返回值
返回在文件中读取到的字符
1. 若返回失败则返回一个文件结束标志EOF,EOF在stdio.h中定义为常量-1,用来表示文件内容的结束,由于文件中字符以其对应的ASCII码形式储存,不包括负数,因此-1来表示内容的结束(而在返回值处也需要使用in型来使EOF的值包含在其中)
2. feof()函数可以判断文件是否结束,若已指向末尾则返回非零值,否则返回0值
3. 当文件未结束时,”feof(fp)“值为0,while循环成立,继续执行循环内部的操作;
当文件
函数应用
#include <stdio.h>
#include <stdlib.h>
#define MAX_LENGTH 100
int main() {
FILE *fp;
char line[MAX_LENGTH];
// 打开文件
fp = fopen("test.txt", "r");
if (fp == NULL) {
perror("无法打开文件");
return 1;
}
// 逐行读取文件内容并打印
while (fgets(line, MAX_LENGTH, fp)!= NULL) {
printf("%s", line);
}
// 关闭文件
fclose(fp);
return 0;
}
2.fputc() 函数
函数原型
int fputc(int c,FILE *fp);
函数参数
*fp 表示已打开的文件指针;*c 表示需要输出的字符,可以是常量,可以为变量
函数返回值
成功输出为输出值;出错时为EOF
函数功能
把变量C的值写到fp所指向的文件中
函数应用
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *fp;
char str[] = "Hello, World!";
int i;
// 以写模式打开文件
fp = fopen("test.txt", "w");
if (fp == NULL) {
perror("无法打开文件");
return 1;
}
// 逐个字符写入文件
for (i = 0; str[i]!= '\0'; i++) {
fputc(str[i], fp);
}
// 关闭文件
fclose(fp);
return 0;
}
读/写字符串函数
1. fgets() 函数
函数原型
char *fgets(char *s,int n,FILE *fp);
函数参数
*fp 表示文件指针;n 表示可以存储的字符长度,将读取到的内容存储到字符指针*s中
函数返回值
读取成功返回字符数组首地址;读取失败返回NULL
(从文件中读取到字符串后,程序会自动在末尾添加结束字符‘\0’,实际读取到n-1个字符)
函数功能
从fp 指向的文件中读取长度为n-1的字符串,并存入起始地址为s 的一段连续内存中
fgets()最多只能读取一行数据,不能跨行,如果在读取到n-1个字符只之前出现了换行符'\n',或者读到了文件末尾,则读取结束
函数应用
#include <stdio.h>
int main() {
FILE *fp;
char buffer[100];
fp = fopen("test.txt", "r");
if (fp == NULL) {
perror("Error opening file");
return 1;
}
while (fgets(buffer, sizeof(buffer), fp)!= NULL) {
printf("%s", buffer);
}
fclose(fp);
return 0;
}
2. fputs() 函数
函数原型
int fputs(char *s,FILE *fp);
函数参数
*fp 表示文件指针;*s 表示需要输出的字符串,可以是字符串常量,字符串数组名,字符型指针
函数返回值
若参数成功输出,则返回非负值,否则返回EOF
函数功能
将s 所指向的字符串输出到fp 指向的文件中
函数应用
#include <stdio.h>
int main() {
FILE *fp;
char text[] = "这是要写入文件的一行文本。";
fp = fopen("output.txt", "w");
if (fp == NULL) {
perror("Error opening file");
return 1;
}
fputs(text, fp);
fclose(fp);
return 0;
}
格式化读/写函数
1. fscanf() 函数
操作对象不是终端而是磁盘文件
函数原型
int fscannf(FILE *fp,char *format,[argument...]);
函数参数
*fp 为文件指针
*format 为格式控制字符串
argument 为输入列表
函数返回值
已输入的数据个数
函数功能
从fp 所指向的文件中按照 format 指定的格式,将数据存放到 argument内存地址中
(通过键盘读取)
函数应用
#include <stdio.h>
#include <stdlib.h>
#define MAX_NAME_LENGTH 50
int main() {
FILE *fp;
char name[MAX_NAME_LENGTH];
int age;
float score;
// 打开文件
fp = fopen("students.txt", "r");
if (fp == NULL) {
perror("无法打开文件");
return 1;
}
// 逐行读取文件并解析学生信息
while (fscanf(fp, "%s %d %f", name, &age, &score) == 3) {
printf("姓名:%s,年龄:%d,成绩:%.2f\n", name, age, score);
}
// 关闭文件
fclose(fp);
return 0;
}
2. fprintf() 函数
函数原型
int fprintf(FILE *fp,char *format,[argument...]);
函数参数
*fp 为文件指针
*format 为格式控制字符串
argument 为输出列表
函数返回值
输出的数据个数
函数功能
将argument 变量按照format 格式输出到fp 所指向的文件中
函数应用
#include <stdio.h>
#include <stdlib.h>
#define MAX_NAME_LENGTH 50
int main() {
FILE *fp;
char names[3][MAX_NAME_LENGTH] = {"Alice", "Bob", "Charlie"};
int ages[3] = {20, 21, 22};
float scores[3] = {85.5, 90.0, 88.0};
// 以写模式打开文件
fp = fopen("students.txt", "w");
if (fp == NULL) {
perror("无法打开文件");
return 1;
}
// 将学生信息写入文件
for (int i = 0; i < 3; i++) {
fprintf(fp, "%s %d %.2f\n", names[i], ages[i], scores[i]);
}
// 关闭文件
fclose(fp);
return 0;
}
读/写数据块函数
1. fread() 函数
将文件中的一串连续的数据一次读取到一个数组中
函数原型
unsigned int fread(void *prt,unsigned int size,unsigned int nmemb,FILE *fp);
函数参数
*prt 为一个指针,是数据的存放地址
size 是要读取每个数据块的字节数
nmemb 为要读取多少个size 大小的数据项
*fp 为文件指针
函数返回值
所读数据项个数,通常与nmemb 相等,若出现错误或到达文件末尾,则可能小于nmemb
函数功能
从fp 所指向的文件中读取nmemb 个长度为size 的数据项,并存入ptr 所指向的内存中
函数应用
#include <stdio.h>
#include <stdlib.h>
#define MAX_NAME_LENGTH 50
int main() {
FILE *fp;
char names[3][MAX_NAME_LENGTH] = {"Alice", "Bob", "Charlie"};
int ages[3] = {20, 21, 22};
float scores[3] = {85.5, 90.0, 88.0};
// 以写模式打开文件
fp = fopen("students.txt", "w");
if (fp == NULL) {
perror("无法打开文件");
return 1;
}
// 将学生信息写入文件
for (int i = 0; i < 3; i++) {
fprintf(fp, "%s %d %.2f\n", names[i], ages[i], scores[i]);
}
// 关闭文件
fclose(fp);
return 0;
}
2. fwrite()函数
把内存中连续的一串数据输出到文件
函数原型
unsigned int fwrite(void *prt,unsigned int size,unsigned int nmemb,FILE *fp);
函数参数
*fp 为一个指针,是要输出数据的首地址;
size 是输出每个数据块的字节数
nmemb 为要写入多少个size 大小的数据项
*fp 为指针文件
函数返回值
写入文件的数据项个数
函数功能
将prt 所指向的连续nmemb 个size 大小的数据输出到fp 所指向的文件中
一般使用于二进制文件的读写,尤其是数组
函数应用
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *fp;
char str[] = "Hello, World!\n";
// 以写模式打开文件
fp = fopen("test.txt", "w");
if (fp == NULL) {
perror("无法打开文件");
return 1;
}
// 将字符串写入文件
fwrite(str, sizeof(char), sizeof(str) - 1, fp);
// 关闭文件
fclose(fp);
return 0;
}
文件定位
1. fseek () 函数
随意更改文件的位置指针
函数原型
int fseek(FILE *fp,long int offset,int from);
函数参数
*fp 为文件指针;
offset 为移动的字节数,类型数据为long,用常量表示时要求加数据‘L’ ,偏移量的计算单位为字节,而且可以为负值,表示从当前位置反方向偏移;
from 表示从哪里开始移动,可选择文件首,当前位置,文件尾 3种起始点,其值分别为0,1,2
函数返回值
成功返回当前位置;否则返回-1
函数功能
将fp 指向文件的位置指针按照from 要求移动offset 个字节
函数应用
#include <stdio.h>
#include <stdlib.h>
// 定义学生结构体
typedef struct {
char name[20];
int age;
float score;
} Student;
int main() {
FILE *fp;
Student student;
int targetIndex = 1; // 要读取的学生索引,从0开始
// 以二进制读模式打开文件
fp = fopen("students.bin", "rb");
if (fp == NULL) {
perror("无法打开文件");
return 1;
}
// 将文件指针移动到指定学生的位置
fseek(fp, targetIndex * sizeof(Student), SEEK_SET);
// 读取学生信息
fread(&student, sizeof(Student), 1, fp);
// 输出学生信息
printf("姓名:%s\n年龄:%d\n成绩:%.2f\n", student.name, student.age, student.score);
// 关闭文件
fclose(fp);
return 0;
}
2. rewind() 函数
将文件的位置指针直接重置到文件的开头位置
函数原型
void rewind(FILE *fp);
函数参数
文件指针
函数返回值
无
函数功能
设置fp 指向文件的位置指针指向文件的首字节
3. ftell() 函数
得到文件位置指针的读写位置,读写位置指的是从文件首到当前位置的字节数
函数原型
long ftell(FILE *fp);
函数参数
文件指针
函数返回值
类型为长整型,读取成功返回当前文件的位置指针,失败则为-1L
函数功能
获取fp 指向文件当前的位置指针
函数应用
#include <stdio.h>
int main() {
FILE *fp;
long size;
fp = fopen("test.txt", "r");
if (fp == NULL) {
perror("Error opening file");
return 1;
}
fseek(fp, 0, SEEK_END);
size = ftell(fp);
fclose(fp);
printf("文件大小为 %ld 字节\n", size);
return 0;
}