C学习-函数:文件格式化 fprintf fscanf 定位 rewind fseek 判尾feof
feof(fp) 是否到文件结尾
功能:测试文件是否结束
参数:fp 为打开的文件指针
返回值:
如果文件结束,值为1(真) ,windows下测值是 16,可以理解为 非0 都是结束
如果文件没有结束,值为0(假)
例子:
file1.txt
hi jia!
代码:
#include <stdio.h> int main(int argc, char const *argv[]) { int waitag; int isclose, n1; char ch; FILE *f1; f1 = fopen("file1.txt", "r+"); //模拟打开错误:只读打开一个不存在文件 if (f1 == NULL) { printf("我去,在下不能打开文件\n"); // exit(0); // 打不开文件 提示后 就退出 } else { printf("成功打开了文件\n"); } do //主要函数 { n1 = feof(f1); if (n1 == 0) { ch = fgetc(f1); printf("读到字符:%c\n", ch); } else { printf("文件结束,feof返回值为:%d\n", n1); break; } } while (1); isclose = fclose(f1); if (isclose == 0) { printf("成功关闭了文件"); } else { printf("我去,在下不能正常关闭文件啊\n"); } scanf("%d", &waitag); return 0; }
显示
成功打开了文件 读到字符:h 读到字符:i 读到字符: 读到字符:j 读到字符:i 读到字符:a 读到字符:! 读到字符: //会多读取一个,并且这个是读取失败的 文件结束,feof返回值为:16 成功关闭了文件
文件的定位 (移动指针)
rewind()函数
rewind(fp);
void rewind(FILE * stream);
功能:将指针指向文件的开始处。
ftell()函数
ftell(fp)
long ftell(FILE *stream);
功能:返回当前文件位置,也就是说返回FILE指针当前位置。
用于得到文件位置指针当前位置相对于文件首的偏移字节数。
利用函数 ftell() 也能方便地知道一个文件的长。 fseek(fp, 0L,SEEK_END); len =ftell(fp)+1; 该位移值等于文件所含字节数。
fseek()函数
fseek(文件指针, 位移量, 参考点);
int fseek(FILE *stream, long offset, int fromwhere);
功能:将位置指针指向所需的位置。
文件指针stream:fseek函数的文件指针,应该为已经打开的文件。如果没有打开的文件,那么将会出现错误。
位移量offset:它表示位置指针相对于“起始点”移动的字节数。
如果位移量是一个正数,表示从“起始点”开始往文件尾方向移动;
如果位移量是一个负数,则表示从“起始点”开始往文件头方向移动。
起始点fromwhere:不能任意设定,它只能是在stdio.h中定义的三个符号常量之一:
0 或 SEEK_SET 文件开始
1 或 SEEK_CUR 当前位置
2 或 SEEK_END 文件末尾
例子:
file1.txt
0123456789
code
#include <stdio.h> int main(int argc, char const *argv[]) { int waitag; int isclose, n1; char ch; FILE *f1; f1 = fopen("file1.txt", "r+"); //模拟打开错误:只读打开一个不存在文件 if (f1 == NULL) { printf("我去,在下不能打开文件\n"); // exit(0); // 打不开文件 提示后 就退出 } else { printf("成功打开了文件\n"); } ch = fgetc(f1); printf("读取一个字符:%c\n", ch); ch = fgetc(f1); printf("再读一下字符:%c\n", ch); printf("当前位置:%d\n", ftell(f1)); rewind(f1); ch = fgetc(f1); printf("rewind后读一下字符:%c\n", ch); printf("当前位置:%d\n", ftell(f1)); fseek(f1, -5, 2); ch = fgetc(f1); printf("fseek(f1,-5,2)后读一下字符:%c\n", ch); printf("当前位置:%d\n", ftell(f1)); isclose = fclose(f1); if (isclose == 0) { printf("成功关闭了文件"); } else { printf("我去,在下不能正常关闭文件啊\n"); } scanf("%d", &waitag); return 0; }
运行结果:
成功打开了文件 读取一个字符:0 再读一下字符:1 当前位置:2 rewind后读一下字符:0 当前位置:1 fseek(f1,-5,2)后读一下字符:5 当前位置:6 成功关闭了文件
文件的格式化输入输出函数
fprintf(文件指针, 格式字符串, 输出表列);
int fprintf(FILE *stream, const char *format, ...)
功能:按格式将输出表列的内容输出到指定的文件中。
与printf的区别在于:多一个参数(文件指针),向文件中写而不是向屏幕输出。
返回值:
如果成功,返回写入的字符总数
如果失败,返回一个负数。
例子:
#include <stdio.h> int main(int argc, char const *argv[]) { int waitag; int isclose; FILE *f1; f1 = fopen("file1.txt", "w+"); //模拟打开错误:只读打开一个不存在文件 if (f1 == NULL) { printf("我去,在下不能打开文件\n"); // exit(0); // 打不开文件 提示后 就退出 } else { printf("成功打开了文件\n"); } char a[] = "hello", b = 'W'; float n1 = 123.3; printf("printf格式化输出:\n%s:%5c\n格式化数字:%5.3f\n", a, b, n1); fprintf(f1, "fprintf格式化输出:\n%s:%5c\n格式化数字:%.3f\n", a, b, n1); isclose = fclose(f1); if (isclose == 0) { printf("成功关闭了文件"); } else { printf("我去,在下不能正常关闭文件啊\n"); } scanf("%d", &waitag); return 0; }
屏幕输出:
成功打开了文件 printf格式化输出: hello: W 格式化数字:123.300 成功关闭了文件
file1.txt
fprintf格式化输出: hello: W 格式化数字:123.300
fscanf(文件指针, 格式字符串, 输入表地址列);
int fscanf(FILE *stream, const char *format, ...)
功 能:从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。
返回值:
如果成功,该函数返回成功匹配和赋值的个数。
如果失败:到达文件末尾或发生读错误,则返回 EOF
例子:
file1.txt
We are in 2017 We are in 2018
代码:
#include <stdio.h> int main(int argc, char const *argv[]) { int waitag; int isclose; FILE *f1; f1 = fopen("file1.txt", "r+"); //模拟打开错误:只读打开一个不存在文件 if (f1 == NULL) { printf("我去,在下不能打开文件\n"); // exit(0); // 打不开文件 提示后 就退出 } else { printf("成功打开了文件\n"); } char str1[10], str2[10], str3[10]; int year; rewind(f1); fscanf(f1, "%s %s %s %d", str1, str2, str3, &year); //一次读取一行,进行格式化匹配 printf("Read String1:%-5s\n", str1); printf("Read String2:%-5s\n", str2); printf("Read String3:%-5s\n", str3); printf("Read Integer:%-5d\n", year); isclose = fclose(f1); if (isclose == 0) { printf("成功关闭了文件"); } else { printf("我去,在下不能正常关闭文件啊\n"); } scanf("%d", &waitag); return 0; }
显示:
成功打开了文件 Read String1:We Read String2:are Read String3:in Read Integer:2017 成功关闭了文件
共 0 条评论