fseek()、ftell()、rewind()、getline()
2021/12/1 23:08:39
本文主要是介绍fseek()、ftell()、rewind()、getline(),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
fseek
函数名: fseek
功 能: 重定位流上的文件指针
用 法: int fseek(FILE *stream, long offset, int fromwhere);
描 述: 函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere为基准,偏移offset个字节的位置
。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。
返回值: 成功,返回0,否则返回其他值。
程序例:
#include <stdio.h> long filesize(FILE *stream); int main(void) { FILE *stream; stream = fopen("MYFILE.TXT", "w+"); fprintf(stream, "This is a test"); printf("Filesize of MYFILE.TXT is %ld bytes\n", filesize(stream)); fclose(stream); return 0; } long filesize(FILE *stream) { long curpos, length; curpos = ftell(stream); fseek(stream, 0L, SEEK_END); length = ftell(stream); fseek(stream, curpos, SEEK_SET); return length; }
int fseek
( FILE *stream, long offset, int origin );
第一个参数stream为文件指针
第二个参数offset为偏移量,整数表示正向偏移,负数表示负向偏移
第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET
SEEK_SET
: 文件开头
SEEK_CUR
: 当前位置
SEEK_END
: 文件结尾
其中SEEK_SET,SEEK_CUR和SEEK_END和依次为0,1和2.
简言之:
fseek(fp,100L,0);把fp指针移动到离文件开头100字节处;
fseek(fp,100L,1);把fp指针移动到离文件当前位置100字节处;
fseek(fp,100L,2);把fp指针退回到离文件结尾100字节处。
使用实例:
#include <stdio.h> #define N 5 typedef struct student { long sno; char name[10]; float score[3]; } STU; void fun(char *filename, STU n) { FILE *fp; fp = fopen(filename, "rb+"); fseek(fp, -1L*sizeof(STU),SEEK_END); fwrite(&n, sizeof(STU), 1, fp); fclose(fp); } void main() { STU t[N]={ {10001,"MaChao", 91, 92, 77}, {10002,"CaoKai", 75, 60, 88}, {10003,"LiSi", 85, 70, 78}, {10004,"FangFang", 90, 82, 87}, {10005,"ZhangSan", 95, 80, 88}}; STU n={10006,"ZhaoSi", 55, 70, 68}, ss[N]; int i,j; FILE *fp; fp = fopen("student.dat", "wb"); fwrite(t, sizeof(STU), N, fp); fclose(fp); fp = fopen("student.dat", "rb"); fread(ss, sizeof(STU), N, fp); fclose(fp); printf("\nThe original data :\n\n"); for (j=0; j<N; j++) { printf("\nNo: %ld Name: %-8s Scores: ",ss[j].sno, ss[j].name); for (i=0; i<3; i++) printf("%6.2f ", ss[j].score[i]); printf("\n"); } fun("student.dat", n); printf("\nThe data after modifing :\n\n"); fp = fopen("student.dat", "rb"); fread(ss, sizeof(STU), N, fp); fclose(fp); for (j=0; j<N; j++) { printf("\nNo: %ld Name: %-8s Scores: ",ss[j].sno, ss[j].name); for (i=0; i<3; i++) printf("%6.2f ", ss[j].score[i]); printf("\n"); } }
以上内容链接https://blog.csdn.net/wl_soft50/article/details/7787521
ftell
long int ftell(FILE *stream) 文件位置指针当前位置相对于文件首的偏移字节数
下面的实例演示了 ftell() 函数的用法。
#include <stdio.h> int main () { FILE *fp; int len; fp = fopen("file.txt", "r"); if( fp == NULL ) { perror ("打开文件错误"); return(-1); } fseek(fp, 0, SEEK_END); len = ftell(fp); fclose(fp); printf("file.txt 的总大小 = %d 字节\n", len); return(0); }
假设我们有一个文本文件 file.txt,它的内容如下:
This is runoob.com
让我们编译并运行上面的程序,如果文件内容如上所示,这将产生以下结果,否则会根据文件内容给出不同的结果:
file.txt 的总大小 = 19 字节
自己敲
#include<stdio.h> #include<stdlib.h> int main(int argc,char **argv) { FILE *fp; int count = 0; if(argc < 2) { fprintf(stderr,"Usage...\n"); exit(1); } fp = fopen(argv[1],"r"); if(fp == NULL) { perror("fopen()"); exit(1); } fseek(fp,0,SEEK_END); printf("%ld\n",ftell(fp)); fclose(fp); exit(0); }
rewind函数
rewind函数:使文件fp的位置指针指向文件开始
原型:void rewind(FILE *fp)
文件指针FILE *fp中,包含一个读写位置指针char *_nextc,它指向下一次文件读写的位置。
当文件刚打开或创建时,该指针指向文件的开始位置。每当进行一次读写后,该指针自动指向下一次读写的位置。
可以用函数ftell()获得当前的位置指针,也可以用rewind()/fseek()函数改变位置指针,使其指向需要读写的位置。
fflush()
头文件:#include<stdio.h>
函数定义:int fflush(FILE *stream);
功能:清除读写缓冲区,冲洗流 stream 中的信息,通常用于处理磁盘文件。fflush() 会强迫将缓冲区内的数据写回参数 stream 指定的文件中。如果参数 stream 为NULL, fflush() 会将所有打开的文件数据更新。
返回值:如果成功刷新, fflush 返回0。指定的流没有缓冲区或者只读打开时也返回0值。返回EOF指出一个错误。设置错误标识符(即 feof)。
原文链接:https://blog.csdn.net/TsingHua666/article/details/80498723
#include<stdio.h> #include<stdlib.h> int main() { int i; printf("Before while()"); fflush(stdout); while(1); printf("After while()"); fflush(NULL); exit(0); }
如果没有fflush,则什么也不输出,printf里面添加\n,效果跟这一样,相当于刷新
首先要明白设计getline函数的目的,其实很简单,就是从流中读取字符串。而且读取的方
getline()
从这个函数的名称来看,它的直观意义是从流中读取一行,但是大家不要被这表面的现象所迷惑。其实如果让我来为这个函数去一个名字的话,或许我会取一个getString,因为它的目的本来就是从流中读取字符的序列,而不是像get函数那样一次读取一个字符。
代码演示
#include<stdio.h> #include<stdlib.h> #include <string.h> int main(int argc,char **argv) { FILE *fp; char *Linebuf; size_t linesize; if(argc < 2) { fprintf(stderr,"Usage...\n"); exit(1); } fp=fopen(argv[1],"r"); if(fp == NULL) { perror("fopen()"); exit(1); } Linebuf = NULL; linesize = 0; while(1) { if(getline(&Linebuf,&linesize,fp) < 0) break; printf("%ld\n",strlen(Linebuf)); printf("%ld\n",linesize); } fclose(fp); exit(0); }
这篇关于fseek()、ftell()、rewind()、getline()的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-24怎么修改Kafka的JVM参数?-icode9专业技术文章分享
- 2024-12-23线下车企门店如何实现线上线下融合?
- 2024-12-23鸿蒙Next ArkTS编程规范总结
- 2024-12-23物流团队冬至高效运转,哪款办公软件可助力风险评估?
- 2024-12-23优化库存,提升效率:医药企业如何借助看板软件实现仓库智能化
- 2024-12-23项目管理零负担!轻量化看板工具如何助力团队协作
- 2024-12-23电商活动复盘,为何是团队成长的核心环节?
- 2024-12-23鸿蒙Next ArkTS高性能编程实战
- 2024-12-23数据驱动:电商复盘从基础到进阶!
- 2024-12-23从数据到客户:跨境电商如何通过销售跟踪工具提升营销精准度?