#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;
}