【问题标题】:C++Write specific data patterns into text file from RFID readerC++将特定数据模式从RFID阅读器写入文本文件
【发布时间】:2018-08-23 16:07:17
【问题描述】:

我成功地从阅读器获取数据并将其写入文本文件。

检测到的标签示例:4330-3031-3138-3031-2D32-2D31

但是,标签数据写入文本文件是这样的:

43

4330

4330-30

4330-3031

4330-3031-31

4330-3031-3138

4330-3031-3138-30

4330-3031-3138-3031

4330-3031-3138-3031-2D

4330-3031-3138-3031-2D32

4330-3031-3138-3031-2D32-2D

4330-3031-3138-3031-2D32-2D31

我尝试使用 if 语句 (count++) 将上面最长的最后一个值写入文本文件,但不知何故,即使变量保持其值,数据也不会写入文本文件。

Below are my codes:
{
// Format Tag and print on screen

void printTagData(TAG_DATA *pTagData)

{

    fstream myTextFile,myTextFile2, myTextFile3;

    string fileText,fileText2; 

    char  tagBuffer[1024] = {0,};

    char* pTagReportData = tagBuffer;

    int   index = 0;

     int count = 0;

    TCHAR   resultBuffer[MAX_PATH]; 

    for(index = 0; index < pTagData->tagIDLength; index++)

    {
         myTextFile.open("text1.txt",ios::app);

             if (0 < index && index % 2 == 0)

             {

                 *pTagReportData++ = '-';

             }

             sprintf(pTagReportData, "%02X", pTagData->pTagID[index]);

             while (*pTagReportData) pTagReportData++;

        stringstream ss;

        ss << tagBuffer;

        ss >> fileText;

        myTextFile << fileText << endl;

        myTextFile.close(); 

    }

    _stprintf(resultBuffer, TEXT("%S"), tagBuffer);


    SendDlgItemMessage(g_hDlg, IDC_INVENTORY_LIST, LB_ADDSTRING, 0, (LPARAM)resultBuffer);

    SendDlgItemMessage(g_hDlg, IDC_INVENTORY_LIST, WM_VSCROLL, (WPARAM)SB_BOTTOM, 0);

}

请随时给我任何提示/指导。 我是否应该编写另一个代码来提取与“4330-3031-3138-3031-2D32-2D31”匹配的模式并写入一个新的文本文件?

【问题讨论】:

  • 一个简单的解决方案是使用ios::out。但是你需要为每个标签创建一个新的文本文件。您可以尝试的另一件事是在循环外写信给myTextFile,只需一次。
  • 您的文件写入是否应该在您的for 循环中?我不确定stringstream 的意义是什么?您可以将tagBuffer 直接写入myTextFile
  • @Susmit Agrawal 感谢您的建议。我使用 ios::app 的原因是我想继续在文本文件中添加记录而不删除以前的记录(读者将继续阅读标签通过)。我之前曾尝试过该解决方案,但不知何故数据没有写入文本文件,这让我不知道如何处理它。
  • @Alan Birtles 嗨,艾伦,我尝试了您的建议,将文件写入从循环中移出,它可以工作!非常感谢大哥!顺便说一句,我正在使用 stringstream 并尝试使用它将 char 转换为 string 然后允许我写入文本文件,但现在我已经删除它仍然有效。

标签: c++ rfid


【解决方案1】:

这段代码非常复杂。我会做这样的事情(代码未经测试,为清楚起见省略了错误处理):

#include <stdio.h>

void printTagData (TAG_DATA *pTagData)
{
    FILE *f = fopen ("text1.txt", "wt");
    for (int i = 0; i < pTagData->tagIDLength; i++)
    {
         if (i > 0 && i % 2 == 0)
             fprintf (f, "-");
         fprintf (f, "%02X", pTagData->pTagID [i]);
    }

    fclose (f);
}

就是这样。

【讨论】:

  • 感谢您的回复,代码最初来自阅读器的SDK,这也让我感到困惑,我认为代码将在UI上显示检测到的标签。我试过你的方法,它以其他方式工作。仍然非常感谢帮助我。谢谢。
  • 所以我的代码能满足你的要求吗?如果是这样,请接受我的回答。如果不是那么请说为什么不。谢谢。
【解决方案2】:

您正在循环内打开并附加到文件,因此每次迭代都会得到一行。

相反,首先收集整个结果,然后将其写入文件。

这是一个更“不是 C,而是 C++”的版本:

#include <iomanip> // For 'setw' and 'hex'


void printTagData(TAG_DATA *pTagData)
{
    std::stringstream ss;
    for(int index = 0; index < pTagData->tagIDLength; index++)
    {
         if (0 < index && index % 2 == 0)
         {
             ss << '-';
         }
         ss << std::hex << std::setw(2) << pTagData->pTagID[index];
    }
    std::string tag = ss.str();
    std::ofstream myTextFile("text1.txt");
    myTextFile << tag << endl;

    TCHAR   resultBuffer[MAX_PATH]; 
    _stprintf(resultBuffer, TEXT("%S"), tag.c_str());
    SendDlgItemMessage(g_hDlg, IDC_INVENTORY_LIST, LB_ADDSTRING, 0, (LPARAM)resultBuffer);
    SendDlgItemMessage(g_hDlg, IDC_INVENTORY_LIST, WM_VSCROLL, (WPARAM)SB_BOTTOM, 0);
}

【讨论】:

  • 感谢兄弟的回复。我试过你的方法,但我不知道为什么它显示“命名空间 std 没有 setw(2) 的成员”。但我尝试过其他方法来克服这个问题。仍然非常感谢您的帮助。
  • @AhBoo 抱歉,我遗漏了您需要的 #include。我添加了它。 (您可以搜索this site 来确定要包含哪个标头来包含标准库内容。)
  • 没关系,伙计。感谢您的帮助,感谢您提醒我不要在问题下提出其他问题。我这样做是因为我是 Stack Overflow 的新手。很抱歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
  • 2014-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多