【问题标题】:Qt, C++ - Reading control characters from a fileQt,C++ - 从文件中读取控制字符
【发布时间】:2013-05-08 22:54:29
【问题描述】:

这是我第一次提问,所以请耐心等待。

我正在尝试读取要发送到打印机的文本文件的内容。在定义标签打印方式的字符中间有控制字符、STX、SOH、CR、LF。 在我的示例中,我将读取文件的内容并将它们传递到内存中的数据结构(数组),将一些数据附加到其中,然后将其直接发送到打印机,擦除该结构中的数据。

执行此操作的函数如下:

void ClientThread::readFile2Structure(bool GoodOrBad)
{
    int i = 0;
    int j = 0;

    // Clean structure



    // here clean the structure

    // According to the name comes from the arguments.
    if(GoodOrBad == 1)
    {
        labelFile.setFileName(labelPathGood);
        //qDebug() << "Fez o set filepath" << labelPathGood;
    }
    else if(GoodOrBad == 0)
    {
        labelFile.setFileName(labelPathBad);
        //qDebug() << "Fez o set filepath" << labelPathBad;
    }

    if (!labelFile.open(QIODevice::ReadOnly))
    {
        qDebug() << "Unable to open label definition file PrinterGood.ini/PrinterBad.ini!";
        return;
    }
    else
    {
        while (!labelFile.atEnd())
        {
           temporaryStructure[i] = labelFile.readLine();
           i++;
        }

        // for debug purposes only!
        qDebug() << "Structure";

        for(j=0; j<=i; j++)
        {
            qDebug() << temporaryStructure[j];
        }
    }
}

数据结构有如下定义:QByteArraytemporaryStructure[50];

要发送的文件是: STX f259 CRLF SOH D STX L CRLF STX L CRLF D11 CRLF PC CRLF SC CRLF H25 CRLF 1W1c66000004100202000016036 CRLF

粗体数据为控制字符。

在我的控制台中,当我执行上面的函数时,所有的控制字符都显示为小方块,甚至没有出现CRLF。

为什么这些不同的控制字符显示为小方块,并且这些控制字符会随着复制到 QByteArray 数组而被修改?

我担心打印机什么也没有出来,我还没有一个可以测试的,FreeSerialPort Monitor 将是查看一切是否正确的方法。

感谢您的关注。

【问题讨论】:

  • 我不得不问:当打印不可打印的字符(那些 ascii 码小于 32 的字符)时,您希望看到什么?
  • 控制字符不出现,因为没有匹配字符显示;因此它只是打印一个小方块来显示那里有东西。至于 CRLF,它是一个回车后跟一个换行符,所以如果控制台以这种方式解释它们,我希望在下一行看到 CRLF 后面的字符。有时,某些控制台只需要 CR 或 LF 之一(不记得是哪个)。
  • @Merlin069 换行(即“\n”)是unix方式开始新行,回车+换行(“\r\n”) - 是windows方式。
  • @Amartel:我认为每个角色都有其价值的代表。我应该研究一下!谢谢
  • @Merlin069:我正在使用 Qt Creator(Win7),显然这是一个不支持它们的控制台。

标签: c++ qt controls character


【解决方案1】:

Unicode 有很多字符,据我所知,没有字体可以代表所有字符。未表示的字符(包括大多数不可打印的字符)使用特殊字形打印,最常见的是正方形。

回答您问题的第二部分 - QByteArray 包含原始数据,并且在复制时不会被修改。

为了删除 CR 和 LF,您可以使用:

byteArray.replace('\n', "");
byteArray.replace('\r', "");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 2012-02-04
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多