Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Асмик Александровна
Статус: Академик
Рейтинг: 7815
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2638
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2322
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1660
Дата выхода:24.04.2011, 18:30
Администратор рассылки:Киселёва Алёна aka Verena (Профессор)
Подписчиков / экспертов:318 / 183
Вопросов / ответов:1 / 1

Вопрос № 182891: Здравствуйте! Прошу помощи в следующем вопросе: Имеется элемент очереди (дисциплина обслуживания FIFO): struct Queue { char * data; //указатель на данные Queue * next; //указатель на следующий элемент очереди } * begin; //ук...



Вопрос № 182891:

Здравствуйте! Прошу помощи в следующем вопросе:
Имеется элемент очереди (дисциплина обслуживания 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); – функция читает значения элементов из файла и создает очередь

Возникла проблема с ReadQueue. Прошу вашей помощи. Мой код ниже, но там что-то не то(

Отправлен: 19.04.2011, 17:55
Вопрос задал: katbka (1-й класс)
Всего ответов: 1
Страница вопроса »


Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, katbka!
Вот... Думаю, разберетесь самостоятельно...
Код:
// Lab4.cpp : Defines the entry point for the console application.
//

#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*);
int Count(Queue**);
void WriteQueue(char * fname, Queue * pque);
Queue * ReadQueue(char * fname);

int main(int argc, char* argv[])
{
locale::global(locale("russian_russia.866"));

Queue* begin = NULL;

char* y = (char*)calloc(10,sizeof(char));
strcpy(y,"fg");
Put(&begin,y);

char* y1 = (char*)calloc(10,sizeof(char));
strcpy(y1,"vdc");
Put(&begin,y1);

wcout << L"Изначальная очередь" << endl;
PrintQueue(begin);

cout << "Write struct to .\\date.txt ..." << endl;
WriteQueue(".\\date.txt", begin);

cout << "Read struct from .\\date.txt ..." << endl;
Queue *que2 = ReadQueue(".\\date.txt");

wcout << L"Считанная очередь" << endl;
PrintQueue(que2);

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(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,size of(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->dat a;
*queue = tmp1->next;
return tmp;
}
}

void PrintQueue(Queue* queue) // вывод на экран содержимого очереди
{
while(queue)
{
cout << queue->data << endl;
queue = queue->next;
}
}

int Count(Queue** queue) // количество элементов
{
Queue* tmp1 = *queue;
int tmp = 0;
while(tmp1)
{
tmp = tmp + 1;
tmp1 = tmp1->next;
}
return tmp;
}

-----
Люби своего ближнего, как самого себя

Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
Ответ отправлен: 19.04.2011, 19:29
Номер ответа: 266767
Украина, Кировоград
Тел.: +380957525051
ICQ # 234137952
Mail.ru-агент: igorlyskov@mail.ru

Оценка ответа: 5

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 266767 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное