Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск значений переменных внутри файла, Очень нужна помощь! 
V
    Опции темы
ReGeDiT
Дата 7.7.2006, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 4.7.2006
Где: Пущино на Оке

Репутация: нет
Всего: нет



ptr, т.е. получается что fscanf(fp,"[item %d]\n",&id); будет искать строчку [item ]? Если да, то это очень облегчит задачу))

новый код:
Код

/* Основной модуль...
** Проверка items.scp на правильность
*/
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>

FILE *fp, *lg;
int vl0=6, vl1=6, vl2=6, dif=6, i, nmb, id;
char st[99], nm[99], num[99];

void main(void)
{
lg = fopen("log.log","w+");
fprintf(lg,"IN : Item Number\nName : Item Name\nBP : Buy Price\nSP : Sell Price\nDF : Difference\n\n\n");
fclose(lg);
fp = fopen("items.scp","r");
do {
/**************************************************************************************************/
    fscanf(fp,"%s",&st);
/**************************************************************************************************/
    if (strncmp(st,"name=",5)==0)          {
    for (i=0;i<99;i++) { nm[i] = st[i]; };
    printf("%s\n",nm);                     };
/**************************************************************************************************/
    if (strncmp(st,"[item",5)==0)       {
    sscanf(st,"[item %d]\n",&id);
    printf("[item %d]-SS\n",id);
    fscanf(fp,"[item %d]\n",&id);
    printf("[item %d]-FS\n",id);
    /*vl0 = atoi(strstr(st,"m")+3);
    for (i=0;i<99;i++) { if (st[i]=='0') num[i]='0';
             if (st[i]=='1') num[i]='1';
             if (st[i]=='2') num[i]='2';
             if (st[i]=='3') num[i]='3';
             if (st[i]=='4') num[i]='4';
             if (st[i]=='5') num[i]='5';
             if (st[i]=='6') num[i]='6';
             if (st[i]=='7') num[i]='7';
             if (st[i]=='8') num[i]='8';
             if (st[i]=='9') num[i]='9';
               };
    nmb = atoi(num);
    printf("[item %d]\n",vl0);
    printf("[item %d]\n",nmb);*/
    printf("[item %d]\n",id);            };
/**************************************************************************************************/
    if (strncmp(st,"buyprice=",9)==0)   {
    vl1 = atoi(strstr(st,"=")+1);
    printf("buyprice=%d\n",vl1);        };
/**************************************************************************************************/
    if (strncmp(st,"sellprice=",10)==0) {
    vl2 = atoi(strstr(st,"=")+1);
    printf("sellprice=%d\n",vl2);
/**************************************************************************************************/
    dif = vl2-vl1;
/**************************************************************************************************/
    if (vl1==vl2) { printf("SELLPRICE == BUYPRICE! ADDED TO LOG!\n");
            lg = fopen("log.log","a");
            fprintf(lg,"SELLPRICE == BUYPRICE || ");
            fprintf(lg,"IN = %d %s BP = %d SP = %d DF = %d\n",vl0,nm,vl1,vl2,dif);
            fclose(lg);
          };
/**************************************************************************************************/
    if (vl2>vl1) { printf("SELLPRICE >> BUYPRICE! ADDED TO LOG!\n");
           lg = fopen("log.log","a");
           fprintf(lg,"SELLPRICE >> BUYPRICE || ");
           fprintf(lg,"IN = %d %s BP = %d SP = %d DF = %d\n",vl0,nm,vl1,vl2,dif);
           fclose(lg);
         };
                    };
/**************************************************************************************************/
    if (feof(fp)) { printf("All File Was Scanned [EOF]...\n");
            lg = fopen("log.log","a");
            fprintf(lg,"\n\nAll File Was Scanned [EOF]... --- %s -- %d --- %d --- %d ---",num,vl0,nmb,id);
            fclose(lg); };
   } while (!feof(fp));
fclose(fp);
}


всеравно не работает ID становится = 0 smile
З.Ы.: И как всё-таки сделать вывод слов дальше пробела? Например выводится "name=Sandstalker" вместо "name=Sandstalker Gauntlets"... 
PM MAIL WWW ICQ   Вверх
ptr
Дата 7.7.2006, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 1
Всего: 14



