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);
}
标签:fp,stream,int,fseek,ftell,FILE,SEEK,getline 来源: https://blog.csdn.net/weixin_46048542/article/details/121664876