c语言练习68:文件的随机读写

文件的随机读写

fseek

fseek 根据⽂件指针的位置和偏移量来定位⽂件指针。

1 int fseek ( FILE * stream, long int offset, int origin );

例子:

/* fseek example */
#include 
int main ()
{
 FILE * pFile;
 pFile = fopen ( "example.txt" , "wb" );
 fputs ( "This is an apple." , pFile );
 fseek ( pFile , 9 , SEEK_SET );
 fputs ( " sam" , pFile );
 fclose ( pFile );
 return 0;
}

ftell

返回⽂件指针相对于起始位置的偏移量

1 long int ftell ( FILE * stream );

/* ftell example : getting size of a file */
#include 
int main ()
{
 FILE * pFile;
 long size;
 pFile = fopen ("myfile.txt","rb");
 if (pFile==NULL)
 perror ("Error opening file");
 else
 {
 fseek (pFile, 0, SEEK_END); // non-portable
 size=ftell (pFile);
 fclose (pFile);
 printf ("Size of myfile.txt: %ld bytes.\n",size);
 }
 return 0;
}

rewind

让⽂件指针的位置回到⽂件的起始位置

1 void rewind ( FILE * stream );

/* rewind example */
#include 
int main ()
{
 int n;
 FILE * pFile;
 char buffer [27];

 pFile = fopen ("myfile.txt","w+");
 for ( n='A' ; n<='Z' ; n++)
 fputc ( n, pFile);
 rewind (pFile);

 fread (buffer,1,26,pFile);
 fclose (pFile);

 buffer[26]='\0';
 printf(buffer);
 return 0;
}

综合案例:

#include
int main() {
	FILE* pf = fopen("data.txt", "r");
	if (pf == NULL) {
		perror(fopen);
		return 1;
	}
	//读文件
	//定位文件指针
	//fseek(pf, 6, SEEK_SET);
	//fseek(pf, -1, SEEK_END);
	int ch = fgetc(pf);
	printf("%c\n", ch);
	fseek(pf, 5, SEEK_CUR);
	ch = fgetc(pf);
	printf("%c\n", ch);
	int pos = ftell(pf);
	printf("%d\n", pos);
	rewind(pf);
	ch = fgetc(pf);
	printf("%c\n", ch);
	fclose(pf);
	pf = NULL;
	return 0;
}

结果:

c语言练习68:文件的随机读写_第1张图片

⽂件读取结束的判定

feof

牢记:在⽂件读取过程中,不能⽤feof函数的返回值直接来判断⽂件的是否结束。

feof 的作⽤是:当⽂件读取结束的时候,判断是读取结束的原因是否是:遇到⽂件尾结束。

1. ⽂本⽂件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )

例如:

• fgetc 判断是否为 EOF .(正常返回ASCII值)

• fgets 判断返回值是否为 NULL .(正常返回首元素的起始地址)

2.⼆进制⽂件的读取结束判断,判断返回值是否⼩于实际要读的个数。

例如:

• fread判断返回值是否⼩于实际要读的个数。

⽂本⽂件的例⼦:

#include 
#include 
int main(void)
{
 int c; // 注意:int,⾮char,要求处理EOF
 FILE* fp = fopen("test.txt", "r");
 if(!fp) {
 perror("File opening failed");
 return EXIT_FAILURE;
 }
 //fgetc 当读取失败的时候或者遇到⽂件结束的时候,都会返回EOF
 while ((c = fgetc(fp)) != EOF) // 标准C I/O读取⽂件循环
 {
 putchar(c);
 }
 //判断是什么原因结束的
 if (ferror(fp))
 puts("I/O error when reading");
 else if (feof(fp))
 puts("End of file reached successfully");
 fclose(fp);
}

⼆进制⽂件的例⼦:

#include 
enum { SIZE = 5 };
int main(void)
{
 double a[SIZE] = {1.,2.,3.,4.,5.};
 FILE *fp = fopen("test.bin", "wb"); // 必须⽤⼆进制模式
 fwrite(a, sizeof *a, SIZE, fp); // 写 double 的数组
 fclose(fp);
 double b[SIZE];
 fp = fopen("test.bin","rb");
size_t ret_code = fread(b, sizeof *b, SIZE, fp); // 读 double 的数组
 if(ret_code == SIZE) {
 puts("Array read successfully, contents: ");
 for(int n = 0; n < SIZE; ++n) printf("%f ", b[n]);
 putchar('\n');
 } else { // error handling
 if (feof(fp))
 printf("Error reading test.bin: unexpected end of file\n");
 else if (ferror(fp)) {
 perror("Error reading test.bin");
 }
 }
 fclose(fp);
}

c语言练习68:文件的随机读写_第2张图片

你可能感兴趣的:(c语言,开发语言)