Консультация № 183113
10.05.2011, 23:34
0.00 руб.
13.05.2011, 00:21
0 5 1
Здравствуйте! Прошу помощи в следующем вопросе:
Имеется элемент очереди (дисциплина обслуживания FIFO):
struct Queue
{
char * data; //указатель на данные

Queue * next; //указатель на следующий элемент очереди

} * begin; //указатель на начало очереди
функции
void Put(Queue** queue, char* data); // поместить данные в конец очереди;
char* Get(Queue** queue); // извлечь данные из начала очереди (при этом элемент удаляется из очереди);
void PrintQueue(Queue* queue); // вывод на экран содержимого очереди.
void WriteQueue(char * fname, Queue * pque); – функция записывает элементы очереди в файл;
Queue * ReadQueue(char * fname); – функция читает значения элементов из файла и создает очередь
оформить в виде библиотеки DLL;
создать новый проект для демонстрации работы с DLL и функциями;
необходимо использовать динамическое связывание без импорта
при динамическом связывании необходимо в проекте с главной программой объявить указатели на функции, содержащиеся в DLL.
Вот сами функции
[code h=200]
#include "stdafx.h"
#include <Windows.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <locale>
#include <iostream>

using namespace std;

struct Queue
{
char * data; //указатель на данные
Queue * next; //указатель на следующий элемент очереди
} * begin; //указатель на начало очереди

void Put(Queue**, char*);
char* Get(Queue**);
void PrintQueue(Queue*);
void WriteQueue(char * fname, Queue * pque);
Queue * ReadQueue(char * fname);

int main(int argc, char* argv[])
{

return 0;
}

void WriteQueue(char * fname, Queue * pque)// функция записывает элементы очереди в файл
{
DWORD dwWrBytes;

HANDLE myFile = CreateFile(LPCTSTR(fname), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);

if (myFile == INVALID_HANDLE_VALUE)
{
cout << "Open file for writing failed\n";
exit(1);
}

while(pque)
{
DWORD size = strlen(pque->data)+1;
WriteFile(myFile, &size, sizeof(DWORD),&dwWrBytes, NULL);
WriteFile(myFile, pque->data, size, &dwWrBytes, NULL);
pque = pque->next;
}

CloseHandle(myFile);
}

Queue * ReadQueue(char * fname)// функция читает значения элементов из файла и создает очередь
{
DWORD dwRdBytes;
DWORD size;
char* y;

Queue *ReadQueue = NULL;
HANDLE myFile = CreateFile(LPCTSTR(fname), GENERIC_READ, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

if(myFile == INVALID_HANDLE_VALUE)
{
puts("Open file for reading failed\n");
exit(1);
}

y = (char*)calloc(10,sizeof(char));
while(1)
{
ReadFile(myFile, &size, sizeof(DWORD), &dwRdBytes, NULL);
if (dwRdBytes == sizeof(DWORD))
{
ReadFile(myFile, y, size, &dwRdBytes, NULL);
if (dwRdBytes)
{
Put(&ReadQueue,y);
}
else
break;
}
else
break;
}
free(y);
CloseHandle(myFile);
return ReadQueue;
}
void Put(Queue** queue, char* data)// поместить данные в конец очереди
{
Queue* que1 = (Queue*)calloc(1,sizeof(Queue));
que1->data=(char*)malloc(strlen(data)+1);
strcpy(que1->data,data);

Queue* tmp=*queue;
if(!tmp)
*queue=que1;
else
{
while(tmp->next)
tmp = tmp->next;
tmp->next=que1;
}
}
char* Get(Queue** queue) // извлечь данные из начала очереди (при этом элемент удаляется из очереди)
{
Queue* tmp1 = *queue;
char* tmp;
if(!tmp1)
{
return 0;
}
else
{
tmp = tmp1->data;
*queue = tmp1->next;
return tmp;
}
}
void PrintQueue(Queue* queue) // вывод на экран содержимого очереди
{
while(queue)
{
cout << queue->data << endl;
queue = queue->next;
}
}

[/code]

Еще есть мои попытки.. но как прикрепить проект к вопросу-не знаю...

Обсуждение

давно
Посетитель
7438
7205
11.05.2011, 00:22
общий
как прикрепить проект к вопросу-не знаю
Есть два способа. Сначала сархивируйте. Затем:
1) и в вопросе, и в мини-форуме есть режим "Прикрепить"...
2) загрузите файл на сервер, воспользовавшись кнопкой "мои файлы" на главной странице. Затем, при помощи кнопочки
на панели как в вопросе, так и в мини-форуме вставляете ссылку на файл.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
11.05.2011, 14:57
общий
В общем же разобралась сама)
в прикрепленных файлах то что у меня вышло.
Прикрепленные файлы:
1ef1f95c8995a91778ef7aa8121cdb03.rar
давно
Посетитель
7438
7205
12.05.2011, 00:03
общий
Вот и умничка!
Только вот у меня есть один вопросик: файл создается с именем date.txt? Или непонятно с каким?
В DLL у Вас есть нехороший момент: Вы передаете имя файла, как ANSI-строку, а вызываете CreateFile(LPCTSTR(fname),...), по-умолчанию вызывается CreateFileW и LPCTSTR означает UNICODE-сроку
Сделайте в WriteQueue так:
Код:

HANDLE myFile = CreateFileA(fname, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
И, аналогично, в подпрограме чтения
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
12.05.2011, 20:56
общий
Адресаты:
с непонятно каким
Спасибо за замечание, исправила) теперь все нормально)
давно
Посетитель
7438
7205
13.05.2011, 00:20
общий
это ответ
Здравствуйте, katbka!
Вы самостоятельно справились с задачей - молодец
Единственная ошибка: файл создается с "неправильным" именем, а не date.txt, как предполагалось.
Дело в том, что в DLL у Вас есть нехороший момент: Вы передаете имя файла, как ANSI-строку, а вызываете CreateFile(LPCTSTR(fname),...). По-умолчанию вызывается CreateFileW и LPCTSTR означает UNICODE-строку
Сделайте в WriteQueue так:
Код:

HANDLE myFile = CreateFileA(fname, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
И, аналогично, в подпрограме чтения
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа