一、了解文件操作
这一节需要讲解一个非常重要的板块:文件操作。
在当今网络时代,什么价值最高?那当然就是数据了。
现代黑客,大多都是以钱为出发点的,而最值钱的,就是目标系统里面的资料,比如微软的windows
操作系统源码,就是不公开的,如果能搞到这玩意,它卖出的价格,大部分人应该一辈子都不愁了。
当然,那几乎是不可能的,回到本文,上面的内容只是为了让你明白文件操作的重要性,因为所有操作系统保存数据的方式,基本都是通过文件。
那么什么是文件呢?想来大家都是用过word或者记事本的,没错,这些软件主要的作用就是操作文件:
同样的,我们用VS写代码的时候,同样是在操作文件,唯一不同的可能就是它们似乎长得不一样?
看起来不一样的原因,是因为当我们安装软件时,该软件会向我们的电脑注册指定的后缀名。
如果你看不到这些后缀,如上图的.txt
,.docx
等,是因为你没有开启电脑文件管理器的对应功能,可以参考这篇文章打开:程序员必懂的常识
然后我们可以来到设置中的应用->默认应用
,然后分别搜索.txt
与.docx
,就会发现它们有两个默认的打开软件:
在我这里,.txt
文件默认用记事本打开,.docx
默认用wps打开,其它文件也是同理,因为系统默认将指定后缀名的文件用特定软件打开,所以该后缀名文件的图标也会由该软件所指定。
这也是为什么当你点击这个文件,系统知道用什么软件打开的原因。
如果你将该后缀名的默认应用删除了,你再点击这个文件就会发现已经打不开了,会让你重新选择一个应用打开。
但说到底它也只是个文件而已,比如用记事本打开这个1.docx
文件其实也一样可以!
只不过出现的是乱码而已,那么为什么是乱码呢?
这是因为每个软件是通过特定格式向文件写入数据的,如果你不按这样的格式去读,就会是乱码。
比如一段数据为“YYDS”,熟悉网络用语的人可能会理解它为“永远的神”,但不熟悉网络用语的人完全可以理解它为“永远单身”。
这就产生歧义了,在计算机里面,用错误的方式读取文件数据,就会出现上图所示的乱码。
这也就是为什么有逆向工程师的存在,逆向相关文章可以查看逆向基础。
二、代码中操作文件
既然是操作文件,那就得有操作文件的方法,一般而言,我们对文件的需求无非就两个:读、写。
但对于文件而言,我们还需要两个必要的步骤:打开、关闭。
想来这应该也不难理解,就和你操作电脑一样,操作之前你总得先打开电脑,操作结束之后一般都会合上电脑,或者直接关闭电脑。
所以总结下来就三个步骤:
- 打开文件
- 读写操作
- 关闭文件
你所有对文件的操作,都应该在打开文件与关闭文件之间进行。
1.C语言方式
知道了基本的步骤,我们就可以开始写代码了。
首先还是老步骤,解决方案中新建一个day4
的控制台空项目,将该项目设置为启动项,然后添加一个main.cpp
的源文件,代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
int main() {
FILE *f = fopen("1.txt", "w+"); //用读写模式打开1.txt文件
const char *wBuf="Hello world"; //要写入文件的字符串
fwrite(wBuf,1,12,f); //将wBuf指定的内容写入文件中
char rBuf[13]; //申请一块13字节的字符串数组,用于存字符
fseek(f, 0, SEEK_SET); //将文件指针移动到文件头部
fread(rBuf, 1, 12, f); //将文件中的字符读出来到rBuf中
fclose(f);
std::cout << rBuf << "\n"; //输出字符
}
运行结果:
然后找到我们代码中读写的1.txt文件:
打开文件1.txt:
就可以发现我们确实写进去了,下面开始解释上面各个操作的意思。
首先是代码中定义了一个宏,前面说过,一些函数被VS认为是不安全的,建议咱别用,但我们可以通过定义某些宏来告诉VS:我们就要用,你别管。