Код

sscanf(st,"[item %d]\n",&id);

Здесь у тебя st="[item" (см. ниже). Поэтому id как был 0, так им и остался.

Код

fscanf(fp,"%s",&st);

В st заносится всё до пробела, поэтому и выводится так. Читай из файла всю строку полностью. 


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
ReGeDiT
Дата 7.7.2006, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 4.7.2006
Где: Пущино на Оке

Репутация: нет
Всего: нет



Глупый вопрос, но... как? smile)
Вообще извините за такие вопросы но я очень хочу освоить работу с файлами на 100% smile 
PM MAIL WWW ICQ   Вверх
Rockie
Дата 7.7.2006, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(ReGeDiT @  7.7.2006,  22:10 Найти цитируемый пост)
Глупый вопрос, но... как? )

считать всю строку?
Код
#include<iostream>
#include<conio>

using namespace std;

int main()
{ char buff[81];

  gets(buff);
  printf("%s\n",buff);

  // а по мне уж лучш C++
  string str;
  getline(cin,str);
  cout<<str;

  getch();
  return 0;
}


компилятор BCBuilder 6.0 


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
ReGeDiT
Дата 7.7.2006, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 4.7.2006
Где: Пущино на Оке

Репутация: нет
Всего: нет



а если на Visual C++ 7.0... smile 
PM MAIL WWW ICQ   Вверх
Rockie
Дата 7.7.2006, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



проморгал что читать из файла.
Цитата(ReGeDiT @  7.7.2006,  23:20 Найти цитируемый пост)
а если на Visual C++ 7.0...  

на 2005.
Код
// solution-for_vc.cpp : main project file.
#include "stdafx.h"
#include<iostream>
#include<string>
#include<fstream>

using namespace std;

int main()
{  FILE *stream;
   char buff[81];
   
    if( (fopen_s(&stream, "1.txt", "r" ))!=0 )
      printf( "The file '1.txt' was not opened\n" );

   fgets(buff, sizeof(buff), stream);    // read a string from the file
   printf("%s", buff);

   fclose(stream);

   // а по мне уж лучше С++
   ifstream stream2("1.txt");
   string str;
   getline(stream2,str);
   cout<<'\n'<<str;

   stream2.close();

   cin.get();
   return 0;
}

 


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
ptr
Дата 8.7.2006, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 1
Всего: 14



Цитата(ReGeDiT @  8.7.2006,  02:10 Найти цитируемый пост)
Глупый вопрос, но... как? smile)

Если для C и под Linux, то там есть функция getline(). Под windows я подобной функции не припомню. Можешь, например, использовать функцию для чтения строк (память потом надо чистить):
Код

#define BUF_SIZE 256

char* getline(FILE* stream)
{
    int cur_size=0;
    int i=0;
    char* buf=(char*)malloc(sizeof(char)*BUF_SIZE);
    if(NULL==buf)
    {
    fprintf(stderr,"Couldn't allocate memory!");
    return NULL;
    }
    while(fgets(&buf[cur_size],BUF_SIZE,stream))
    {
    if('\n'==buf[strlen(buf)-1])
    {
        buf[strlen(buf)-1]='\0';
        return buf;
    }
    cur_size+=BUF_SIZE-1;
    buf=(char*)realloc(buf,cur_size+BUF_SIZE);
    if(NULL==buf)
    {
        fprintf(stderr,"Couldn't allocate memory!");
        return NULL;
    }
    }
    return buf;
}

      

Это сообщение отредактировал(а) ptr - 9.7.2006, 07:54


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
ReGeDiT
Дата 9.7.2006, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 4.7.2006
Где: Пущино на Оке

Репутация: нет
Всего: нет



ptr спасибо... теперь правда у меня слова обрезаются некоторые )) и выводится та часть слова которая после пробела ))
не мог бы ты уже на моём коде показать как это всё должно работать, чтобы я наконец понял в чём проблема... все комменты есть )
Код

