文件的相关用法

#define _CRT_SECURE_NO_WARNINGS//必须放在第一行
#include <stdio.h>
#include <assert.h>
#include <string.h>
/*
* 文件:
*   文件基本概念:
*    内存:内存条(8~16G),定义的变量,运行的程序都在内存里,Ctrl+Alt+Delete打开任务管理器
*    外存:硬盘(机械硬盘(便宜,容量大,慢),固态硬盘(快,贵))
*    内存和外存对比: 
        内存优点:1.速度快
        内存缺点:1.价格贵(22.78元/G);2.断电不保存数据
        外存优点:1.容量大,2.价格便宜(0.22元/G),3.断电保存数据
        外存缺点:1.速度慢
    如果数据需要长期保存,一定需要保存到文件(外存).
* 输出设备:屏幕,投影仪,打印机
* 标准输出设备:屏幕,stdout文件常开
* 输入设备:键盘,鼠标,触摸板,触摸屏,手写笔
* 标准输入设备:键盘,stdin文件常开
* I/O设备:Input/Output 设备
* 文件流: 输入流(外存到内存,例如视频播放),输出流(内存到外存,例如保存文档)
* 文件后缀名的作用:关联默认打开它的应用程序
*    应用程序如何识别文件类型:每个文件都有魔数(自我介绍)
* 文件分类:
*    文本(ASCII)文件:人能直接识别的文档,一般需要转换.例如txt,cpp,word等
*        在记事本中看到的1实际是字符'1',这就是视图操作系统做的转换
*    二进制文件:音乐,视频,图片,可执行程序.不做任何转换直接把内存的数据保存到文件
*    例如12345->文本文件 '1''2''3''4''5' 一共5个字节
*           12345->二进制文件.数字12345,一共4字节(整数)
* 文件操作函数:
*    文件操作最容易出错的地方:文件路径错误,'\'在C语言中表示转义字符,例如'\n'
         如果需要'\'本身,必须写成'\\'
      路径:绝对路径,例如 "D:\\1.txt"
              相对路径,例如 "1.txt"这个文件在当前(本项目)文件夹中
*    文件指针:打开的文件唯一标识符,以后再进行操作这个文件都是通过这个文件指针.类似学号
*    fopen:打开或者创建文件.失败返回NULL,每次打开文件后都要判断返回值
         "r":读打开,文件必须存在
          "w":写打开,如果文件不存在则创建,如果存在则删除原内容再打开,总之是打开新文件
          "a":
          "b":二进制打开
*    fclose:关闭文件
*    fwrite:写文件,把内存的数据写到文件. 保存文档
*    fread:读文件,把文件的数据读到内存.阅读文档
*        fread返回读取成功的项目数,这个非常重要
*    fseek:
*    ftell:
*/

//创建文件
//int main()
//{
//    //const char* s = "D:\QQMusic\周杰伦";//错误
//    //const char* s = "D:\\QQMusic\\周杰伦";//ok
//    //printf("%s\n",s);
//    FILE *fw = fopen("D:\\1.txt","w");
//    assert(fw != NULL);
//
//    fclose(fw);
//    return 0;
//}

//写文本文件
//int main()
//{
//    FILE *fw = fopen("D:\\1.txt","w");
//    assert(fw != NULL);
//    const char* str = "hello world";
//    fwrite(str, sizeof(char), strlen(str), fw);//ok,文件不需要'\0','\0'是字符串的结尾标记,文件不需要
//    //fwrite(str,sizeof(char),strlen(str)+1, fw);//有问题
//    fclose(fw);
//    return 0;
//}

//写二进制文件
//int main()
//{
//    FILE *fw = fopen("D:\\1.txt","wb");
//    assert(fw != NULL);
//    int num = 12345;//数字直接写到文件中是不能查看的
//    fwrite(&num, sizeof(int), 1, fw);
//    fclose(fw);
//
//    return 0;
//}

//读文本文件
int main()
{
    //FILE* fr = fopen("D:\\2\\2.txt","w");//error,路径不对
    FILE* fr = fopen("D:\\1.txt", "r");
    assert(fr != NULL);
    char buf[100];
    int len = fread(buf,sizeof(char), 100, fr);//不能写11,100是容量
    printf("%d\n%s\n",len,buf);//乱码 ???

    fclose(fr);
    return 0;
}

#define _CRT_SECURE_NO_WARNINGS//必须放在第一行
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
/*
* printf,sprintf,fprintf
* 文件处理:
*    fopen:打开或者创建文件.失败返回NULL,每次打开文件后都要判断返回值
         "r":读打开,文件必须存在
          "w":写打开,如果文件不存在则创建,如果存在则删除原内容再打开,总之是打开新文件
          "a":
          "b":二进制打开
*    fclose:关闭文件
*    fwrite:写文件,把内存的数据写到文件. 保存文档
*    fread:读文件,把文件的数据读到内存.阅读文档
*        fread返回读取成功的项目数,这个非常重要
*    fseek: 移动文件位置标记指针(光标)
*    ftell:返回文件位置指针当前的位置,当前位置到文件开头的字节数
* sprintf:格式化数据到指定字符串,非常重要和常用的一个函数
*/

//int Getint()
//{
//    //失败返回什么?
//    if (true)//失败
//        return -1;
//    return rand();//返回随机数
//}

