Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Как считать из этого файла?


Автор: CrasyMen 21.4.2007, 21:13
Допустим у нас есть текстовый файл такого содержания:
Код

Seagate U4 6421    2000    7    5400    506
Quantum Fireball ICT10    2000    10    5400    533
Seagate Barracuda ST310210A    2000    10    5400    551
IBM Deskstar 75GXP    2000    30    5400    864
Western Digital WD1200JB    2002    120    7200    1008
Seagate Cheetah X15-36LP    2001    18    15000    1127
Samsung SpinPoint SP4002H    2002    40    7200    560
IBM Ultrastar 73LZX    2001    36    10000    1592
Samsung SpinPoint SV0411N    2003    40    5400    398
IBM Deskstar IC35L180AVV 207-1    2003    160    7200    1187
Western Digital 800 JB    2003    80    7200    649
Seagate Cheetah 36ES    2001    36    10000    1483
Seagate Barracuda V ST3120023A    2003    40    5400    580
Maxtor Fireball 3 2F040J0    2003    40    7200    617
Western Digital Caviar WD1200JB    2001    120    7200    853
Seagate Barracuda 36ES    2001    36    7200    999
Western Digital Caviar WD1200BB    2001    120    7200    801
IBM Ultrastar 36Z15    2001    36    15000    2745
Seagate Cheetah 73LP    2001    74    10000    3105
Maxtor DiamondMax 541DX    2001    20    5400    376
Samsung SpinPoint SV6003H    2001    60    5400    534
Seagate Barracuda ATA IV    2001    40    7200    447
Maxtor D540X-4D    2001    60    5400    492
Western Digital WD360GD    2003    36    10000    554
Maxtor MaxLine Plus II    2003    240    7200    902
Seagate Barracuda ST340016A    2002    40    7200    849
Maxtor MaxLine III    2004    300    7200    1725
IBM Deskstar 60GXP    2002    60    7200    895
Seagate U6 ST340810A    2002    40    5400    802
Western Digital Caviar WD600AB    2002    60    5400    837
IBM Deskstar 120GXP    2002    120    7200    1003
Maxtor DiamondMax D540X-4K    2002    80    5400    972
Samsung SpinPoint SV8004H    2002    80    5400    966
Western Digital Caviar WD300BB    2004    300    5400    1619
Samsung SpinPoint SP1614C    2004    160    7200    852
Hitachi Deskstar 7K250    2004    120    7200    823
Western Digital Raptor WD740GD    2004    74    10000    1056
Seagate Barracuda ST3200822AS    2004    200    7200    900
Maxtor DiamondMax Plus9 6Y250MO    2004    250    7200    1197
Maxtor Atlas 15K II    2005    80    15000    2135
Seagate Cheetah 10K.6    2005    54    10000    1322
Hitachi HUS103030FL3800    2005    68    10000    4019
Maxtor DiamondMax 10    2005    300    7200    982
Maxtor DiamondMax 6B250S0    2005    250    7200    897
Seagate Cheetah ST3146854LW    2005    146    15000    4293
Samsung HD160J    2005    160    7200    765
Seagate Barracuda ST3500641AS    2006    500    7200    1839
Seagate Barracuda ST3400832NS    2006    400    7200    1326
Seagate Barracude ST3750640AS    2006    750    7200    2643
Samsung HD300LJ    2006    300    7200    889
Samsung HD400LJ    2006    400    7200    961
Western Digital WD5000KS    2006    500    7200    1433

Здесь указано название винчестера, размер, об/мин, цена. Если не трудно приведите код программы которая считывает файл и выводит его содержимое в четыре TListBox'а (отдельно название, размер, об/мин, цена)
 smile 
Заранее благодарю

Автор: Romikgy 21.4.2007, 22:14
1. разделяются чем слова ? табами?
2. имхо данный сабж в центр помощи

Автор: CrasyMen 21.4.2007, 22:16
Цитата(Romikgy @  21.4.2007,  22:14 Найти цитируемый пост)
1. разделяются чем слова ? табами?