/*************************************** 
** Основной модуль...                 **
** Проверка items.scp на правильность **
***************************************/

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <istream>
#define BUF_SIZE 256

char *getline(FILE* stream) // Proc by ptr
{   int cur_size=0;
    int i=0;
    char* buf=(char*)malloc(sizeof(char)*BUF_SIZE);
    if(NULL==buf)
    {
    fprintf(stderr,"Couldn't allocate memory!");
    return NULL;
    }
    while(fgets(&buf[cur_size],BUF_SIZE,stream))
    {
    if('\n'==buf[strlen(buf)-1])
    {
        buf[strlen(buf)-1]='\0';
        return buf;
    }
    cur_size+=BUF_SIZE-1;
    buf=(char*)realloc(buf,cur_size+BUF_SIZE);
    if(NULL==buf)
    {
        fprintf(stderr,"Couldn't allocate memory!");
        return NULL;
    }
    }
    return buf;
}

FILE *fp, *lg;
int vl0=6, vl1=6, vl2=6, dif=6, i, nmb, id;
char st[99], nm[99], num[99];
char *dd;

void main(void)
{
lg = fopen("log.log","w+");
fprintf(lg,"IN : Item Number\nName : Item Name\nBP : Buy Price\nSP : Sell Price\nDF : Difference\n\n\n");
fclose(lg);
fp = fopen("items.scp","r");
do {
/**************************************************************************************************/
    fscanf(fp,"%s",&st);
    dd = getline(fp);
    /*sscanf(st,"[item %d]\n",&id);
    printf("[item %d]-SS\n",id);
    fscanf(fp,"[item %d]\n",&id);
    printf("[item %d]-FS\n",id);/*
/**************************************************************************************************/
/*    if (strncmp(st,"name=",5)==0)          {
    for (i=0;i<99;i++) { nm[i] = st[i]; };
    printf("%s\n",nm);                     };*/
    if (strncmp(st,"name=",5)==0)          {
    for (i=0;i<=99;i++) { nm[i] = dd[i]; }; // по другому ну никак не придумаю :(
    printf("%s\n",nm);                     };
/**************************************************************************************************/
    if (strncmp(dd,"[",1)==0)       { // условие не выполняется :(
    //sscanf(st,"[item %d]\n",&id);
    //printf("[item %d]-SS\n",id);
    //fscanf(fp,"[item %d]\n",&id);
    //printf("[item %d]-FS\n",id);
    vl0 = 345; // Тест на работает ли вообще... и как выяснилось условие не выполняется
    vl0 = atoi(strstr(dd,"m")+3);
/*    for (i=0;i<99;i++) { if (st[i]=='0') num[i]='0';
             if (st[i]=='1') num[i]='1';
             if (st[i]=='2') num[i]='2';
             if (st[i]=='3') num[i]='3';
             if (st[i]=='4') num[i]='4';
             if (st[i]=='5') num[i]='5';
             if (st[i]=='6') num[i]='6';
             if (st[i]=='7') num[i]='7';
             if (st[i]=='8') num[i]='8';
             if (st[i]=='9') num[i]='9';
               };
    nmb = atoi(num);
  */  printf("[item %d]\n",vl0);
    /*printf("[item %d]\n",nmb);
    printf("[item %d]-ID\n",id);*/            };
/**************************************************************************************************/
    if (strncmp(st,"buyprice=",9)==0)   {  // тут всё работает 100%
    vl1 = atoi(strstr(st,"=")+1);          // тут всё работает 100%
    printf("buyprice=%d\n",vl1);        }; // тут всё работает 100%
/**************************************************************************************************/
    if (strncmp(st,"item",4)==0)   {  // сделал проверку ещё раз, на всякий случай, но всёравно не работает
    vl0 = atoi(strstr(st," ")+1);     // 0%
    printf("item=%d\n",vl0);       }; // 0%
/**************************************************************************************************/
    if (strncmp(st,"sellprice=",10)==0) { // Работает 100%
    vl2 = atoi(strstr(st,"=")+1);
    printf("sellprice=%d\n",vl2);
    dif = vl2-vl1;
    if ((vl1==vl2)&&(vl1!=1)&&(vl2!=1)) { printf("SELLPRICE == BUYPRICE! ADDED TO LOG!\n");
                                          lg = fopen("log.log","a");
                                          fprintf(lg,"SELLPRICE == BUYPRICE || ");
                                          fprintf(lg,"IN = %d-%d-%d %s BP = %d SP = %d DF = %d\n",vl0,nmb,id,nm,vl1,vl2,dif);
                                          fclose(lg);
                                        };
    if (vl2>vl1) { printf("SELLPRICE >> BUYPRICE! ADDED TO LOG!\n");
                   lg = fopen("log.log","a");
                   fprintf(lg,"SELLPRICE >> BUYPRICE || ");
                   fprintf(lg,"IN = %d-%d-%d %s BP = %d SP = %d DF = %d\n",vl0,nmb,id,nm,vl1,vl2,dif);
                   fclose(lg);
                 };
                                        };
/**************************************************************************************************/
    if (feof(fp)) { printf("All File Was Scanned [EOF]...\n");
            lg = fopen("log.log","a");
            fprintf(lg,"\n\nAll File Was Scanned [EOF]... %d",vl0);
            fclose(lg); };
   } while (!feof(fp));
fclose(fp);
}

