读写文件时字符串存在多个文件终止符解决方法


写文件

我在Linux使用openssl库的DES算法进行文件的加解密时遇到一个问题。我从文件读取明文,然后加密为密文,最后将密文写入文件时发现文件写入的字节数量小于加密完的密文字节数,经过一番验证,发现是加密完的字符串中间包含文件终止符(-1),导致写入的时候遇到文件终止符提前结束了,所以只写入了部分内容。

错误写法:

1
2
3
4
5
std::string outText;//outText为输出的加密字符串 
QFile file(filename);
file.open(QFile::WriteOnly|QFile::Truncate);
file.write(outText.data());
file.close();

正确写法:

1
2
3
4
5
std::string outText;//outText为输出的加密字符串
QFile file(filename);
file.open(QFile::WriteOnly|QFile::Truncate);
file.write(outText.data(),outText.size());
file.close();

此处唯一的区别在于写入的指定写入的大小,这样就能将全部字符串写入文件。

读文件

将加密字符串存入文件之后,读取文件的内容也会遇到同样的问题,即文件读的时候遇到文件终止符会结束,导致读取的加密字符串不完整。这里我以c++的操作说明如何解决该问题。ifstream的 >>buf和getLine(buf)都会遇见文件终止符结束,所以我才有get()读取每一个字节,然后使用peek来判断是否结束,peek会预读文件指针下一个的内容。代码如下:

1
2
3
4
5
6
7
8
9
10
std::string srcText = "";
char temp;
QList<char> list;
while( in.peek()!=EOF){

in.get(temp);
list.push_back(temp);

}
srcText.assign(list.begin(),list.end());

最后还有一个关于“\0”的问题,我解密出来的字符串除了下列情况 “泰安\0\0\0”,于是我想将去掉‘\0’,我使用的是Qt的QString。

错误用法:

1
2
3
QString out="泰安\0\0\0";
out.replace("\0",""); //错误用法一,这种用法会将“\0”转化成一个QString
out.replace('\0',""); //错误用法二,这个会导致重载函数的调用出现歧义,出现编译错误

现象如下:

正确用法:

1
2
QString out="泰安\0\0\0";
out.replace(QChar('\0'),"");

读写文件时字符串存在多个文件终止符解决方法
http://yoursite.com/2019/03/21/读写文件时字符串存在多个文件终止符解决方法/
作者
还在输入
发布于
2019年3月21日
许可协议