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()的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程