Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

Gray-Ice

个人博客兼个人网站

写这篇博文的前一分钟,我是处在自闭之中的。
那么先说说QDataStream是什么玩意儿吧,看名字也知道,这是一个流,那么其作用是什么呢?其作用就像fstream那样,是对文件进行操作的。只不过它不是以文本的形式把数据写入文件,而是以二进制的形式把数据写入文件的。就像C语言能够直接把结构体写入文件,读出来的还是个结构体一样,这个是能够把任意数据类型写入文件,然后只要按照对应的类型读取,都能够读出来。
那么先看把数据写入文件的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 创建QFile变量,将文件的路径传入
QFile fll("../new.txt");
// 以只写格式打开文件。如果打开失败则执行else
if(fll.open(QFile::WriteOnly))
{
// 让QDataStream对象明白自己要对哪个文件进行操作
QDataStream ds(&fll);
// 创建QString变量和int变量
QString qs("Hello");
int i = 1;
// 写入文件
ds << qs << i;
// 关闭QFile
fll.close();
}
// 如果文件打开失败则输出以下内容
else std::cout << "Open Error" << std::endl;

下面是读的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 传入QFile对象文件的路径
QFile fl("../new.txt");
// 以只读方式打开文件,如果失败执行else
if(fl.open(QIODevice::ReadOnly))
{
// 让QDataStream对象明白自己要对哪个文件进行操作
QDataStream ds(&fl);
// 创建QString类型的变量和int类型的变量,用于存储读取的数据
QString qs;
int i;
// 读取数据。先读取到qs,再读取到i
ds >> qs >> i;
// 打印数据
std::cout << qs.toUtf8().data() << std::endl;
std::cout << i << std::endl;
fl.close();
}
else
{
// 打开文件失败,输出提示内容
std::cout << "Read Error." << std::endl;
}

然后我们先执行写的代码,再紧接着执行读的代码,输出如下:

1
2
3
4
15:53:51: Starting /home/fire/codeSet/QtSet/build-untitled12-unknown-Debug/untitled12 ...
Hello
1
15:53:53: /home/fire/codeSet/QtSet/build-untitled12-unknown-Debug/untitled12 exited with code 0

可以看到,我们以什么格式写进去的,以什么格式读出来就会原样读取。
但是如果写的格式与读的格式不一样呢?
请看示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 写
QFile fll("../new.txt");
if(fll.open(QFile::WriteOnly))
{

QDataStream ds(&fll);
// QString qs("Hello");
int i = 1;
// 更改了这段代码!!!!!!!!
ds << "Hello" << i;
fll.close();
}
else std::cout << "Open Error" << std::endl;
//读取
QFile fl("../new.txt");
if(fl.open(QIODevice::ReadOnly))
{
QDataStream ds(&fl);
QString qs;
int i;
ds >> qs >> i;
std::cout << qs.toUtf8().data() << std::endl;
std::cout << i << std::endl;
fl.close();
}
else
{
std::cout << "Read Error." << std::endl;
}

这里我只更改了写的代码,读的代码还是以之前一样。
这是输出结果:

1
2
3
4
15:56:08: Starting /home/fire/codeSet/QtSet/build-untitled12-unknown-Debug/untitled12 ...
䡥汬漀
1
15:56:10: /home/fire/codeSet/QtSet/build-untitled12-unknown-Debug/untitled12 exited with code 0

因为QString和字符串字面量(其实这里的字符串字面量的真实面目并不是std::string,而是const char*类型的数组)的类型不同,所以读出来的也不同。关于为什么int类型能够正常读出来我也不知道。
本篇完。

评论



愿火焰指引你