C语言文件函数
打开与关闭文件
打开文件
FILE * fopen(const char *path, const char *mode);
返回值:成功返回一个文件指针,失败返回NULL
参数:
- *path:文件路径及文件名
- *mode:打开文件方式
关闭文件
int fclose( FILE *fp );
返回值:成功返回0,失败返回EOF
参数:
- *fp:需要关闭的文件指针
读写文件
读取字符
int fgetc(FILE *fp);
返回值:返回所读取的一个字节,若读到文件末尾时返回EOF(文件结束标识符,-1)
参数:
- *fp:文件指针,读取一个字符,指针后移一个字节
写入字符
int fputc(char c, FILE *fp);
返回值:字符的ASCII码值
参数:
- c:要写入的字符
- *fp:文件指针,写入一个字符,文件内部写指针会自动后移一个字节
eg:循环读出字符
FILE *fp = fopen("des_plain.txt","r");
char s;
while ((s = fgetc(fp)) != EOF)
{
fputc(s, stdout);
}
fclose(fp);
读取字符串
char *fgets(char *buf, int bufsize, FILE *fp);
返回值:成功返回buf,失败或读到文件末尾返回NULL(一次不能根据fgets返回值来判断是否出错,而是用feof函数)
参数:
- *buf:字符型指针,存储所得数据的地址
- bufsize:整型,指明存储数据的大小=bufsize-1
- *fp:文件指针
写入字符串
int fputs(char *str, FILE *fp);
返回值:成功返回0,失败返回EOF
参数:
- *str:要写入的字符串
- *fp:文件指针
eg:每次读取16个字符
FILE *fp = fopen("des_plain.txt","r");
char s[17];
while (fgets(s, 17, fp)!=NULL)
{
fputs(s, stdout);
printf("\n");
}
fclose(fp);
写入文件
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* fp);
返回值:返回实际写入的数据块数目
参数:
- *buffer:待写入数据的内存地址
- size:要写入内容的单字节数
- count:要进行写入size字节的数据项的个数
- *fp:文件指针
读取文件
size_t fread ( void *buffer, size_t size, size_t count, FILE *fp) ;
返回值:调用成功返回实际读取到的元素个数,失败或读到文件末尾返回0
参数:
- *buffer:用于接收数据的内存地址
- size:要读的每个数据项的字节数,单位是字节
- count:要读取的数据项数目,每个数据项size个字节
- *fp:文件指针
eg:写入多个字符到文件并读取文件
FILE *fp;
char buffer[30] = {'a','b','c','d','e','f'};
char list[30];
fp = fopen("file.txt", "w+");
int numwrite = fwrite(buffer, sizeof(char), 6, fp);
printf("%d\n", numwrite); // 写入字符数
puts(buffer);
rewind(fp); // 返回文件头
int numread = fread(list, sizeof(char), 30, fp);
printf("%d\n", numread);
puts(list);
fclose(fp);
return 0;
}
格式化写入文件
int fprintf (FILE* fp, const char* format, [argument]);
返回值:成功返回输出的字符数,失败返回一个负值
参数:
- *fp:文件指针
- *format:输出格式
- [argument]:附加参数列表
格式化读取文件
int fscanf(FILE* fp, constchar* format, [argument]);
返回值:成功返回读入参数的个数,失败返回EOF
参数:
- *fp:文件指针
- *format:格式化字符串
- [argument]:输入列表
eg:格式化写入和读取文件
FILE *fp;
fp = fopen("file.txt", "w+");
fprintf(fp, "%s %s %s %d", "I", "am", "Xherlock", 2022);
rewind(fp);
char str1[10], str2[10], str3[10];
int year;
fscanf(fp, "%s %s %s %d", str1, str2, str3, &year);
printf("The first string is \"%s\"\n", str1);
printf("The second string is \"%s\"\n", str2);
printf("The third string is \"%s\"\n", str3);
printf("The first integer is %d\n", year);
fclose(fp);
return 0;
重新回到文件头
void rewind(FILE *fp);
区分
需要注意整形、浮点型数据的字节长度
fwrite和fread是读写二进制文本