The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Запутался со списками. Помогите"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Запутался со списками. Помогите"  
Сообщение от ligurio (??) on 15-Янв-07, 15:49 
Товарищи, помогите с прогой.
Она компилится, но со списками я что-то не так сделал и она выводит не то что надо. Суть такая: читаем файл, каждую строку заносим в список. Потом его печатаем.


Вот сам исходник:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define COUNT 30
#define FILE_LOG "./pingpong.log"
#define FILE_STATISTICS "./pingpong.conf"
#define DELIMITER "#"
#define OFFLINE "-"
#define ONLINE "+"
#define UNKNOWN "?"

//------------------------------
typedef struct Node *link;
typedef char elemtype;
typedef struct Node
{
elemtype elem;
link next;
} node;
typedef link list;
list lst;
//------------------------------

struct ping {
char *ip;
char *stat;
char *lastonline;
};

void printhost(ping& h)
{
printf("Printf all hosts:\n");
printf("%s\t", h.ip);
printf("%s\t", h.stat);
printf("%s\t\n", h.lastonline);
};

/* Shift string to one symbol*/
char* shift(char *s)
{
int length = strlen(s);
int i;
char *ns;
*s++;
for(i=0; i<length; ) ns[i++] = *s++;
//printf("Result - %s\n", ns);
return ns;
};

struct record {
ping host;
record *prev;
record *next;
};
int main()
{
FILE *log;
FILE *statistics;
record *begin = NULL,
*last = NULL,
*list;
if ((statistics = fopen(FILE_STATISTICS,"r")) == NULL)
fprintf(stderr, "Error during open file - ", FILE_STATISTICS);
else
{
char *bf = (char*)malloc(sizeof(char));
char *b = (char*)malloc(sizeof(char));
//int i = 0;
while(!feof(statistics))
{
if((bf = fgets(b,512,statistics)) != NULL )
while(bf)
{
//printf("%s\n", strsep(&bf,"#"));
//printf("%s\n", strsep(&bf,"#"));
//printf("%s\n\n", strsep(&bf,"#"));
last = (record*)malloc(sizeof(record));
last->host.ip = strsep(&bf, "#");
last->host.stat = strsep(&bf, "#");
last->host.lastonline = strsep(&bf, "#");
if(begin == NULL)
{
last->prev = NULL;
begin = last;
last->next = NULL;
}
else
{
list = begin;
while(list)
{
if(list->next == NULL)
{
last->next = NULL;
last->prev = list;
list->next = last;
//printf("Host.ip - %s\n", list->host.ip);
break;
}
list = list->next;
}
}
//printf("%s\t", last->host.ip);
//printf("%s\t", last->host.stat);
//printf("%s\t\n", last->host.lastonline);
}
};

free(bf);
free(b);
};

// print all list
list = begin;
while(list)
{
/*printf("%s\t", list->host.ip);
printf("%s\t", list->host.stat);
printf("%s\t\n", list->host.lastonline);*/
printhost(list->host);
list = list->next;
};

//printf("%s\n", shift("SergeyB"));
free(begin);
free(last);
free(list);
};

Читаем файл такой:

192.168.1.11#1#19.11.2006 15:23:23
192.168.1.17#1#19.11.2006 17:35:35
192.168.1.7#1#19.11.2006 18:17:17
192.168.1.254#1#18.10.2006 17:12:18

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Запутался со списками. Помогите"  
Сообщение от ACCA (ok) on 15-Янв-07, 22:58 
[...]
>char *bf = (char*)malloc(sizeof(char));
>char *b = (char*)malloc(sizeof(char));

Выделил по 1 байту, указатели запомнил.


[...]
>if((bf = fgets(b,512,statistics)) != NULL )

Записал до 512 байтов по адресу, который указывает на буфер длиной 1 байт. Запахал память и, возможно, стек.


Начни с примера попроще - заведи буфер в стеке (без malloc), читай и выводи на экран файл построчно с помощью fgets/puts.

Потом усложни задачу - выводи только второе и третье поле, найденные с помощью strsep.

Потом можно будет перейти к спискам.

P.S.
Задача скорее всего решается с помощью shell. C и списки не нужны.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Запутался со списками. Помогите"  
Сообщение от ligurio (??) on 16-Янв-07, 11:08 
>Потом усложни задачу - выводи только второе и третье поле, найденные с
>помощью strsep.
>
>Потом можно будет перейти к спискам.
>
>P.S.
>Задача скорее всего решается с помощью shell. C и списки не нужны.
>


