ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

fseek()、ftell()、rewind()、getline()

2021-12-01 22:35:21  阅读:209  来源: 互联网

标签:fp stream int fseek ftell FILE SEEK 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有