// ThX to ptr, Rockie, Олег4, Fedor, Fazil6 and all who i forgot ^^
 
PM MAIL WWW ICQ   Вверх
Rockie
Дата 10.7.2006, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(ReGeDiT @  9.7.2006,  21:38 Найти цитируемый пост)
 все комменты есть )

Цитата(ReGeDiT @  9.7.2006,  21:38 Найти цитируемый пост)
 if (strncmp(st,"buyprice=",9)==0)   {  // тут всё работает 100%    
    vl1 = atoi(strstr(st,"=")+1);          // тут всё работает 100%    
    printf("buyprice=%d\n",vl1);        }; // тут всё работает 100%

Цитата(ReGeDiT @  9.7.2006,  21:38 Найти цитируемый пост)
l0 = atoi(strstr(st," ")+1);     // 0%

=)
ReGeDiT, дай содержимое файла log.log или еще какого там и напиши точно что эта программа делает. 


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
ReGeDiT
Дата 10.7.2006, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 4.7.2006
Где: Пущино на Оке

Репутация: нет
Всего: нет



=)
log.log :
Код


~items.scp~

IN : Item Number
Name : Item Name
BP : Buy Price
SP : Sell Price
DF : Difference
VR : Variable


SELLPRICE >> BUYPRICE || IN = 0  Shoes BP = 29 SP = 58 DF = 29
SELLPRICE >> BUYPRICE || IN = 0  Linen Bandage BP = 80 SP = 200 DF = 120
UNKNOWN      VARIABLE || IN = 0  Sash VR = variaaion=1022
UNKNOWN      VARIABLE || IN = 0  Chestpiece VR = maaerial=8
UNKNOWN      VARIABLE || IN = 0  Chicken VR = lot=10620
UNKNOWN      VARIABLE || IN = 0  VR = bayprice=87634
UNKNOWN      VARIABLE || IN = 0  Helm VR = variarion=1811
UNKNOWN      VARIABLE || IN = 0  Commander's Chain Pauldrons VR = bayprice=64573
SELLPRICE >> BUYPRICE || IN = 0  Gauntlets BP = 84490 SP = 96898 DF = 12408


All File Was Scanned [EOF]...


новый код :
Код

/***************************
** Модуль проверки файлов **
***************************/

#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#define BUF_SIZE 256

char* getline(FILE* stream)
{
    int cur_size=0;
    char* buf=(char*)malloc(sizeof(char)*BUF_SIZE);
    if (NULL==buf) { fprintf(stderr,"Couldn't allocate memory!");
             return NULL;
           }
    while(fgets(&buf[cur_size],BUF_SIZE,stream))
      { if ('\n'==buf[strlen(buf)-1])
      {
       buf[strlen(buf)-1]='\0';
       return buf;
      }
    cur_size+=BUF_SIZE-1;
    buf=(char*)realloc(buf,cur_size+BUF_SIZE);
    if (NULL==buf)
      {
       fprintf(stderr,"Couldn't allocate memory!");
       return NULL;
      }
      }
    return buf;
}

