⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tfseek.c

📁 早期freebsd实现
💻 C
字号:
/*anyhow, i was elated when my small test worked! but then was dismayed whenmy x11 stuff still failed [this is after a make clean and remake total].after a little digging i found it was still an fseek problem, but witha twist. too bad the testing wasn't up to snuff... here is a test whichshows the problem. the #if 0 section was put in so i could upload thesame random byte file from linux, just in case... it worked on the sunin either case. here are the resultssunos:seeking to 10 (9 bytes)...seeking to 1125 (1114 bytes)...seeking to 2999 (1873 bytes)...linux:initializing...writing 3000 bytes as test to FOOseeking to 10 (9 bytes)...seeking to 1125 (1114 bytes)...ftell returned 101, not 1125seeking to 2999 (1873 bytes)...ftell returned 951, not 2999wrong byte at 2999 [140 vs 228]ahh... the joys of debugging :-)zorst[reply to obz@sisd.kodak.com]--cut here--*/#include <stdio.h>#include <stdlib.h>#include <unistd.h>main(argc, argv)     int argc; char **argv;{	int seek_kind = SEEK_CUR;	int use_stdout = 1;	FILE *fp ;	char buf[3000];	int i, j, k;	static int seektbl[] = { 0, 10, 1125, 2999 };	int nseektbl = sizeof(seektbl) / sizeof(seektbl[0]);	while (*++argv) {	    if (strcmp(*argv, "SEEK_SET") == 0)		seek_kind = SEEK_SET;	    else if (strcmp(*argv, "SEEK_CUR") == 0)		seek_kind = SEEK_CUR;	    else if (strcmp(*argv, "fopen") == 0)		use_stdout = 0;	    else if (strcmp(*argv, "freopen") == 0)		use_stdout = 1;	    else {		fprintf(stderr, "Unknown option %s\n", *argv);		return -1;	    }			}	fprintf(stderr, "Using seek_kind: %d\n", seek_kind);		if (use_stdout)	    fp = stdout;#if 1	fprintf (stderr, "initializing...\n");	for (i = 0; i < sizeof(buf); ++i)		buf[i] = i & 0xfe;	/* avoid -1 */	for (i = 0; i < sizeof(buf); ++i)	{		j = rand() % sizeof(buf);		k = buf[i];		buf[i] = buf[j];		buf[j] = k;	}	fprintf (stderr, "writing %d bytes as test to FOO\n", sizeof(buf));	if (use_stdout)		fp = freopen("FOO", "w", stdout);	else		fp = fopen("FOO", "w");	if (fp == NULL)	{		fprintf (stderr, "can't open FOO for writing\n");		return -1;	}	if (fwrite(buf, 1, sizeof(buf), fp) != sizeof(buf))	{		fprintf (stderr, "failed to write\n");		return -1;	}#else	if (use_stdout)		fp = freopen("FOO", "r", stdout);	else		fp = fopen("FOO", "r");	if (fp == NULL)	{		fprintf (stderr, "can't open FOO for initial read\n");		return -1;	}	if (fread(buf, 1, sizeof(buf), fp) != sizeof(buf))	{		fprintf (stderr, "failed to initial read\n");		return -1;	}#endif	if (use_stdout)		fp = freopen("FOO", "r", stdout);	else	{		fclose(fp);		fp = fopen("FOO", "r");	}	if (fp == NULL)	{		fprintf (stderr, "can't open FOO for reading\n");		return -1;	}	i = getc(fp) & 0xff;	if (i != buf[0] & 0xff)		fprintf (stderr, "wrong first byte!\n");	for (i = 1; i < nseektbl; ++i)	{		if (seek_kind == SEEK_CUR)			j = seektbl[i] - seektbl[i-1] - 1;		else			j = seektbl[i];		fprintf (stderr, "seeking to %d (%d bytes)...\n", seektbl[i], j);		fprintf (stderr, "we are at: %d\n", ftell (fp));		if (fseek(fp, j, seek_kind) < 0)		{			fprintf (stderr, "can't seek to %d\n", seektbl[i]);			return -1;		}		j = ftell(fp);		if (j != seektbl[i])			fprintf (stderr, "ftell returned %d, not %d\n", j, seektbl[i]);		j = getc(fp) & 0xff;		k = buf[seektbl[i]] & 0xff;		if (j != k)		{			fprintf (stderr, "wrong byte at %d [%d vs %d]\n",				seektbl[i], j, k);			return -1;		}	}	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -