Ошибка получения правильного текста после нажатия, а затем получения front () из std :: queue - PullRequest
0 голосов
/ 11 ноября 2010

У меня небольшая проблема ... Сначала я начну с требований:

  1. Попробуйте отправить данные (сообщения) на сервер
  2. В случае сбоя сохраните его в локальном файле на жестком диске в виде списка записей CSV
  3. Попробуйте отправить данные сообщения на сервер в какой-то заранее заданной точке.
  4. Если сообщение успешно отправлено, удалите его из файла
  5. Продолжайте процесс, пока отправка данных на сервер не удастся. и перейдите к шагу 2

Что я сделал:

  1. Использовал объект fstream для записи неудачных сообщений в локальный файл
  2. Использовал объект fstream для чтения из этого файла и сохранения в динамически создаваемом std :: queue
  3. Для каждого сообщения, прочитанного из файла, поместите его в очередь
  4. После отправки всех сообщений, возьмите первое сообщение с помощью std :: front () и прочитайте его в структуре данных пользовательского объекта.

Проблема в следующем: Я печатаю сообщения, прочитанные из файла на жестком диске, до и после помещения его в очередь. Прежде чем выдвинуть очередь, данные, которые я печатаю в журналах messageBox / text, абсолютно в порядке. Но когда я печатаю те же данные после получения очереди: front () он печатает весь мусор. *

Я не эксперт по очередям и STL, поэтому мне нужна направляющая рука.

Код выглядит следующим образом:

<code> 
    class CDFCQueueMsgs
    {
    public:
        char chDFCMsg_1;
        char chDFCMsg_2;
        char chDFCMsg_3;
        char chDFCMsg_4;
        char chDFCMsg_5;
    };
// This is how I created the fstream obj to read the file
    fstream_IOData_Read.open(pChPersistingFileLocation, ios::in);</p>

<p>// The CSVs that I write to and read back from the file are like:
// 1111222233334444,1234,05,0011123456,20100102112233,1234567890,7,N</p>

<p>// Given below is how I write to the file:
void CDataQueueingAndPersisting::WriteQueueMsgsToFile(char *pchAppendMsgToPersistentFile)
{
    char chWriteBuffer[512] = {0};
    fstream_IOData_Write.flush();
    sprintf(chWriteBuffer, "%s\r\n", pchAppendMsgToPersistentFile);
    if(NULL != pchAppendMsgToPersistentFile) fstream_IOData_Write.write(chWriteBuffer,strlen(chWriteBuffer));
}</p>

<p>// Given below is how I read from the file:
    while(fstream_IOData_Read >> chSingleDFCMsg)
    {
        bDataRead = ReplicateQueueInProcessMemory( (BYTE*) chSingleDFCMsg);
        RtlZeroMemory(chSingleDFCMsg, sizeof(chSingleDFCMsg));
    }</p>

<p>// ReplicateQueueInProcessMemory is like:
    pChDelimitedStrPtr = strtok((char *)byteSingleRawQueueMsg, ",");</p>

<p>// to read every comma delimited field in the single line as shown above. I use multiple strtok()s to read all the fields of the string.</p>

<p>// After this I get the front message in the queue:
        CDFCQueueMsgs oDfcQueueMsg_TopMsg;
        CDFCQueueMsgs & refDfcQueueMsg_TopMsg = oDfcQueueMsg_TopMsg;
        refDfcQueueMsg_TopMsg = *oCDataQueueingAndPersisting.poDFCMsgQUEUE.front();</p>

<p>// Now I get the respective member fields to the object type the queue holds:
        strncpy(g_chBuffer, refDfcQueueMsg_TopMsg.chDFCMsg_1, sizeof(refDfcQueueMsg_TopMsg.chDFCMsg_1));</p>

<p>// Now I Log the "g_chBuffer" variable in my log files. I also log each field in my logs:
/*
Before Pushing into queue, I log the string from the read buffer, the fields get logged fine like this:
09:50:45:093 EVENT: chDFCMsg_1:1111222233334444
chDFCMsg_2:1234
chDFCMsg_3:05
chDFCMsg_4:0011123456
chDFCMsg_5:20100102112233</p>

<p>After pushing and gettting the Queue::front() I see the same fields like this:
10:45:54:495 EVENT: 2<code>ÃÛ¬S
10:45:54:495 EVENT: ¬S
10:45:54:495 EVENT:</code>á
10:45:54:495 EVENT: 
10:45:54:495 EVENT: 
*/</p>

<p>

Спасибо, Daniel

Ответы [ 2 ]

1 голос
/ 12 ноября 2010

что такое содержимое oCDataQueueingAndPersisting? (Особенно тип poDFCMsgQUEUE)

Если я прав: * Я думаю, что это на самом деле очередь указателей, а не очередь данных. * это означает, что память, на которую указывает poDFCMsgQUEUE.front (), не очень хорошая.

Например, вы не можете сделать это:

void function1()
{
  myItem i;
  myQueueOfPointer.push(&myItem)
}

void main()
{
  function1()
  cout << myQueueOfPointer.front() // error
}

В этом случае myItem уничтожается после возврата из функции1. Таким образом, адрес в myQueueOfPointer :: front () по-прежнему не указывает ни на что (память, которая может использоваться другой функцией и т. Д.). Вот почему вы печатаете кусок мусора во второй печати. Первый был успешным, потому что память еще не была перезаписана другой частью вашей программы.

PS:

Как мы все и просили, вы не разместили часть, в которую вы помещаете элемент в очередь. Я скажу вам в последний раз, но если вы не опубликуете это, мы не сможем вам помочь (даже наоборот, ваш пост будет опровергнут).

Совет на будущее (если вы хотите эффективно использовать этот сайт):

  • Представьте, что у вас проблемы (все было в порядке)
  • Вставьте исходный код вашей проблемы
    • Хорошо с отступом и структурированным (как я делал в этом посте)
    • Если это сложно: максимально сократить исходный код (только с интересной частью)

Надеюсь, это поможет вам

0 голосов
/ 11 ноября 2010

std :: queue :: front получает значение первой записи или ее ссылку.

Так твой код:

CDFCQueueMsgs oDfcQueueMsg_TopMsg;
CDFCQueueMsgs * poDfcQueueMsg_TopMsg = & oDfcQueueMsg_TopMsg;
poDfcQueueMsg_TopMsg = oCDataQueueingAndPersisting.poDFCMsgQUEUE.front();

должно быть:

// take the reference of the queue::front in oDfcQueueMsg_TopMsg 
CDFCQueueMsgs& oDfcQueueMsg_TopMsg;
oDfcQueueMsg_TopMsg = oCDataQueueingAndPersisting.poDFCMsgQUEUE.front();

или

// copy the queue::front() into oDfcQueueMsg_TopMsg
CDFCQueueMsgs oDfcQueueMsg_TopMsg;
oDfcQueueMsg_TopMsg = oCDataQueueingAndPersisting.poDFCMsgQUEUE.front();
...