//1.从键盘输入一行字符,将其中的小写字母全部转成大写字母,
//然后输出到一个文件中.
//int main()
//{
//    FILE* fw = fopen("1.txt","w");//相对路径
// assert(fw != NULL);
//    int ch;
//    while ((ch = getchar()) != '\n')//读取一行字符
//    {
//        if (islower(ch))
//            ch = toupper(ch);
//        fwrite(&ch,sizeof(char),1,fw);
//    }
//    fclose(fw);
//    return 0;
//}

//2.把int arr[10] = {123,2345,356,47,589,69,73,823,9546,1045};
//直接写到二进制文件"1.txt"中
//int main()
//{
//    FILE* fw = fopen("1.txt","wb");
//    assert(fw != NULL);
//    int arr[10] = { 123,2345,356,47,589,69,73,823,9546,1045 };
//    fwrite(arr,sizeof(int),sizeof(arr)/sizeof(arr[0]),fw);
//
//    fclose(fw);
//    return 0;
//}

//3.把上一题"1.txt"文件中的数据读取出来,打印到屏幕
//int main()
//{
//    FILE* fr = fopen("1.txt","rb");
//    assert(fr != NULL);
//
//    int arr[100];
//    int len = fread(arr,sizeof(int),100,fr);
//    for (int i = 0; i < len; i++)
//        printf("%d ",arr[i]);
//
//    fclose(fr);
//    return 0;
//}

//4.把int arr[10] = {123,2345,356,47,589,69,73,823,9546,1045};
//把数字转为字符,然后写到文本文件"2.txt"中
//int main()
//{
//    FILE* fw = fopen("2.txt","w");
//    assert(fw != NULL);
//    int arr[10] = { 123,2345,356,47,589,69,73,823,9546,1045 };
//    //printf("%d",arr[0]);//输出到屏幕
//    for(int i=0;i<sizeof(arr)/sizeof(arr[0]);++i)
//        fprintf(fw,"%d,",arr[i]);
//
//    fclose(fw);
//    return 0;
//}

//sprintf
//int main()
//{
//    int a = 100;
//    float b = 12.5;
//    double c = 34.5678;
//    //a->"100";b->"12.5";c->"34.5678"
//    char str1[10];//"100";
//    char str2[10];//"12.5"
//    char str3[10];//"34.5678"
//    /*printf("%d",a);
//    printf("\n");
//    printf("%.1f", b);
//    printf("\n");
//    printf("%.4f", c);
//    printf("\n");*/
//    sprintf(str1,"%d",a);//把格式化好的数据输出(保存)到指定的字符串
//    printf("str1=%s\n",str1);
//    sprintf(str2,"%.1f",b);
//    printf("我是字符串:%s\n",str2);
//    sprintf(str3,"%.4f",c);
//    printf("我是字符串:%s\n", str3);
//
//    return 0;
//}

//把src文件复制到des文件
void FileCpy(const char* des, const char* src)
{
    FILE* fr = fopen(src,"rb");
    FILE* fw = fopen(des,"wb");
    assert(fr!=NULL && fw!=NULL);

    char buf[1024];//1k
    int len;
    while ((len = fread(buf, sizeof(char), 1024, fr)) > 0)
    {
        fwrite(buf,sizeof(char),len,fw);
    }

    fclose(fr);
    fclose(fw);
}
//int main()
//{
//    FileCpy("D:\\2.cpp","D:\\1.cpp");
//    FileCpy("D:\\2.mp4","D:\\1.mp4");
//    return 0;
//}

//利用fseek支持随机读写
//int main()
//{
//    FILE* fr = fopen("D:\\1.txt","r");
//    char buf[100] = "";
//    int len = fread(buf,sizeof(char),100,fr);
//    printf("%d,%s\n",len,buf);
//
//    //fseek(fr,0,SEEK_SET);//移到文件的开头
//    //fseek(fr,-len , SEEK_CUR);
//    fseek(fr, -len,SEEK_END);
//    //把hello world重新读到buf2
//    char buf2[100] = "";
//    int len2 = fread(buf2, sizeof(char), 100, fr);
//    printf("%d,%s\n", len2, buf2);
//
//    fclose(fr);
//    return 0;
//}

//求文件大小
__int64 FileSize(const char* path)
{
    FILE* fr = fopen(path,"r");
    assert(fr != NULL);
    //把位置指针移到文件的末尾处
    fseek(fr,0,SEEK_END);
    return _ftelli64(fr);
}

//int main()
//{
//    printf("%lld\n",FileSize("D:\\1.txt"));//11
//    printf("%lld\n", FileSize("D:\\2.cpp"));//3941
//    printf("%lld\n", FileSize("D:\\1.mp4"));
//
//    return 0;
//}


/*作业:
* 测试文件操作和内存操作的时间
*  1.在内存中生成0.8G的数据(动态内存+随机函数)
*   2.把这0.8G的数据复制到内存的另一个数组中,并统计时间
*   3.把这0.8G的数据写到文件,并统计时间
*   4.把2种时间截图发到群里,并给出倍数的结论
*/
#define NUM (800000000/sizeof(int))
int main()
{
    int* arr = (int*)malloc(NUM*sizeof(int));
    int* brr = (int*)malloc(NUM * sizeof(int));
    assert(arr!=NULL && brr!=NULL);
    getchar();

    return 0;
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值