前言
以下是<cstdio>
对文件指针操作的函数。
1、fread
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
/*
* @func:从流中读取数据块;
* @param ptr:指向大小至少为(size*count)字节的内存块的指针,转换为void*;
* @param size:(size_t)要读取的每个元素的大小;
* @param count:(size_t)元素的数量,每个元素的大小为size字节;
* @param stream:指向指定输入流的FILE对象的指针;
* return:成功返回读取元素总数;若size或count为0,则返回0;
*/
案例
void Demo_fread(){
char buf[100] = {0};
FILE *fp = fopen("test.txt", "r");
/* 获取文件大小 */
fseek(fp, 0, SEEK_END);
int size = ftell(fp);
rewind(fp);
/* 读取文件 */
fread(buf, size, sizeof(char), fp);
printf(buf);
fclose(fp);
}
2、fwrite
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
/*
* @func:将数据块写入流;
* @param ptr:指向要写入的元素数组的指针,转换为const void*;
* @param size:(size_t)要读取的每个元素的大小;
* @param count:(size_t)元素的数量,每个元素的大小为size字节;
* @param stream:指向指定输入流的FILE对象的指针;
* return:成功返回读取元素总数;若size或count为0,则返回0;
*/
案例
void Demo_fwrite(){
char *buf = "T like...";
FILE *fp = fopen("test.txt", "w");
/* 写入文件 */
fwrite(buf, strlen(buf), sizeof(char), fp);
fclose(fp);
}
3、fgetpos
int fgetpos ( FILE * stream, fpos_t * pos );
/*
* @func:获取流中的当前位置;
* @param pos :指向fpos_t对象的指针(已分配),传出参数;
* @param stream:指向指定输入流的FILE对象的指针;
* return:成功返回0,错误返回非0值;
*/
案例
void Demo_fgetpos(){
fpos_t pos; // 定义传出参数
FILE *fp = fopen("test.txt", "r");
fgetpos(fp, &pos); // 获取指针
printf("文件指针当前位置:%d\n", pos);
fclose(fp);
}
4、fseek
int fseek ( FILE * stream, long int offset, int origin );
/*
* @func:重新定位流位置指示器;
* @param origin:
SEEK_SET 文件开头
SEEK_CUR 文件指针的当前位置
SEEK_END 文件结束 *
* @param offset:
* 二进制文件:从origin偏移的字节数。
* 文本文件:零或ftell返回的值。
* @param stream:指向指定输入流的FILE对象的指针;
* return:成功返回0,错误返回非0值;
*/
注意:库允许实现无意义地支持SEEK_END(因此,使用它的代码没有真正的标准可移植性)
案例
void Demo_fseek(){
fpos_t pos;
FILE *fp = fopen("test.txt", "w+");
for (char ch = 'A'; ch < 'K'; ++ch){
if (ch == 'C'){
// 设置文件指针会到开头
fseek(fp, 0, SEEK_SET);
printf("文件指针回溯...\n");
}
fputc(ch, fp); // 写入文件
fgetpos(fp, &pos); // 获取文件指针当前位置
printf("文件指针当前位置:%d\n", pos);
}
printf("文件指针当前位置:%d\n", pos);
fclose(fp);
}
5、fsetpos
int fsetpos ( FILE * stream, const fpos_t * pos );
/*
* @func:设置流的位置指示器;
* @param pos :指向包含先前使用fgetpos获得的位置的fpos_t对象的指针;
* @param stream:指向指定输入流的FILE对象的指针;
* return:成功返回0,错误返回非0值;
*/
案例
void Demo_fsetpos(){
fpos_t pos;
FILE *fp = fopen("test.txt", "w+");
for (char ch = 'A'; ch < 'K'; ++ch){
if (ch == 'C'){
fgetpos(fp, &pos); // 获取文件指针当前位置
printf("已获取文件指针%d\n", pos);
}
if (ch == 'E'){ // 当字符为E时重新设置指针到C,写入,因此C到E间的字母会被覆盖
printf("重新设置文件指针...\n");
fsetpos(fp, &pos);
}
fputc(ch, fp); // 写入文件
}
fclose(fp);
}
6、ftell
long int ftell ( FILE * stream );
/*
* @func:获取流中的当前位置;
* @param stream:指向指定输入流的FILE对象的指针;
* return:成功返回指示器当前位置,错误返回-1L;
*/
案例
void Demo_fread(){
char buf[100] = {0};
FILE *fp = fopen("test.txt", "r");
/* 获取文件大小 */
fseek(fp, 0, SEEK_END); // 将文件指针设置到文件末尾
int size = ftell(fp); // 返回位置指示器的当前值
rewind(fp); // 将文件指针设置会开头位置
/* 读取文件 */
fread(buf, size, sizeof(char), fp);
printf(buf);
fclose(fp);
}
7、rewind
void rewind ( FILE * stream );
/*
* @func:将流的位置设置为开头;
* @param stream:指向指定输入流的FILE对象的指针;
*/
案例
void Demo_fread(){
char buf[100] = {0};
FILE *fp = fopen("test.txt", "r");
/* 获取文件大小 */
fseek(fp, 0, SEEK_END); // 将文件指针设置到文件末尾
int size = ftell(fp); // 返回位置指示器的当前值
rewind(fp); // 将文件指针设置会开头位置
/* 读取文件 */
fread(buf, size, sizeof(char), fp);
printf(buf);
fclose(fp);
}
8、perror
void perror ( const char * str );
/*
* @func:打印错误信息;
* @param str :产生错
* `在这里插入代码片`误信息相关;
*/
案例
void Demo_perror(){
FILE *fp = fopen("test1.txt", "r");
if (fp == NULL){
perror("file open");
}else{
fclose(fp);
}
}