да

Автор: Klin 21.4.2007, 22:41
Ребята, вы что издеваетесь? Мало того, что поиск для нас вообще не работает, так вам теперь лень глаза на два поста вниз опустить?!  smile 
http://forum.vingrad.ru/topic-147176/kw-%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%BE%D0%B2%D0%B8%D0%BA%D0%BE%D0%BC/15.html
Вместо мемо используете ListBox.

Автор: Romikgy 21.4.2007, 22:57
Вроде так но не проверял
Код

TListBox *l1,*l2,*l3,*l4,*l5; это твои лист боксы

void load_file()
{
var 
 TStringList *file_,*cur_str ;
 long i;

file_=new TStringList;
cur_str:=new TStringList;
file_->LoadFromFile("tra.tra");
for (i=0;i<file_.Count;i++)
{
cur_str->Text:=StringReplace(file_->Strings[i],"\t","\n",TReplaceFlags()<<rfReplaceAll); 
l1->Add(cur_str->Strings[0]);    
l2->Add(cur_str->Strings[1]);    
l3->Add(cur_str->Strings[2]);    
l4->Add(cur_str->Strings[3]);    
l5->Add(cur_str->Strings[4]);    
}
delete cur_str;
delete file_;
}

Автор: Klin 21.4.2007, 23:35
Перевел на си, но толи переводчик из меня корявый, то ли у вас с кодом что-то не то:
Код

TStringList *file_ = new TStringList;
TStringList *cur_str = new TStringList;
long i;
file_->LoadFromFile("data.txt");
for (i=0;i<file_->Count;i++)
{
cur_str->Text=StringReplace(file_->Strings[i],"\t","\n",TReplaceFlags()<<rfReplaceAll);
ListBox1->Items->Add(cur_str->Strings[0]);
ListBox2->Items->Add(cur_str->Strings[1]);
ListBox3->Items->Add(cur_str->Strings[2]);
ListBox4->Items->Add(cur_str->Strings[3]);
ListBox5->Items->Add(cur_str->Strings[4]);
}
delete cur_str;
delete file_;


Ошибка: List index out of bonus (1)

ps. я прекрасно знаю, что означает эта ошибка, но в силу слабости мозга перевести не могу smile

Автор: dumb 22.4.2007, 02:34
Цитата(Klin @  21.4.2007,  23:35 Найти цитируемый пост)
Ошибка: List index out of bonus (1)
ps. я прекрасно знаю, что означает эта ошибка, но в силу слабости мозга перевести не могу

