本文例子与部分解释来自: 菜鸟网 : https://www.runoob.com/
C语言文件类型指针:
FILE* 指针名;
打开文件:
FILE *fopen(char *filename, char *mode);
filename为文件名,mode为打开方式
fopen常用打开方式:
打开方式 | 说明 |
---|---|
r | 读(文本文件) |
w | 写(文本文件)会新建一个文本文件,文件名存在则将被删除后创建。 |
a | 打开一个文件文件,不存在而新建,存在则在文件末尾追写(不可读) |
修饰打开方式的修饰符(个人取名):
+ 表达可读可写:
例如:r+ 表示 读写(文本文件)
b 表示打开二进制文件:
例如:rb 表示读(二进制文件)
修饰符可以搭配使用,例如:
rb+ 读写二进制文件
文件指针结构体原型:
#ifndef _FILE_DEFINED
struct _iobuf {
char *_ptr; //文件输入的下一个位置
int _cnt; //当前缓冲区的相对位置
char *_base; //指基础位置(即是文件的起始位置)
int _flag; //文件标志
int _file; //文件描述符id
int _charbuf; //检查缓冲区状况,如果无缓冲区则不读取
int _bufsiz; //文件缓冲区大小
char *_tmpfname; //临时文件名
};
typedef struct _iobuf FILE;
#define _FILE_DEFINED
#endif
文本文件可以理解成windows下的txt文件,而二进制文件可以理解成视频、音乐等等文件。
关于文本文件与二进制文件的根本区别:https://blog.csdn.net/colourful_sky/article/details/80334250
向文件流写入数据:
把 ptr 所指向的数组中的数据写入到给定流 stream 中
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
ptr – 这是指向要被写入的元素数组的指针。
size – 这是要被写入的每个元素的大小,以字节为单位。
nmemb – 这是元素的个数,每个元素的大小为 size 字节。
stream – 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。
返回:写入数据的个数。
例:
#include<stdio.h>
int main ()
{
FILE *fp;
char str[] = "This is runoob.com";
fp = fopen( "file.txt" , "w" );
fwrite(str, sizeof(str) , 1, fp );
fclose(fp);
return(0);
}
注意:文件的输入会在文件指针关闭时才会从缓冲区输入!!!
所以,你在调用fwrite函数的时候,要fclose才会生效!
清空文件缓冲区:
int fflush(FILE *stream)
刷新stream流的缓冲区数据,有效数据清零,指针回到起点。
成功返回0,错误返回EOF
从文件流读取字符串:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
ptr – 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。
size – 这是要读取的每个元素的大小,以字节为单位。
nmemb – 这是元素的个数,每个元素的大小为 size 字节。
stream – 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。
返回读取成功的元素个数
例:
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp;
char c[] = "This is runoob";
char buffer[20];
/* 打开文件用于读写 */
fp = fopen("file.txt", "w+");
/* 写入数据到文件 */
fwrite(c, strlen(c) + 1, 1, fp);
/* 查找文件的开头 */
fseek(fp, 0, SEEK_SET);
/* 读取并显示数据 */
fread(buffer, strlen(c)+1, 1, fp);
printf("%s\n", buffer);
fclose(fp);
return(0);
}
从流 stream 格式化读取到字符串:
int fscanf(FILE *stream, const char *format,char *str,...);
从stream中以format的格式来读取到str
format的格式与scanf的格式一样。
例:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char str1[10], str2[10], str3[10];
int year;
FILE * fp;
fp = fopen ("file.txt", "w+");
fputs("We are in 2014", fp);
rewind(fp);
fscanf(fp, "%s %s %s %d", str1, str2, str3, &year);
printf("Read String1 |%s|\n", str1 );
printf("Read String2 |%s|\n", str2 );
printf("Read String3 |%s|\n", str3 );
printf("Read Integer |%d|\n", year );
fclose(fp);
return(0);
}
字符串格式化输出到流 stream 中(与scanf相反):
int fprintf(FILE *stream, const char *format,char *str,...);
将str的字符串以format的格式输出到stream流中
format的格式与printf的格式一样。
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE * fp;
fp = fopen ("file.txt", "w+");
fprintf(fp, "%s %s %s %d", "We", "are", "in", 2014);
fclose(fp);
return(0);
}
文件指针回到开头,清除文件流:
void rewind(FILE *stream);
stream表示要操作的文件流。
把字符串写入到指定的流 stream 中,但不包括空字符:
int fputs(const char *str, FILE *stream)
str 是一个字符串
stream 是要写入的文件流
注意:该函数会以空字符为终止。
返回值:该函数返回一个非负值,如果发生错误则返回 EOF。
把一个字符写入到指定的流stream中:
int fputc(int char, FILE *stream)
把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动。
读取一行字符串并写入到stream中:
char *fgets(char *str, int n, FILE *stream)
从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。
从stream流中读取一个字符:
int fgetc(FILE *stream)
从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动。
判断文件指针是否到了结尾,是返回0,不是返回非0:
int feof(FILE *stream)
测试给定流 stream 的错误标识符:
int ferror(FILE *stream)
如果设置了与流关联的错误标识符,该函数返回一个非零值,否则返回一个零值。
清除给定流 stream 的文件结束和错误标识符:
void clearerr(FILE *stream)
这不会失败,且不会设置外部变量 errno,但是如果它检测到它的参数不是一个有效的流,则返回 -1,并设置 errno 为 EBADF。
设置文件指针的位置:
int fseek(FILE *stream, long int offset, int whence)
stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
offset – 这是相对 whence 的偏移量,以字节为单位。
whence – 这是表示开始添加偏移 offset 的位置。它一般指定为下列常量之一:
常量 | 描述 |
---|---|
SEEK_SET | 文件的开头 |
SEEK_CUR | 文件指针的当前位置 |
SEEK_END | 文件的末尾 |
返回值:如果成功,则该函数返回零,否则返回非零值。
查找当前文件指针距文件夹有多少字节:
long int ftell(FILE *stream)
返回值:该函数返回位置标识符的当前值。如果发生错误,则返回 -1L,全局变量 errno 被设置为一个正值。