/***************************************
** Проверка items.scp на правильность **
***************************************/

FILE *fp, *lg;
int vl0=0, vl1=0, vl2=0, dif, i, nmb, id;
char st[99], *nm;

void main(void)
{
lg = fopen("log.log","wt");
fprintf(lg,"\n~items.scp~\n\nIN : Item Number\nName : Item Name\nBP : Buy Price\nSP : Sell Price\nDF : Difference\nVR : Variable\n\n\n");
fclose(lg);
fp = fopen("items.scp","rt");
do {
/**************************************************************************************************/
    fscanf(fp,"%s",&st);
/**************************************************************************************************/
    if (strncmp(st,"name=",5)==0) {  // Работает на 50% - Только половина имени
    nm = getline(fp);                // Работает на 50% - Только половина имени
    printf("%s\n",nm);            }; // Работает на 50% - Только половина имени
/**************************************************************************************************/
    sscanf(getline(fp),"[item %d]\n",&vl0); // 0%
/**************************************************************************************************/
    if (strncmp(st,"buyprice=",9)==0)   {  // тут всё работает 100%
    vl1 = atoi(strstr(st,"=")+1);          // тут всё работает 100%
    printf("buyprice=%d\n",vl1);        }; // тут всё работает 100%
/**************************************************************************************************/
    if (strncmp(st,"sellprice=",10)==0) { // Работает 100%
    vl2 = atoi(strstr(st,"=")+1);
    printf("sellprice=%d\n",vl2);
    dif = vl2-vl1;
    if ((vl1==vl2)&&(vl1!=1)&&(vl2!=1)) { printf("SELLPRICE == BUYPRICE! ADDED TO LOG!\n");
                                          lg = fopen("log.log","at");
                                          fprintf(lg,"SELLPRICE == BUYPRICE || IN = %d %s BP = %d SP = %d DF = %d\n",vl0,nm,vl1,vl2,dif);
                                          fclose(lg);
                                        };
    if (vl2>vl1) { printf("SELLPRICE >> BUYPRICE! ADDED TO LOG!\n");
               lg = fopen("log.log","at");
               fprintf(lg,"SELLPRICE >> BUYPRICE || IN = %d %s BP = %d SP = %d DF = %d\n",vl0,nm,vl1,vl2,dif);
               fclose(lg);
             };
                                };
/**************************************************************************************************/
    if ((strncmp(st,"bonding=",8)!=0)&& // Работает 100%
        (strncmp(st,"buyprice=",9)!=0)&&
        (strncmp(st,"class=",6)!=0)&&
        (strncmp(st,"classes=",8)!=0)&&
        (strncmp(st,"description=",12)!=0)&&
        (strncmp(st,"language=",9)!=0)&&
        (strncmp(st,"level=",6)!=0)&&
        (strncmp(st,"material=",9)!=0)&&
        (strncmp(st,"maxcount=",9)!=0)&&
        (strncmp(st,"model=",6)!=0)&&
        (strncmp(st,"name=",5)!=0)&&
        (strncmp(st,"pagetext=",9)!=0)&&
        (strncmp(st,"quality=",8)!=0)&&
        (strncmp(st,"races=",6)!=0)&&
        (strncmp(st,"reqlevel=",9)!=0)&&
        (strncmp(st,"sellprice=",10)!=0)&&
        (strncmp(st,"//",2)!=0)&&
        (strncmp(st,"#include",8)!=0)&&
        (strncmp(st,"[item",5)!=0)&&
        (strncmp(st,"damage=",7)!=0)&&
        (strncmp(st,"delay=",6)!=0)&&
        (strncmp(st,"durability=",11)!=0)&&
        (strncmp(st,"inventorytype=",14)!=0)&&
        (strncmp(st,"sheath=",7)!=0)&&
        (strncmp(st,"resistance1=",12)!=0)&&
        (strncmp(st,"resistance2=",12)!=0)&&
        (strncmp(st,"resistance3=",12)!=0)&&
        (strncmp(st,"resistance4=",12)!=0)&&
        (strncmp(st,"resistance5=",12)!=0)&&
        (strncmp(st,"resistance6=",12)!=0)&&
        (strncmp(st,"resistance7=",12)!=0)&&
        (strncmp(st,"resistances=",12)!=0)&&                    // ???
        (strncmp(st,"bonus=",6)!=0)&&
        (strncmp(st,"questid=",8)!=0)&&
        (strncmp(st,"block=",6)!=0)&&
        (strncmp(st,"part=",5)!=0)&&
        (strncmp(st,"flags=",6)!=0)&&
        (strncmp(st,"extra=",6)!=0)&&                           // ???
        (strncmp(st,"variation=",10)!=0)&&
        (strncmp(st,"containerslots=",15)!=0)&&
        (strncmp(st,"subclass=",9)!=0)&&
        (strncmp(st,"spell=",6)!=0)&&
        (strncmp(st,"skill=",6)!=0)&&
        (strncmp(st,"skillrank=",10)!=0)&&
        (strncmp(st,"questscript=",12)!=0)&&
        (strncmp(st,"starts_quests=",14)!=0)&&                  // 1 ?
        (strncmp(st,"startquest=",11)!=0)&&                     // 1 ?
        (strncmp(st,"ammotype=",9)!=0)&&                        // ???
        (strncmp(st,"oldclass=",9)!=0)&&                        // ???
        (strncmp(st,"pagematerial=",13)!=0)&&                   // ???
        (strncmp(st,"loot=",5)!=0)&&
        (strncmp(st,"lockid=",7)!=0)&&                          // ???
        (strncmp(st,"finishes_quests=",16)!=0)&&
        (strncmp(st,"set=",4)!=0)&&
        (strncmp(st,"questid2=",9)!=0)&&                        // ???
        (strncmp(st,"spellreq=",9)!=0)&&
        (strncmp(st,"pvprankreq=",11)!=0)&&
        (strncmp(st,"stackable=",10)!=0)) { lg = fopen("log.log","at");
                                            printf("UNKNOWN      VARIABLE! ADDED TO LOG!\n");
                                            fprintf(lg,"UNKNOWN      VARIABLE || IN = %d %s VR = %s\n",vl0,nm,st);
                                            fclose(lg);
                                          };
/**************************************************************************************************/
    if (feof(fp)) { printf("All File Was Scanned [EOF]...\n");
                    lg = fopen("log.log","at");
                    fprintf(lg,"\n\nAll File Was Scanned [EOF]...");
                    fclose(lg);
                  };
   }
while (!feof(fp));
fclose(fp);
}

