Особый случа
От: TARGRED  
Дата: 18.10.05 18:50
Оценка:
Народ, помогите разобраться
Вот я написал что-то похожее на код

void ReadCommodity ()
   {
      char str[256];
      string Name,Size,STR;
      int ID,Price,a=0,m=0;

      Commodity comm;
      std::ifstream file("C:\\DATA\\Commodity.txt", std::ios::binary);
      while(!file.eof())
      {
          file.getline(str,sizeof(str));
          for(int i=0; i<256;i++)
          { 
            switch(a)
            {
            case 0 :
                if(str[i].ToString()!="^")
                {
                    STR+=str[i];
                }
                else
                {
                   a++;
                   ID=atoi(STR.c_str());
                   STR="";
                }
                break;
            case 1 :
                if(str[i].ToString()!="^")
                {
                    STR+=str[i];
                }
                else
                {
                   a++;
                   Name=STR;
                   STR="";
                }
                break;
            case 2 :
                if(str[i].ToString()!="^")
                {
                    STR+=str[i];
                }
                else
                {
                   a++;
                   Price=atoi(STR.c_str());
                   STR="";
                }
                break;
            case 3:
                if(str[i].ToString()!="^")
                {
                    STR+=str[i];
                }
                else
                {
                   a=0;
                   Size=STR;
                   STR="";
                   break;
                }
                break;
            }
             
            MComm[m].CommodityID=ID;
            MComm[m].CommodityName=Name;
            MComm[m].price=Price;
            MComm[m].size=Size;
            Console::WriteLine(ID);

          }
          
      }
      Console::ReadLine();
   };



Это код считает примерно такую строки с файла
1^CRU^2600^KG
и вот я пытаюсь разбить получену строку
на
int ID =1;
string Name = CRU;
double …..
string …..

Я разбиваю и пытаюсь проверить, что же получилась
Console::WriteLine(ID);

На такое выражение и на

Console::WriteLine(Name.c_str());

На другие наверное также
Выдает в первом случае
0
0
0
……
А во втором пустые строки. Вопрос чего я не так сделал?
Большое спасибо?
Re: Особый случа
От: Vinick Россия  
Дата: 19.10.05 04:24
Оценка:
Здравствуйте, TARGRED, Вы писали:

TAR>А во втором пустые строки. Вопрос чего я не так сделал?

TAR>Большое спасибо?
Вынесите
     MComm[m].CommodityID=ID;
     MComm[m].CommodityName=Name;
     MComm[m].price=Price;
     MComm[m].size=Size;
     Console::WriteLine(ID);

за пределы цикла for(int i=0; i< 256;++i), тогда он будет нормально печатать.
А для вашей цели попробуйте использовать std::getline(std::istream,std::string,char delim).
Re: Особый случа
От: MaximE Великобритания  
Дата: 19.10.05 07:26
Оценка:
On Tue, 18 Oct 2005 22:50:03 +0400, TARGRED <34292@users.rsdn.ru> wrote:

[]

Воспользуйся для парсинга каким-либо готовым средством, например scanf.

Ты не проверяешь возвращаемое значение getline(). Вызов мог ничего не считать, т.к. ты мог добраться до конца потока. Проверка достигнут ли конец потока до вызова бессмысленна.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[2]: Особый случа
От: TARGRED  
Дата: 19.10.05 12:19
Оценка:
std::getline(std::istream,std::string,char delim).


а как это использовать, можно пояснение для особо одаренных?
Re[2]: Особый случа
От: TARGRED  
Дата: 20.10.05 09:02
Оценка:
Здравствуйте, Vinick, Вы писали:

std::getline(std::istream,std::string,char delim).

А как этим пользоваться?
Спасибо
Re[3]: Особый случа
От: Vinick Россия  
Дата: 20.10.05 13:55
Оценка:
Здравствуйте, TARGRED, Вы писали:

TAR> std::getline(std::istream,std::string,char delim).


TAR>А как этим пользоваться?

TAR>Спасибо
std::getline(std::istream & istr,std::string &s ,char delim).
В таком виде getline читает данные из потока istr в строку s,
пока не встретиться символ delim или перевод строки или конец файла.

На вашем примере можно использовать так:
  std::ifstream file("C:\\DATA\\Commodity.txt");
  int id;
  std::string name;
  std::string size;
  double price;
  while(!file.eof())
   {
     std::string s;
     std::getline(file,s,'^');
     if(s.empty())   break; // не знаю почему, но у меня иногда бывает, что eof() еще возвращает false
                            // а читать уже нечего, поэтому такая проверка.

     id = atoi(s.c_str());
     std::getline(file,name,'^');
     std::getline(file,s,'^');
     price = atof(s.c_str());
     std::getline(file,size,'^');   
                
   }


примерно так...
Re[4]: Особый случа
От: TARGRED  
Дата: 20.10.05 14:30
Оценка:
Здравствуйте, Vinick, Вы писали:

V>Здравствуйте, TARGRED, Вы писали:


TAR>> std::getline(std::istream,std::string,char delim).


TAR>>А как этим пользоваться?

TAR>>Спасибо
V>std::getline(std::istream & istr,std::string &s ,char delim).
V>В таком виде getline читает данные из потока istr в строку s,
V>пока не встретиться символ delim или перевод строки или конец файла.

V>На вашем примере можно использовать так:

V>
V>  std::ifstream file("C:\\DATA\\Commodity.txt");
V>  int id;
V>  std::string name;
V>  std::string size;
V>  double price;
V>  while(!file.eof())
V>   {
V>     std::string s;
V>     std::getline(file,s,'^');
V>     if(s.empty())   break; // не знаю почему, но у меня иногда бывает, что eof() еще возвращает false
V>                            // а читать уже нечего, поэтому такая проверка.

V>     id = atoi(s.c_str());
V>     std::getline(file,name,'^');
V>     std::getline(file,s,'^');
V>     price = atof(s.c_str());
V>     std::getline(file,size,'^');   
                
V>   }
V>


V>примерно так...



ОГРОМНОЕ СПАСИБО.
Re[2]: Особый случа
От: TARGRED  
Дата: 20.10.05 16:21
Оценка:
Не прошло и пол часа как я снова с вами.

Есть строки, например


std::getline(file,MComm[m].CommodityName,"^");
std::getline(file,s,"^");
std::getline(file,MComm[m].size,"^");


В них происходет следующее
error C2039: 'getline' : is not a member of 'std'

хотя после написание std и установки двоеточие вилазит списак в котором функция getline() присутствует


Если убераю std, то
error C3861: 'getline': identifier not found, even with argument-dependent lookup


Как вы думаете, что с эти лучше сделать?
Re[3]: Особый случа
От: Vinick Россия  
Дата: 21.10.05 05:10
Оценка:
Здравствуйте, TARGRED, Вы писали:

TAR>Не прошло и пол часа как я снова с вами.


TAR>Есть строки, например


TAR>

TAR>std::getline(file,MComm[m].CommodityName,"^");
TAR>std::getline(file,s,"^");
TAR>std::getline(file,MComm[m].size,"^");
TAR>


TAR> В них происходет следующее

TAR>error C2039: 'getline' : is not a member of 'std'

У меня к сожалению нет возможности проверить на VC++.
Но! обратите внимание на прототип getline
std::istream & std::getline(std::istream &, std::string &, char);
Последний параметр имеет тип char, а вы передаете const char *.
Вывод: заменить "^" на '^'.
и не забудьте сделать #include <string>
После этого должно заработать... я так думаю

ЗЫ: надеюсь, что MComm[m].CommodityName и MComm[m].size у вас имеют тип std::string.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.