文件
文件可分为程序文件和数据文件。
程序文件包括以.c,.obj,.exe等结尾的文件。
数据文件的内容就是程序运行期间需要输入或输出的数据。
文件也可分为文本文件和二进制文件,在内存中文件以二进制形式存储,不过这除了中文以外(ASCII编码);在外存中的文件格式取决于存储前有没有对文件进行转码。
打开文件
先来讨论如果要打开一个文本文件,将是以哪种方式打开?
是以读(r),写(w),还是追加(a)的方式打开?
在C语言中,如果以只读方式打开一个不存在的文件,将会报错;
写和追加的方式如果打开一个不存在的文件,将会新建一个文件。
以写方式打开文件,将会清空原文件内容,不能读;
以追加方式打开文件,在原文件后添加新内容,不能读。
如果文件是二进制文件将使用:rb , wb , ab 方式打开文件
示例:
//FILE* file = fopen("./test.txt","a");
//FILE* file = fopen("./test.txt","r");
//FILE* file = fopen("./test.txt","w");
如果文件打开失败返回NULL
文件的一些函数
fgetc 以字符形式从文件中读取数据
int fgetc(FILE *stream)
fputc 以字符形式向文件中写数据
int fputc(int char, FILE *stream)
fgets以字符串形式从文件中读取数据
char *fgets(char *str, int n, FILE *stream)
fputs以字符串形式向文件中写数据
int fputs(const char *str, FILE *stream)
fscanf以指定格式从文件中获取数据
int fscanf(FILE *stream, const char *format, ...)
fprintf以指定格式向文件中写数据
int fprintf(FILE *stream, const char *format, ...)
fread二进制读
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
fwrite二进制写
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
以fputs为例写:
#include <stdio.h>
int main()
{
FILE* file = fopen("./test.txt","w");
fputs("Java",file);
fclose(file);
return 0;
}
运行结果:
在test.txt中写入“Java”
以fgets为例读:
#include <stdio.h>
int main()
{
FILE* file = fopen("./test.txt","r");
char s[100];
fgets(s, 100, file);
printf("%s\n", s);
fclose(file);
return 0;
}
运行结果:
当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,fgets读取结束。
fseek偏移到指定下标位置
int fseek(FILE *stream, long int offset, int whence)
ftell返回据文件开始的偏移量
long int ftell(FILE *stream)
rewind使文件指针指向文件起始位置
void rewind(FILE *stream)
test.txt文本内容如下
示例:
#include <stdio.h>
int main()
{
FILE* file = fopen("./test.txt","r");
char s[100];
fgets(s, 10, file);
printf("%s\n", s);
int cur = ftell(file);
printf("%d\n", cur);
fseek(file, 4, SEEK_SET);
cur = ftell(file);
printf("%d\n", cur);
rewind(file);
cur = ftell(file);
printf("%d\n", cur);
fclose(file);
return 0;
}
关闭文件
fclose(file);
判断是否读取结束
文本文件:
fgetc方式判断文件指针是否等于EOF
fgets方式判断文件指针是否等于NULL
二进制文本:
fread判断读取的个数是否和要读取的个数一致