спасибо, я попробую. Можно и с помощью shell или perl. Но я хотел понять списки.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Запутался со списками. Помогите"  
Сообщение от NuINu (??) on 16-Янв-07, 11:28 
>хотел понять списки.
А со списками у тебя все нормально ;-))
ты простно не знаешь где и зачем выделяешь память, ну и так же где ее освобождать.

А так же особое внимание обрати на форматирование своего исходного текста, и размещение определений дефайнов, структур, переменных, не смешивай их, и выполняй в одном месте.

Вообщем смотри:
-------------------------
#include <stdlib.h>
#include <stdio.h>
#include <string.h>


#define COUNT               30
#define FILE_LOG            "./pingpong.log"
#define FILE_STATISTICS     "./pingpong.conf"
#define DELIMITER           "#"
#define OFFLINE             "-"
#define ONLINE              "+"
#define UNKNOWN             "?"
#define MAX_LEN_STR         512

//------------------------------
/*typedef struct Node *link;
typedef *char elemtype;
typedef struct Node
{
   elemtype elem;
   link next;
} node;
typedef link list;
*/

struct ping {
  char *ip;
  char *stat;
  char *lastonline;
};

struct record {
   struct ping    host;
   struct record *prev;
   struct record *next;
};

//------------------------------
//list lst;


void printhost(struct ping  *h)
{
   printf("%s\t", h->ip);
   printf("%s\t", h->stat);
   //printf("%s\t\n", h->lastonline);
   printf("%s", h->lastonline);
};

/* Shift string to one symbol*/
char* shift(char *s)
{
  int   length = strlen(s);
  int   i;
  char *ns = s;
  *s++;
  for(i=0; i<length; ) ns[i++] = *s++;
  //printf("Result - %s\n", ns);
  return ns;
};


int main()
{
   FILE   *log;
   FILE   *statistics;
   struct record
          *begin = NULL,
          *last  = NULL,
          *list;
   char   *b,
          *bf;

   if ((statistics = fopen(FILE_STATISTICS,"r")) == NULL)
     fprintf(stderr, "Error during open file - ", FILE_STATISTICS);
   else    {
    /*char *bf = (char*)malloc(sizeof(char));*/
      //int i = 0;
    while(!feof(statistics))  {
       b = (char*)malloc((MAX_LEN_STR+1)*sizeof(char));
       if((bf = fgets(b,MAX_LEN_STR,statistics)) != NULL )
          while(bf)  {
             //printf("%s\n", strsep(&bf,"#"));
             //printf("%s\n", strsep(&bf,"#"));
             //printf("%s\n\n", strsep(&bf,"#"));
             last = (struct record*)malloc(sizeof(struct record));
            
             last->host.ip = strsep(&bf, "#");
             last->host.stat = strsep(&bf, "#");
             last->host.lastonline = strsep(&bf, "#");
             if(begin == NULL)
             {
                 last->prev = NULL;
                 begin = last;
                 last->next = NULL;
             }
             else
             {
                 list = begin;
                 while(list) {
                    if(list->next == NULL)
                    {
                       last->next = NULL;
                       last->prev = list;
                       list->next = last;
                          //printf("Host.ip - %s\n", list->host.ip);
                       break;
                    }
                    list = list->next;
                 }
             }
              //printf("%s\t", last->host.ip);
              //printf("%s\t", last->host.stat);
              //printf("%s\t\n", last->host.lastonline);
          }
    };

    //free(bf);
    //free(b);
   };

       // print all list

   printf("Printf all hosts:\n");
   list = begin;
   while(list)
   {
       /*printf("%s\t", list->host.ip);
       printf("%s\t", list->host.stat);
       printf("%s\t\n", list->host.lastonline);*/
       printhost(&(list->host));
       list = list->next;
   };

      //printf("%s\n", shift("SergeyB"));
  /*
   free(begin);
   free(last);
   free(list);
   */
  
   list = begin;
   while(list)
   {
       last = list;
       list = list->next;
       free((*last).host.ip);
       free(last);
   };

};
---------------------------------

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Запутался со списками. Помогите"  
Сообщение от NuINu (??) on 16-Янв-07, 12:07 
мда, работа с такими функциями черевата множеством ошибок, и лучше использвать стандартные функции и библиотеки которые уже отлажены, вот я например, в проге, которая вообщем то работает допустил одну ошибку %-)(при выделении/освобождении памяти)

А заметить ее можно только если запускать отладку памяти.
#include <mcheck.h>

можешь попытаться эту ошибку найти ;-)) за одно и научишься отлаживать выделение памяти.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру