文件流

文件如果存储或者读取,都不是一下子运行的,而是一段一段加载的。例子:网络视频,下面的进度栏


 文件分类:

        文本文件:打开看得懂文字的是文本文件

        二进制文件:打开看不懂的是二进制文件

主要是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;
}