/*********************************************************************
** ThX to ptr, Rockie, Олег4, Fedor, Fazil6 and all who i forgot ^^ **
*********************************************************************/


проблема в :

Код

SELLPRICE >> BUYPRICE || IN = 0  Gauntlets BP = 84490 SP = 96898 DF = 12408


должно быть как
Код

SELLPRICE >> BUYPRICE || IN = 0  Sandstalker Gauntlets BP = 84490 SP = 96898 DF = 12408

smile

и IN = 0 никак не определит [item ID] ... всеравно 0... smile 

т.е. в идеале всё должно быть как

Код

SELLPRICE >> BUYPRICE || IN = 20477 Sandstalker Gauntlets BP = 84490 SP = 96898 DF = 12408


то что в items.scp >>
Код

[item 20477]
bonus=7 9
bonding=2
buyprice=84490
class=4
classes=07FF
durability=40
inventorytype=10
level=62
material=5
model=32874
name=Sandstalker Gauntlets
quality=3
races=0FF
reqlevel=57
resistance1=308
resistance4=20
sellprice=96898
stackable=1
subclass=3


ух много я напесал ^^  

Это сообщение отредактировал(а) ReGeDiT - 10.7.2006, 13:32
PM MAIL WWW ICQ   Вверх
ptr
Дата 10.7.2006, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 1
Всего: 14



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