это ты в силу слабости глаз не можешь перевести... smile ...out of bounds...
а происходит так оттого, что в твоем data.txt данные разделяются пробелами, а не табами. надо либо StringReplace(..."    ","\t"... сначала сделать, либо сразу "    "->"\n".

Автор: Klin 22.4.2007, 16:00
Цитата(dumb @  22.4.2007,  03:34 Найти цитируемый пост)
 данные разделяются пробелами, а не табами

Блин, спрашивали ведь smile

Автор: CrasyMen 8.5.2007, 00:03
Klin, Спасибо помогло.
Пытался адаптировать этот код:
Цитата(Klin @  21.4.2007,  23:35 Найти цитируемый пост)
TStringList *file_ = new TStringList;
TStringList *cur_str = new TStringList;
long i;
file_->LoadFromFile("data.txt");
for (i=0;i<file_->Count;i++)
{
cur_str->Text=StringReplace(file_->Strings[i],"\t","\n",TReplaceFlags()<<rfReplaceAll);
ListBox1->Items->Add(cur_str->Strings[0]);
ListBox2->Items->Add(cur_str->Strings[1]);
ListBox3->Items->Add(cur_str->Strings[2]);
ListBox4->Items->Add(cur_str->Strings[3]);
ListBox5->Items->Add(cur_str->Strings[4]);
}
delete cur_str;
delete file_;

для формы на которой есть один ComboBox (в него вводим из файла название напр. "Seagate Barracuda 36ES"), остальные характеристики выводятся в Label1 - Label8. Если нечего выводить то Caption в Label должна быть пустой. В даном случае пустыми должны быть Label5 - Label8.

и ... облом.
помогите  

Автор: Klin 8.5.2007, 00:22
Немного не понял, при выборе элемента в ComboBox должна выводиться в Label`ах или нет? Можно создать условие на ComboBox1 и все.
Код

 if (ComboBox1->Text) 
  Label5->Caption = cur_str->Strings[1];
 else 
  Label5->Caption = "";
  .........

Вроде так, не проверял.

Автор: CrasyMen 8.5.2007, 00:30
Цитата(CrasyMen @  8.5.2007,  00:03 Найти цитируемый пост)
TStringList *file_ = new TStringList;
TStringList *cur_str = new TStringList;
long i;
file_->LoadFromFile("data.txt");
for (i=0;i<file_->Count;i++)
{
cur_str->Text=StringReplace(file_->Strings[i],"\t","\n",TReplaceFlags()<<rfReplaceAll);
}
delete cur_str;
delete file_;

даже при таком коде в сомбобоксе выводится все содержимое файла. А мне надо только название (напр. "Seagate Barracuda 36ES").
если
Цитата(Klin @  8.5.2007,  00:22 Найти цитируемый пост)
  Label5->Caption = cur_str->Strings[1];

то просто продублируется (один раз в сомбобоксе и еще раз в лейбле)

Автор: Klin 8.5.2007, 01:28
Возможно, индекцсацию нужно будет вести с 1, а в нулевой элемент записывается вся информация. Завтра посмотрю.

Автор: CrasyMen 8.5.2007, 20:02
Цитата(CrasyMen @  8.5.2007,  00:03 Найти цитируемый пост)
для формы на которой есть один ComboBox (в него вводим из файла название напр. "Seagate Barracuda 36ES"), остальные характеристики выводятся в Label1 - Label8. Если нечего выводить то Caption в Label должна быть пустой. В даном случае пустыми должны быть Label5 - Label8.

помогите пожалуйста. я уже совсем измотался.

Автор: dumb 9.5.2007, 01:09
CrasyMen, прикрепи файл данных.

Автор: CrasyMen 9.5.2007, 07:26
dumb,  он в первом посту

Автор: dumb 9.5.2007, 16:00
я не слепой, однако. по твоим словам, разделителями в этом файле являются символы табуляции(\t). попробуй теперь скопировать то, что у тебя в первом посте, в файл.

Автор: CrasyMen 9.5.2007, 17:04
В *.txt файле разделителялось табами. А на форуме видимо символы табуляции(\t) переделались в пробелы.
Вот файл:

Автор: dumb 10.5.2007, 14:19
CrasyMen, держи проект-заготовка.

Автор: CrasyMen 10.5.2007, 17:35
dumb,  спасибо огромное!
Вы первый кому я повышу репутацию.

Автор: Romikgy 10.5.2007, 17:55
Цитата(CrasyMen @  10.5.2007,  16:35 Найти цитируемый пост)
Вы первый кому я повышу репутацию. 

хех .... ибо раньше просто не мог smile

Автор: CrasyMen 23.5.2007, 16:41
Мне надо чтобы при нажатии кнопки на одной форме появлялась вторая (которая и выводит содержимое файла в комбобокс и лейблы). Компонента  OpenDialog не надо, потому что известно расположение файла ( data/harddisk.dat ).
Это я уже сделал.
Теперь мне надо еще чтобы в комбобоксе выводились винчестера, год выпуска которых меньше текущего. Тоесть характеристика "год выпуска" (которая есть в файле данных) сравнивалась с глобальной переменной, которая обозначает текущий год. 

dumb, было бы очень хорошо если бы вы переделали свой код, потому что это не приведет к новым вопросам. Можно сделать просто 6 кнопок для назначения текущего года (2000 - 2006).

Автор: CrasyMen 23.5.2007, 18:38
Хотя, я сам уже придумал.  только скажите кто-нить как считать часть строчки между первым и вторым символом табуляции (\t).

Автор: Romikgy 24.5.2007, 00:01
Цитата(CrasyMen @  23.5.2007,  17:38 Найти цитируемый пост)
только скажите кто-нить как считать часть строчки между первым и вторым символом табуляции (\t). 

разбиваем строку по знакам табуляции
Цитата(CrasyMen @  7.5.2007,  23:03 Найти цитируемый пост)
cur_str->Text=StringReplace(file_->Strings[i],"\t","\n",TReplaceFlags()<<rfReplaceAll);

берем подстроку между 1 табом и вторым 
Цитата(CrasyMen @  7.5.2007,  23:03 Найти цитируемый пост)
ListBox2->Items->Add(cur_str->Strings[1]);

 smile 

Автор: CrasyMen 24.5.2007, 07:04
а если cur_str будет типа String а не TStringList, то как?

Автор: Romikgy 26.5.2007, 09:05
Цитата(CrasyMen @  24.5.2007,  06:04 Найти цитируемый пост)
а если cur_str будет типа String а не TStringList

и на кой? делить сложнее

Автор: CrasyMen 17.6.2007, 17:14
есть код, любезно предоставленный dumb'ом:
Код

//---------------------------------------------------------------------------
void __fastcall TFCompSel::Timer1Timer(TObject *Sender)
{
  cboxModel->Clear();
  cboxModelSelect(0);
  if (!fn.IsEmpty())
  {
    datfile = new TStringList();
    try {
      datfile->LoadFromFile(fn);
      for (int i=0; i < datfile->Count; ++i)
      {
        AnsiString s = datfile->Strings[i];
        
        cboxModel->AddItem(s.SubString(1,AnsiPos('\t',s)-1), 0);
      }
    }
    catch (Exception &E)
    {
      ShowMessage("Error " + E.Message + " while read file " + fn);
    }
  }
   Timer1->Enabled = false;

}
//---------------------------------------------------------------------------
void __fastcall TFCompSel::cboxModelSelect(TObject *Sender)
{
    Button1->Enabled = true;
    int i;
    TStringList *cur_str = new TStringList();
    try {
        cur_str->Text = StringReplace(datfile->Strings[cboxModel->ItemIndex],"\t","\n",TReplaceFlags()<<rfReplaceAll);
      for (int j=1; j < 11; ++j)
      {
        TLabel *pl = dynamic_cast<TLabel*>(FindComponent("lbl_Prm"+IntToStr(j)));
        if (pl) pl->Caption =  j < cur_str->Count ? cur_str->Strings[j] : AnsiString("");
      }
    }
    catch (Exception &E)
    {
      ShowMessage("Error " + E.Message + " while parse line: " + datfile->Strings[i]);
    }
    delete cur_str;

    TSearchRec a;
    if ( FindFirst("images\\" + cboxModel->Text + ".jpg", faAnyFile, a ) == 0 )
        Image1->Picture->LoadFromFile("images\\" + cboxModel->Text + ".jpg");
    else Image1->Picture->LoadFromFile("images\\None.jpg");
}

как сделать чтобы в cboxModel добавлялись только те строчки, в которых после первого символа табуляции (\t) следует "2000"?

Автор: dumb 19.6.2007, 09:03
Цитата(CrasyMen @  17.6.2007,  17:14 Найти цитируемый пост)
как сделать чтобы в cboxModel добавлялись только те строчки, в которых после первого символа табуляции (\t) следует "2000"? 


Код

...
        AnsiString s = datfile->Strings[i];
        int pos = AnsiPos('\t',s);
        if (s.SubString(pos+1,4) == "2000")
          cboxModel->AddItem(s.SubString(1,pos-1), 0);
...


а вообще, если тебе нужен результат, а само программирование не "уперлось"(ибо вещи, о которых ты спрашиваешь в течение довольно длительного времени, являются элементарнейшими), то стоит создавать тему в "Центре помощи" с просьбой о модификации существующего кода.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)