鸟语天空
随机访问文件:fseek()和ftell()
post by:追风剑情 2020-3-29 23:15

示例

//Visual Studio中加上这句才可以使用scanf()
//否则只能使用scanf_s()
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
//malloc()、free()
#include <stdlib.h>
#include <time.h>
#include <math.h>

// DOS文本文件中的文件结尾标记
#define CNTL_Z '\032'
#define SLEN 81

//argc: 参数个数 argv[]: 参数数组
//int main(int argc, char **argv)
int main(int argc, char *argv[])
{
	char file[SLEN];
	char ch;
	FILE *fp;
	long count, last;

	puts("Enter the name of the file to be processed:");
	scanf("%80s", file);
	if ((fp = fopen(file, "rb")) == NULL)
	{
		printf("reverse can't open %s\n", file);
		exit(EXIT_FAILURE);
	}

	/*
	fseek(参数1, 参数2,参数2):
	参数2
	该参数表示从起点(即,第3个参数)开始要移动的距离,
	该参数必须是一个long类型的值,可以为正(前移)、
	负(后移)或0(保持不动)。
	fseek(fp, 0L, SEEK_SET);//定位至文件开始处
	fseek(fp, 10L, SEEK_SET);//定位至文件中的第10个字节
	fseek(fp, 2L, SEEK_CUR);//从文件当前位置前移2个字节
	fseek(fp, 0L, SEEK_END);//定位至文件结尾
	fseep(fp, -10L, SEEK_END);//从文件结尾处回退10个字节
	参数3: 根据ANSI标准,模式常量定义在stdio.h头文件中
	SEEK_SET: 文件开始处
	SEEK_CUR: 当前位置
	SEEK_END: 文件末尾
	旧的实现可能缺少这些定义,可以使用数值0L、1L、2L分别表示这3种模式。
	或者,实现可能把这些明示常量定义在别的头文件中。如果不确定,请查阅手册。
	*/
	int result = fseek(fp, 0L, SEEK_END); //定位到文件末尾
	if (0 != result)
	{
		printf("fseek failure.");
	}

	//ftell()返回当前位置,此函数适用于二进制模式打开文件。
	//返回从文件开始处到文件结尾的字节数
	last = ftell(fp);
	for (count = 1L; count <= last; count++)
	{
		//从文件结尾处往前读取文件内容,所以第2个参数传负值
		fseek(fp, -count, SEEK_END);//回退
		ch = getc(fp);//从文件中读取一个字符
		if (ch != CNTL_Z && ch != '\r') //MS-DOS文件
			putchar(ch);
	}
	putchar('\n');
	fclose(fp);

	system("pause");
	return 0;
}

评论:
发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容