<C - 文件操作> 2017-12-05

01、文件操作1:

/*
1.文件
    保存数据  
    jpg  cpp txt

    文件后缀不影响文件内容  
    后缀 告诉计算机怎么去打开文件
2.文件操作的函数
    文件指针 文件打开之后  指针指向文件

3.文件加密解密

    异或  ab    a^b ^b-->a
    a--b-->c--b-->a
    b作为密码   
    作业  用代码拷贝一个文件   文件1  拷贝另外一个文件2  txt练习
    选做题 --> 课后了解一下 文件的加密和解密
*/
#include<stdio.h>
int main()
{
    FILE *fp;//文件指针  FILE POINTER  
    fp=fopen("1.txt", "w");//打开文件
    /*
    打开失败返回值为NULL   
    第一个  文件的位置   文件路径 
    第二个  打开方式
    r  read     读取  (只能打开一个已有的文件  没有打开失败) 
    w  write 写入  (如果文件存在  就把文件清空  如果文件不存在 新建文件)
    a append 追加   (已有文件后面追加新的内容 不清除原有内容)
    
    t  文本文件  txt  用文本方式写入  (可以不写)
    b  二进制文件     用二进制方式写入   (会乱码)

    +  可读写文件   打开一个可读写文件
    
    打开方式 
    r  只读的方式打开文件
    w  写入的方式打开
    a  用追加的方式打开


    rb
    rt

    rb+   用只读的方式 去打开一个可读写的二进制文件
    ab+
    */
#if 0
    /*
    fgetc    在文件中读出一个字符
    fputc  在文件中写入一个字符
        作用 和参数
    */
    char arr[12] = "hello world";
    for (int i = 0; i < 11; i++)
    {
        fputc(arr[i], fp);
    }
    fclose(fp);//保存文件
    fp = fopen("1.txt", "r");//只读的方式打开
    if (fp == NULL)
    {
        printf("文件打开失败");
        getchar();
        return 0;
    }
    int ch;
    //字符串末尾 '\0'  文件末尾
    printf("文件内容是:\n");
    while ((ch = fgetc(fp)) != EOF)
    {
        printf("%c", ch);
    }
#elif 0
    /*
    fgets  从文件中读取一个字符串
    fputs  将一个字符串写入到文件夹
    */
    fputs("你好 未来", fp);
    fclose(fp);//保存文件
    fp = fopen("1.txt", "r");//只读的方式打开
    if (fp == NULL)
    {
        printf("文件打开失败");
        getchar();
        return 0;
    }
    printf("读出的字符串是:\n");
    char arr[100];
    fgets(arr, 100, fp);//读取字符串之后存放的位置 ,最多能读取多少 ,从什么地方读取
    printf("%s", arr);
#elif 1
    /*
    fscanf  格式化写入 从文件中写入到程序
    fprintf  格式化输出  从程序输出到文件
    */
    fprintf(fp,"今天%d月 %d号\n%s", 12, 5, "天气很好");//格式占位符 
    //char arr[10];
    //sprintf(arr, "今天%d月%d号\n%s", 12, 5, "天气很好");//把后面的内容写入到数组中
    fclose(fp);//保存文件
    fp = fopen("1.txt", "r");//只读的方式打开
    if (fp == NULL)
    {
        printf("文件打开失败");
        getchar();
        return 0;
    }
    int x, y;
    char arr[100];
    //fprintf(fp, "今天%d月%d号\n%s", 12, 5, "天气很好");
    //fscanf(fp,"%d%d\n%s", &x, &y, arr);//怎么写入 怎么读出
    //printf("读出的数据是\t %d\t%d\t%s", x, y, arr);
    fscanf(fp,"%s", arr);
    printf("读出的数据是%s", arr);
    /*
    danny   70  70  50
    xk      60   70  90
    xingkong 90  67  80
    */
#endif
    /*
    ftell
    fseek
    rewind

    文件指针的原理  fp指向文件   文件内部指针(光标) 指向读取的位置
    feof 表示是否文件指针是否移动到文件末尾 (一般用来判断二进制文档)
    feof(fp)  返回1 表示读到文件末尾  返回0 还没有读取到文件末尾

    */
    rewind(fp);//将文件指针指向文件开头
    long address = ftell(fp);//返回文件指针离文件开头的偏移量
    fseek(fp, address, SEEK_SET);//定位函数  根据偏移量 将文件指针移动到
    //SEEK_SET  文件开头
    //SEEK_CUR  文件指针当前位置
    //SEEK_END    文件末尾


    getchar();
    fclose(fp);//关闭文件
    return 0;
}

