使用C#

时间:2018-07-23 14:05:34

标签: c# qt io qdatastream

我正在尝试使用QT application读取从QDataStream创建的现有文件,我正在使用C#进行读取,但无法进行工作。

这是我用于读取文件的C#代码:仅空白的MessageBox就没有错误。

如何使用C#读取QDataStream在QT中创建的文件?

    FileStream readStream;
    string msg = null;
    try {
        readStream = new FileStream(@"C:/MyUsers/SomeFolder/UserNameList.txt", FileMode.Open);
        BinaryReader readBinary = new BinaryReader(readStream);
        msg = readBinary.ReadString();
        MessageBox.Show(msg);
        readStream.Close();
    }
    catch (Exception ex) {
        MessageBox.Show(ex.ToString());
    }

这是用于在QT中写入文件的代码。

   QFile UsersNameListFile ("C:/MyUsers/SomeFolder/UserNameList.txt");        
    QString userName = "SomeName";

    QHash<QString, QString> listOfUsers;

    if(!listOfUsers.contains(userName))
    {
        listOfUsers.insert(userName, "Some Text");

        if (UsersNameListFile.open(QIODevice::WriteOnly))
        {
            QDataStream writeToFile(&UsersNameListFile);
            writeToFile.setVersion(QDataStream::Qt_5_1);
            writeToFile << listOfUsers;

            UsersNameListFile.flush();
            UsersNameListFile.close();
        }
    }

1 个答案:

答案 0 :(得分:0)

这不是真正的解决方案,评论太久了。

正如其他人在对您的问题的评论中所指出的那样,QDataStream使用不应被固定的格式。 QDataStream提供了一种方法来设置所使用格式的版本,以确保不同Qt版本之间的向后兼容性,但不幸的是,Qt文档缺少每个版本的详细信息。

这里version 13是官方文档上当前可用的版本。这不是最新的事件,这个文档页面只是很少更新。

无论如何,如果您足够幸运,即您正在使用版本13或QHash和QString的格式与当前使用的版本相同,则应该有一个以无符号int 32开头的文件,该整数表示哈希图中的元素数量,然后每对有两个QString,每个QString再次表示为unsigned int 32,表示字符串的大小,然后表示为以UTF16编码的字符数组。空或空字符串存储为0xFFFFFFFF。

类似这样的东西:

HASH_MAP_COUNT,4个字节,读为unsigned int 32,告诉您有多少个键,值对

FIRST_STRING_KEY,4字节,uint 32,告诉您此密钥多长时间

FIRST_STRING_KEY_DATA,读取为UTF16字符

FIRST_STRING_VALUE,4字节,uint 32,告诉您该值多长时间

FIRST_STRING_VALUE_DATA,读取为UTF16字符

以此类推...

您可以尝试按照这种格式在C#中实现阅读功能,如果仍然无法阅读任何内容,请尝试困难的方法,并检查QDataStream& operator<<(QDataStream &out, const QHash<Key, T> &hash)的具体版本qt的实现使用。您应该可以在qdatastream.cpp文件中找到它。

希望这会有所帮助。