/*************************************** 
** Îñíîâíîé ìîäóëü...                 **
** Ïðîâåðêà items.scp íà ïðàâèëüíîñòü **
***************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#define BUF_SIZE 256
#define NAME_LEN 99

char *getline(FILE* stream) // Proc by ptr
{   
    int cur_size=0;
    int i=0;
    char* buf=(char*)malloc(sizeof(char)*BUF_SIZE);
    if(NULL==buf)
    {
        return NULL;
    }
    while(fgets(&buf[cur_size],BUF_SIZE,stream))
    {
        if('\n'==buf[strlen(buf)-1])
        {
            buf[strlen(buf)-1]='\0';
            return buf;
        }
        cur_size+=BUF_SIZE-1;
        buf=(char*)realloc(buf,cur_size+BUF_SIZE);
        if(NULL==buf)
        {
            return NULL;
        }
    }
    return buf;
}

void printToLog(FILE* log, int buyPrice, int sellPrice, int id, char *name)
{
    //if(NULL==name){}
    int dif = sellPrice - buyPrice;
    if(0==dif)
    {
        fprintf(log,"SELLPRICE == BUYPRICE || ");
    }
    else
    {
        fprintf(log,"SELLPRICE >> BUYPRICE || ");
    }
    fprintf(log,"IN = %d %s BP = %d SP = %d DF = %d\n", id, name, buyPrice, sellPrice, dif);

    printf("Name: %s\n", name);
    printf("ID: %d\n",id);
    printf("buyPrice: %d\n",buyPrice);
    printf("sellPrice: %d\n\n",sellPrice);
}


int main(void)
{
    extern int errno;
    FILE *input = NULL, *log = NULL;
    int buyPrice=0, sellPrice=0, id=0;
    char name[NAME_LEN+1];
    void *ptr = NULL;//èñïîëüçóåòñÿ äëÿ ïðîñòîòû çàïèñè
    char *buf = NULL;//áóôåð äëÿ ÷òåíèÿ
    char allValues = 0;//åñëè ìû ñ÷èòàëè âñå äàííûå(=1), òî ïèøåì èõ â ëîã.
    
    log = fopen("log.log","w+");
    input = fopen("items.scp","r");

    if(NULL==log || NULL==input)
    {
        fprintf(stderr,"Couldn't open file - %s.", strerror(errno));
        exit(EXIT_FAILURE);
    }

    fprintf(log,"IN : Item Number\nName : Item Name\nBP : Buy Price\nSP : Sell Price\nDF : Difference\n\n\n");
    fclose(log);
    log = fopen("log.log", "a");

    buf=getline(input);// ñ÷èòûâàíèå ïåðâîé ñòðîêè #include scripts/extra/items_LF.scp

    if(NULL==buf)//ïðîâåðêà íà îøèáêè
    {
        fclose(log);
        fclose(input);
        exit(EXIT_FAILURE);
    }

    while(!feof(input))
    {
        if(1==allValues)//åñëè =1, òî ïèøåì â ëîã (òàê ëó÷øå íå äåëàòü)
        {
            printToLog(log, buyPrice, sellPrice, id, name);
            allValues = 0;
        }

        if(NULL==(buf=getline(input)))//ñ÷èòûâàåì èç ôàéëà
        {
            fclose(log);
            fclose(input);
            exit(EXIT_FAILURE);
        }

        if(0==strncmp("[item",buf,strlen("[item")))
        {
            sscanf(buf,"[item %d]",&id);
            //continue;
        }

        if(0==strncmp("name",buf, strlen("name")))
        {
            ptr = strstr(buf,"=")+1;
            strncpy(name, ptr, NAME_LEN);//íåêîððåòíî, íî åñëè äëèíà èìåíè <99 ñèìâîëîâ :), òî ñîéä¸ò
            //continue;
        }

        if(0==strncmp("buyprice",buf,strlen("buyprice")))
        {
            ptr = strstr(buf,"=")+1;
            buyPrice = atoi(ptr);
            //continue;
        }

        if(0==strncmp("sellprice",buf,strlen("sellprice")))
        {
            ptr = strstr(buf,"=")+1;
            sellPrice = atoi(ptr);
            allValues=1;
            //continue;
        }
        free(buf);//íå çàáûâàé ÷èñòèòü ïàìÿòü
    }

    printf("All File Was Scanned [EOF]...\n");
    fprintf(log,"\n\nAll File Was Scanned [EOF]... ");

    //óõîäÿ ãàñèì ñâåò
    fclose(input);
    fclose(log);

    system("PAUSE");
    return 0;
}
 


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
ReGeDiT
Дата 10.7.2006, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 4.7.2006
Где: Пущино на Оке

Репутация: нет
Всего: нет



ptr, все комменты на арабском smile( ничо не понять ^^
З.Ы. а не мог ли бы ты исправить конкретно в моей программе (пост выше)... а то мне очень долго разбирацо в твоей ибо код написан в очень сложной манере... но спасибо всеравно ))

Добавлено @ 16:33 
если это ");// ñ÷èòûâàíèå ïåðâîé ñòðîêè #include scripts/extra/items_LF.scp" переводится как "что такое #include scripts/extra/items_LF.scp" то это значит, что проверяемый файл также должен включать в себя другой файл... т.е. неплохо было-бы его подгрузить ))) но как это сделать я пока не задумывался 
PM MAIL WWW ICQ   Вверх
ReGeDiT
Дата 10.7.2006, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 4.7.2006
Где: Пущино на Оке

Репутация: нет
Всего: нет



и почемуто у меня если в любое время делать 

переменная = getline(fp);

то программа выводит в логе полную чушь, прямо мистика smile... там что-то про очистку памяти было? )) 
PM MAIL WWW ICQ   Вверх
ReGeDiT
Дата 10.7.2006, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 4.7.2006
Где: Пущино на Оке

Репутация: нет
Всего: нет



ыыы сорри снова... ptr а зачем ты в своём коде сделал ошибку? спецово? =) защита от дурака? smile) так или иначе, в логе пишется чушь )) 
PM MAIL WWW ICQ   Вверх
ptr
Дата 11.7.2006, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 1
Всего: 14



Цитата(ReGeDiT @  10.7.2006,  21:41 Найти цитируемый пост)
ыыы сорри снова... ptr а зачем ты в своём коде сделал ошибку? спецово? =) защита от дурака? smile) так или иначе, в логе пишется чушь ))  

Что за ошибка? У меня всё нормально работает.


Цитата(ReGeDiT @  10.7.2006,  20:42 Найти цитируемый пост)
и почемуто у меня если в любое время делать 

переменная = getline(fp);

то программа выводит в логе полную чушь, прямо мистика smile... там что-то про очистку памяти было? ))  

getline() считывает из файла всю строку полностью, при этом выделяет память под неё (читай всё getline, fscanf здесь вообще не нужен). После использования строки делай free().

Что за чушь то?

Цитата(ReGeDiT @  10.7.2006,  20:21 Найти цитируемый пост)
если это ");// ñ÷èòûâàíèå ïåðâîé ñòðîêè #include scripts/extra/items_LF.scp" переводится как "что такое #include scripts/extra/items_LF.scp" то это значит, что проверяемый файл также должен включать в себя другой файл... 

Ну что-то же я с этой строкой делать то должен был.

Цитата(ReGeDiT @  10.7.2006,  20:21 Найти цитируемый пост)
ptr, все комменты на арабском smile( ничо не понять ^^

Ты это о чём?

Цитата(ReGeDiT @  10.7.2006,  20:21 Найти цитируемый пост)
З.Ы. а не мог ли бы ты исправить конкретно в моей программе (пост выше)... а то мне очень долго разбирацо в твоей ибо код написан в очень сложной манере... но спасибо всеравно ))

Ну не знаю что ты сложного нашёл.
Вот твой код:
Код

char* buf;
...
do {
buf=getline(fp);//здесь не нужен fscanf
    if (strncmp(buf,"name=",5)==0) {
    strncpy(nm, strstr(buf,"=")+1, 99);
                            }
....
    sscanf(buf,"[item %d]",&vl0);
    free(buf);
}
while()
  

Это сообщение отредактировал(а) ptr - 11.7.2006, 09:07


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1285 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.