1.文件的随机读写:
fseek函数
int fseek ( FILE * stream, long int offset, int origin );
fseek函数是根据文件指针的位置和偏移量来定位文件指针。
其中,origin所含的参数:
seek_set:文件开头
seek_cur:文件指针的当前位置
seek_end:文件结束*
语言可能难懂,可以配合下面的代码来理解一下:
#include <stdio.h>
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;
}
结果展示:
sam替换了从文件开头后的第九位后的些许数。
ftell函数:就是返回文件指针距开头的位置。
long int ftell ( FILE * stream );
代码展示:
#include <stdio.h>
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;
}
结果展示:
myfile文件中有:
rewind函数:让文件指针的位置回到文件的起始位置
void rewind ( FILE * stream );
代码展示:
#include <stdio.h>
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';
puts (buffer);
return 0;
}
结果展示:
2.判断文件结束原因
ferror函数:
int ferror ( FILE * stream );
在文件读取结束后,判断文件是否因为错误而结束。是的话返回非零值。
feof函数:
在文件读取结束后,判断文件是否因为读取到EOF而结束。不是的话返回NULL。
#include <stdio.h>
#include <stdlib.h>
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);
}