一、文件的随机读写
1.fseek
int fseek(FILE *stream, long int offset, int whence)
stream:文件指针;offset:文件光标(文件指针操作的位置)的偏移量;whence:文件光标的位置。whence有三种方式指定光标的位置:
SEEK_SET:文件的开头
SEEK_CUR:文件当前的位置
SEEK_END:文件的末尾
代码:只能在指定光标位置后进行修改,不能直接添加
int main()
{
FILE* f = fopen("dest.txt", "w");
if (f == NULL)
{
perror("fopen");
return 1;
}
fputs("abcdef", f);
fseek(f, 3, SEEK_SET);
fprintf(f,"abc");
fclose(f);
return 0;
}
2.ftell
long int ftell(FILE *stream)
返回光标相对文件起始位置的偏移量。
代码:
int main()
{
FILE* f = fopen("dest.txt", "w");
if (f == NULL)
{
perror("fopen");
return 1;
}
fputs("abcdef", f);
fseek(f, 3, SEEK_SET);
fprintf(f,"abc");
int a = ftell(f);
printf("%d", a);
fclose(f);
return 0;
}
3.rewind
void rewind ( FILE * stream );
让光标返回到文件的起始位置。
代码:
int main()
{
FILE* f = fopen("dest.txt", "w");
if (f == NULL)
{
perror("fopen");
return 1;
}
fputs("abcdef", f);
fseek(f, 3, SEEK_SET);
fprintf(f,"abc");
rewind(f);
fputs("hg", f);
fclose(f);
return 0;
}
二、文本文件和二进制文件
根据数据的组织形式,数据文件被称为文本文件或者二进制文件。
数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。
我们之前写的文件都是以文本文件写入的,现在来试试二进制方式写入是上面样的:
fwrite:
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
ptr:指向要被写入的元素数组的指针;size:要被写入的每个元素的大小,以字节为单位;nmemb:元素的个数,每个元素的大小为 size 字节。返回值:如果成功,该函数返回一个 size_t 对象,表示元素的总数,该对象是一个整型数据类型。如果该数字与 nmemb 参数不同,则会显示一个错误。
fread:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
ptr:指向带有最小尺寸 size*nmemb 字节的内存块的指针;size:要读取的每个元素的大小,以字节为单位;nmemb:元素的个数,每个元素的大小为 size 字节。返回值:成功读取的元素总数会以 size_t 对象返回,size_t 对象是一个整型数据类型。如果总数与nmemb 参数不同,则可能发生了一个错误或者到达了文件末尾。
int main()
{
int a = 10000;
FILE* pf = fopen("dest.txt", "wb");
fwrite(&a, 4, 1, pf);
fclose(pf);
pf = NULL;
return 0;
}
可以看到将10000以二进制传到文本是看不出来是什么的,我们以二进制方式打开:
三、文件读取的判定
feof:用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。
ferror:判断文件读取结束时是否错误,是该函数返回一个非零值,否则返回一个零值。
1. 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
例如:
fgetc 判断是否为 EOF .
fgets 判断返回值是否为 NULL .
2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
例如:
fread判断返回值是否小于实际要读的个数
int main()
{
int b = 0;
FILE* pf = fopen("dest.txt", "rb");
fread(&b, 4, 1, pf);
if (feof(pf))
printf("Error reading test.bin: unexpected end of file\n");
else if (ferror(pf)) {
perror("Error reading test.bin");
}
fclose(pf);
pf = NULL;
return 0;
}