文件流
文件如果存储或者读取,都不是一下子运行的,而是一段一段加载的。例子:网络视频,下面的进度栏
文件分类:
文本文件:打开看得懂文字的是文本文件
二进制文件:打开看不懂的是二进制文件
主要是windows下差别比较大
文件操作步骤:
1.打开文件
2.操作文件
3.关闭文件
FILE *fp = fopen(路径,打开方式);
打开方式:
r:读,如果文件不存在返回NULL,存在就打开
w:写,如果文件存在则覆盖,不存在则创建
a:追加,如果文件存在则追加,不存在则创建
r+:跟r一样,增加写
w+:跟w一样,增加读
a+:跟a一样,增加读
t:文本文件(默认的) rt wt at rt+
b:二进制文件 rb wb ab rb+
主要函数:
fgetc:
char ch = fgetc(文件指针);
作用:从文件中读取一个字符
fgetc和getc没有区别,用法也一样
fputc:
fputc(字符,文件指针);
作用:写入一个字符到文件
因为我们发现上面两个只能一个一个字符的读,或者一个字符一个字符的写,非常不方便,要读完或者写完文件必须循环,所以我们可以使用针对字符串的函数:
fgets:
fgets(字符数组,长度n,文件指针);
作用:从文件指针指向的文件中读取n-1个字符存到字符数组里,会自动在后面加\0,字符数组用来保存你读取出来的字符串
文件指针:去哪读
注意:如果遇到换行"\n",会立即结束读取
fputs:
fputs(字符串,文件指针);
作用:写入一个字符串到文件指针指向的文件
feof(文件指针):判断文件是否读到末尾,如果到末尾返回1(真),否则返回0(假)
最常用属性:
fread:
fread(保存数据的首地址,每块的大小,多少块,文件指针);
作用:从文件指针指向的文件中分块读取(文件指针),告诉它一次读取多少块(多少块),每块多大(第二个参数),存到哪(第一个参数)
例: char str[50];
fread(str, 3, 100, fp);
注意:它只关心具体读的字节数,不会关心这些自己里面有没有换行
fwrite:
fwrite(数据的首地址,每块的大小,多少块,文件指针);
作用:将数据分块写入到文件指针指向的文件。第一个是告诉系统,写入什么数据,第二个是告诉系统每块多少字节,第三个是告诉系统分多少块写入,第四个是写入到哪个文件
fscanf:
fscanf(文件指针,格式化控制符,地址列表);
是读取
fprintf:
fprintf(文件指针,格式化控制符,参数列表);
是写入
fclose(文件指针);//关闭文件
//举例代码实现:
#include <stdio.h>
#include <string.h>
typedef struct {
char name[16];
int age;
}Person;
int main(int argc, const char * argv[]) {
FILE *fp = fopen("/Users/ios001/Desktop/1.txt", "w+");//wb 而是读内存缓冲区
if (fp) {
char str[50];
fread(str, 1, 50, fp); //从fp指向的地址中读取,一次读取50块,每块1字节,存到str字符数组中
puts(str);
fclose(fp);
}
/*
FILE *fp = fopen("/Users/ios001/Desktop/1.txt", "r");//wb
//fp != NULL;
//fp != 0;
//那么也就是说fp 为真的时候
if(fp){
// char ch = fgetc(fp);//一次只读一个
// printf("%c\n",ch);
// char str[50];
// fgets(str, 50, fp);//一次读取一行,或者说读取50-1个长度
// puts(str);
// char str[50] = {0};//最好初始化为0,否则有垃圾值
// fread(str, 1, 3, fp);//一次读取1*3个字节
// puts(str);
// char str[50] = {0};
// fscanf(fp, "%s",str); //按格式读取
// puts(str);
// char ch = 'a';
// fputc(ch, fp); //写入一个字符到文件,注意不要加取地址符
// char str[] = "abc";
// fputs(str, fp); //可以写入任意形式的字符串
// char str[] ="abcdef";
这是写
// Person p = { "苍小空",14};
// fwrite(&p, sizeof(p), 1, fp);
这是读
// Person p;
// fread(&p, sizeof(Person), 1, fp);
// printf("姓名:%s 年龄:%d",,p.age);
//写入数组
// int nums[] = {1,2,3,4,5};
// fwrite(nums, 4, 5, fp);
//读取数组
int nums[5];
fread(nums, 4, 5, fp);
//读取后,用for循环遍历
for (int i=0; i<5; i++) {
printf("%d\n",nums[i]);
}
fclose(fp);
}
*/
return 0;
}