tst-rndseek.c

来自「绝对正真的stdio.h的实现」· C语言 代码 · 共 145 行

C
145
字号
#include <errno.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>static char fname[] = "/tmp/rndseek.XXXXXX";static char tempdata[65 * 1024];static int do_test (void);#define TEST_FUNCTION do_test ()#define TIMEOUT 10#include "../test-skeleton.c"static intfp_test (const char *name, FILE *fp){  int result = 0;  int rounds = 10000;  do    {      int idx = random () % (sizeof (tempdata) - 2);      char ch1;      char ch2;      if (fseek (fp, idx, SEEK_SET) != 0)	{	  printf ("%s: %d: fseek failed: %m\n", name, rounds);	  result = 1;	  break;	}      ch1 = fgetc_unlocked (fp);      ch2 = tempdata[idx];      if (ch1 != ch2)	{	  printf ("%s: %d: character at index %d not what is expected ('%c' vs '%c')\n",		  name, rounds, idx, ch1, ch2);	  result = 1;	  break;	}      ch1 = fgetc (fp);      ch2 = tempdata[idx + 1];      if (ch1 != ch2)	{	  printf ("%s: %d: character at index %d not what is expected ('%c' vs '%c')\n",		  name, rounds, idx + 1, ch1, ch2);	  result = 1;	  break;	}    }  while (--rounds > 0);  fclose (fp);  return result;}static intdo_test (void){  int fd;  FILE *fp;  size_t i;  int result;  fd = mkstemp (fname);  if (fd == -1)    {      printf ("cannot open temporary file: %m\n");      return 1;    }  /* Make sure the file gets removed.  */  add_temp_file (fname);  /* Repeatability demands this.  */  srandom (42);  /* First create some temporary data.  */  for (i = 0; i < sizeof (tempdata); ++i)    tempdata[i] = 'a' + random () % 26;  /* Write this data to a file.  */  if (TEMP_FAILURE_RETRY (write (fd, tempdata, sizeof (tempdata)))      != sizeof (tempdata))    {      printf ("cannot wrote data to temporary file: %m\n");      return 1;    }  /* Now try reading the data.  */  fp = fdopen (dup (fd), "r");  if (fp == NULL)    {      printf ("cannot duplicate temporary file descriptor: %m\n");      return 1;    }  rewind (fp);  for (i = 0; i < sizeof (tempdata); ++i)    {      int ch0 = fgetc (fp);      char ch1 = ch0;      char ch2 = tempdata[i];      if (ch0 == EOF)	{	  puts ("premature end of file while reading data");	  return 1;	}      if (ch1 != ch2)	{	  printf ("%zd: '%c' vs '%c'\n", i, ch1, ch2);	  return 1;	}    }  result = fp_test ("fdopen(\"r\")", fp);  fp = fopen (fname, "r");  result |= fp_test ("fopen(\"r\")", fp);  fp = fopen64 (fname, "r");  result |= fp_test ("fopen64(\"r\")", fp);  /* The "rw" mode will prevent the mmap-using code from being used.  */  fp = fdopen (fd, "rw");  result = fp_test ("fdopen(\"rw\")", fp);  fp = fopen (fname, "rw");  result |= fp_test ("fopen(\"rw\")", fp);  fp = fopen64 (fname, "rw");  result |= fp_test ("fopen64(\"rw\")", fp);  return result;}

⌨️ 快捷键说明

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