У меня небольшая проблема ... Сначала я начну с требований:
- Попробуйте отправить данные (сообщения) на сервер
- В случае сбоя сохраните его в локальном файле на жестком диске в виде списка записей CSV
- Попробуйте отправить данные сообщения на сервер в какой-то заранее заданной точке.
- Если сообщение успешно отправлено, удалите его из файла
- Продолжайте процесс, пока отправка данных на сервер не удастся. и перейдите к шагу 2
Что я сделал:
- Использовал объект fstream для записи неудачных сообщений в локальный файл
- Использовал объект fstream для чтения из этого файла и сохранения в динамически создаваемом std :: queue
- Для каждого сообщения, прочитанного из файла, поместите его в очередь
- После отправки всех сообщений, возьмите первое сообщение с помощью 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