02、文件操作2

#include<stdio.h>

/*
fread  从文件读取一块数据  存入程序中某个变量或者数组
fwrite  从程序中写入文件
*/
typedef struct node
{
    int data;
    char name[10];
    double weight;
}NODE,*PNODE;
int main()
{

#if 0
    FILE *fp = fopen("2.txt", "wb");
    if (fp == NULL) return 0;//判断是否打开失败
    NODE arr[10] = { { 0, "未来", 3.1415926 }, {1, "白羊", 3.1415926 } };
    for (int i=2; i < 10; i++)
    {
        arr[i] = arr[0];
        arr[i].data = i;
    }
    fwrite(arr, sizeof(NODE), 10, fp);
    //arr 要写入的数据存放的位置            取水点
    //sizeof(NODE) 写入数据的单位(字节)        一次性取多少
    //10  个数                                取的次数
    //fp  文件指针                            放水点




#elif 1
    FILE *fp = fopen("2.txt", "rb");
    if (fp == NULL) return 0;//判断是否打开失败
    NODE brr[10];
    fread(brr, sizeof(NODE), 10, fp);
    //从文件中读出来 -->fp
    //读到brr中
    for (int i = 0; i < 10; i++)
    {
        printf("%d\t%s\t%lf\n", brr[i].data, brr[i].name, brr[i].weight);
        //(brr + i)->data;
    }
#endif
    fclose(fp);
    getchar();
    return 0;
}

 

03、加密软件:

#include<stdio.h>
int main()
{
    FILE *fp = fopen("文档.txt", "rb");
    FILE *fp2 = fopen("加密文档.txt", "wb");
    
    char arr[2] = { 0 };
    while (!feof(fp))
    {
        fread(arr, sizeof(char), 1, fp);//读取文档
        arr[0] ^= 123;
        
        fwrite(arr, sizeof(char), 1, fp2);//写入加密文档
    }
    fclose(fp);
    fclose(fp2);
    getchar();
    //remove("文档.txt");
    //解密文件
    fp = fopen("加密文档.txt", "rb");
    fp2 = fopen("解密文档.txt", "wb");

    while (!feof(fp))
    {
        fread(arr, sizeof(char), 1, fp);//读取文档
        printf("%s\n", arr);
        arr[0] ^= 123;
        fwrite(arr, sizeof(char), 1, fp2);//写入加密文档
    }
    fclose(fp);
    fclose(fp2);
    getchar();
    return 0;
}

 

04、解压软件:

 

<补课文件操作>:

/*
**  打开文件 -> FILE fopen(文件路径,打开方式);  (返回指针)
**
**
*/
#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *pFile = fopen("Danny.txt", "w");   // 定义文件指针 并打开文件  
    if (NULL == pFile)  // 判断打开文件
    {
        printf("打开文件失败!");
        exit(0);   // 退出程序
    }
    // 第一个参数:要写入数据的地址
    // 第二个参数:要写多大
    // 第三个参数:你要写多少次
    // 第四个参数:指向FILE结构体指针

    fwrite("夏七好可爱!!!", 13, 1, pFile);
    //fwrite("夏七好可爱!!!", 1, 13, pFile);
    //
    // 比方说  你要从一个文件读出东西  可是你不知道有多少个字节  怎么读写
    
    char strtext[1024] = { 0 };
    int i = 0;
    fseek(pFile, 4, SEEK_SET);
    while (strtext[i] == fgetc(pFile) != EOF)
    {
        i++;
    }
    printf("读出的数据:%s\n", strtext);

    fclose(pFile);  // 关闭文件
    getchar();
    return 0;
}

 

posted @ 2018-01-25 16:25  让优秀成为一种习惯  阅读(156)  评论(0编辑  收藏  举报