一、文件的打开和关闭
1.1文件的打开
c语言标准定义:
返回类型为FILE*类型的文件指针,返回初始地址
filename --> 存放打开文件的位置
node --> 文件打开的方式
使用到的头文件
打开方式:
1.2文件的关闭
1.3文件的打开和关闭使用格式
int main()
{
//打开文件
FILE* pf = fopen("测试.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//……
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
二、文件的随机读写
2.1fseek--更改文件指针位置
C语言标准定义:
stream --> 存放文件地址的流
offset --> 偏移量(相对origin的偏移量)
origin --> 有三个选项 1.SEEK_CUR -文件指针当前的位置
2.SEEK_END - 文件末尾位置
3. SEEK_SET -文件开始位置
用于将文件指针修改位置
eg.
int main()
{
//打开文件--w
FILE* pfw = fopen("测试.txt", "w");
if (pfw == NULL)
{
perror("fopen");
return 1;
}
char arr[] = "abcdef";
//存放字符串
fputs(arr, pfw);
//关闭文件
fclose(pfw);
pfw = NULL;
//打开文件--r
FILE* pfr = fopen("测试.txt", "r");
if (pfr == NULL)
{
perror("fopen");
return 1;
}
printf("%c\n", fgetc(pfr));
fseek(pfr, -2, SEEK_END);
printf("%c\n", fgetc(pfr));
fclose(pfr);
pfr = NULL;
return 0;
}
结果:
2.2ftell--文件指针相对于起始位置的偏移量
C语言标准定义:
eg.
int main()
{
//打开文件--r
FILE* pfr = fopen("test.txt", "r");
if (pfr == NULL)
{
perror("fopen");
return 1;
}
int size1 = ftell(pfr);
printf("size:%d\n", size1);
//test.txt存放了abcdef此时指针在f的后面
fseek(pfr, -1, SEEK_END);//-1的偏移量向左移动一格abcde f
printf("%c\n", fgetc(pfr));//读取此时指针的内容,读完后指针自动向后移动一格abcdef
int size = ftell(pfr);//相对于起始位置偏移量为6
printf("size:%d\n", size);
fseek(pfr, -(size-1), SEEK_END);//a bcdef
printf("%c\n", fgetc(pfr));
//关闭文件
fclose(pfr);
pfr = NULL;
return 0;
}
结果:
2.3rewind--指针回到起始位置
C语言标注定义:
eg.
int main()
{
//打开文件--r
FILE* pfr = fopen("test.txt", "r");
if (pfr == NULL)
{
perror("fopen");
return 1;
}
//测试与起始位置的偏移量
int size1 = ftell(pfr);
printf("size:%d时,对应读取字符%c\n", size1, fgetc(pfr));
//test.txt存放了abcdef,此时指针在f的后面
fseek(pfr, -1, SEEK_END);//-1的偏移量向左移动一格abcde f
//测试与起始位置的偏移量
int size2 = ftell(pfr);
printf("与起始位置的偏移量size:%d 读取内容%c\n", size2, fgetc(pfr));
//读取此时指针的内容,读完后指针自动向后移动一格abcdef
//使文件指针回到文件起始位置rewind
rewind(pfr);
//测试与起始位置的偏移量
int size3 = ftell(pfr);
printf("size:%d时,对应读取字符%c\n", size3, fgetc(pfr));
//关闭文件
fclose(pfr);
pfr = NULL;
return 0;
}
结果:
2.4feof--文件读取结束判定
该函数用在文件已经结束,判断文件是否正常结束--用于判断文件结束的原因
int main()
{
//打开文件-w
FILE* pfw = fopen("test1.txt", "w");
if (pfw == NULL)
{
perror("fopen-w");
return 1;
}
//写入abcdef
char arr[] = "abcdef";
fputs(arr,pfw);
//关闭文件
fclose(pfw);
pfw = NULL;
//打开文件-r
FILE* pfr = fopen("test1.txt", "r");
if (pfr == NULL)
{
perror("fopen-r");
return 1;
}
int n = 0;
while(fgetc(pfr)!=EOF)
printf("%d ",++n);
//abcdef全部检测完后到达文件末尾,文件指针此时指向EOF
printf("\n");
//使用feof检测是否正确到达EOF
if (feof(pfr)) {
printf("fgetc返回了EOF");
}
else printf("fgetc没有返回了EOF");
//关闭文件
fclose(pfr);
pfr = NULL;
return 0;
}
结果:
1.这里fgetc到达返回EOF fgets返回NULL
2.二进制文件的读取结束判断,判断返回值是够小于实际要读的个数 eg。fread判断返回值是否小于实际要读个数