文件操作(3)
来源:互联网 发布:蜂窝移动数据无法清零 编辑:程序博客网 时间:2024/05/20 03:47
fseek函数
函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere为基准,偏移offset(指针偏移量)个字节的位置,函数返回0。如果执行失败则不改变stream指向的位置,函数返回一个非0值。
实验得出,超出文件末尾位置,还是返回0。往回偏移超出首位置,还是返回0,请小心使用。
第二个参数负数代表向前移动,整数代表向后移动。
第一个参数stream为文件指针
第二个参数offset为偏移量,单位:字节,正数表示正向偏移,负数表示负向偏移
第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET
SEEK_SET: 文件开头
SEEK_CUR: 当前位置
SEEK_END: 文件结尾
fseek(fp, 3, SEEK_SET);
ftell函数
函数 ftell 用于得到文件位置指针当前位置相对于文件首的偏移字节数。在随机方式存取文件时,由于文件位置频繁的前后移动,程序不容易确定文件的当前位置。
long len = ftell(fp)
fgetpos,fsetpos函数
fseek与ftell返回的是long类型,如果文件很大,超过long的范围,那么该函数会有问题,fgetpos与fsetpos函数可以处理更大的文件类型
返回值:成功返回0,否则返回非0
fflush函数
fflush函数可以将缓冲区中任何未写入的数据写入文件中。
修改配置文件,希望修改实时生效,那么每次修改完成之后我们fflush一次
fread和fwrite函数
size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
注意:这个函数以二进制形式对文件进行操作,不局限于文本文件
返回值:返回实际写入或读取的数据块数目
只要读取到文件最后,没有完整的读取一个数据块出来,fread就返回0
第一个参数代表void *,写入或者读取的缓冲区
第二个参数是代表写入或读取的时候一个单位的大小
第三个参数是代表写入或读取几个单位
第四个参数是FILE *
fread与feof
注意以下两段代码的区别while (!feof(p)) { fread(&buf, 1, sizeof(buf), p); }while (fread(&buf, 1, sizeof(buf), p))
代码示例:#define SEC 0x1234678// 文件加密.void file_encode(){ FILE *p1 = fopen("a.txt", "r"); if (p1 == NULL) { return ; } FILE *p2 = fopen("a.dat", "wb"); if (p2 == NULL) { return ; } char buf[1024] = {0}; while (fgets(buf, p1) != NULL) { size_t len = strlen(buf); int i; for (i = 0; i < len; i++) { int temp = buf[i] + SEC; } fwrite(&temp, sizeof(int), 1, p2); } fclose(p1); fclose(p2);}// 文件解密.void file_decode(){ FILE *p1 = fopen("a.dat", "rb"); if (p1 == NULL) { return ; } FILE *p2 = fopen("b.txt", "w"); if (p2 == NULL) { return ; } int buf = 0; while (fread(&buf, 1, sizeof(buf), p1)) { char temp = buf - SEC; putc(temp, p2); } fclose(p1); fclose(p2);}int main(){ return 0;}
// 结构体和二进制文件.struct student {unsigned int ID;char name[32];};// 将结构体写入二进制文件.int main(){ struct student sts[10] = {{1, "赵一"},{2, "钱二"},{3, "孙三"}, {4, "李四"},{5, "王五"},{6, "周六"},{7, "吴七"}{8, "郑八"}{9, "冯九"}, {10, "陈十"}}; FILE *p1 = fopen("a.txt", "wb"); if (p1 == NULL) { return 0; } // 将结构体数组写入文件. fwrite(sts, sizeof(struct student), 10, p1); fclose(p1); // 读取文件中的结构体数据. FILE *p2 = fopen("a.txt", "rb"); if (p2 == NULL) { return 0; } struct student st; while(fread(&st, sizeof(st), 1, p2)) { printf("ID = %u, name = %s\n", st.ID, st.name); } fclose(p2); // 修改文件中的结构体数据(修改ID=3的数据). student student st2 = {3, "杨老师"}; FILE *p3 = fopen("a.txt", "rb+"); // 将文件指针移位. fseek(p3, sizeof(st2) * 2, SEEK_SET); fwrite(&st2, sizeof(st2), 1, p3); fclose(p3); return 0;}
struct student { unsigned int ID; char name[20];};int main() { //system("gedit main.c"); //printf("Hello, World!\n"); struct student sts[10] = { {1, "111"}, {2, "222"}, {3, "333"}, {4, "444"}, {5, "555"}, {6, "666"}, {7, "777"}, {8, "888"}, {9, "999"}, {10, "1010"}, }; FILE *p1 = fopen("a.txt", "w"); fwrite(sts, sizeof(struct student), 10, p1); fclose(p1); // 将文件中的所有结构体数据全部读出. FILE *p2 = fopen("a.txt", "r"); struct student *pst = calloc(10, sizeof(struct student)); int index = 0; while (fread(&pst[index], sizeof(struct student), 1, p2)) { index++; } int i; for (i = 0; i <index ; i++) { printf("ID = %u name = %s\n", pst[i].ID, pst[i].name); } fclose(p2); return 0;}
- c文件操作<3>
- python 3 操作文件
- php文件操作3
- 体验文件操作3
- 文件操作函数(3)
- 实验3 文件操作
- 例题3-文件操作
- 文件操作(3)
- PHP---文件操作3---写文件
- Java文件操作大全(3)
- JAVA文件操作(3)
- Excel-VBA文件操作3
- MFC文件操作大全3
- Linux----3-----文件相关操作
- Delphi 文件操作(3)
- 文件操作《3》字符串读写
- linux编程-文件操作(3)
- 文件的读写操作3
- unity在shader中获取当前摄像机的方向向量
- 51nod 1378 夹克老爷的愤怒【贪心】
- 思维导图_Python知识点
- linux知识学习笔记一:命令行操作及常用命令使用
- phpcms起步模板的添加操作
- 文件操作(3)
- Java设计模式 策略模式
- Two Sum
- 求1+2+3+4+............+n的值?
- 小白成长日记(2)--选择排序之二元选择排序
- ROS-NAOqi(rviz moveit gazebo等)
- Reverse Integer
- Linux系统知识小结(九)
- Longest Common Prefix