Поиск:

Ответ в темуСоздание новой темы Создание опроса
> запись FILE* (закладка в файле) 
:(
    Опции темы
Sash31
Дата 25.12.2006, 01:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Пишу на BC++B  программу для поиска по flat-файлу (текстовая БД)
По запросу программа просматривает файл построчно (fgets) и когда встречает слово "LOCUS" (начло новой записи БД), должна сохранить указатель на эту строку, чтобы можно было к ней вернуться и продолжить чтение файла с неё... 
Вот, что есть... (но не работает)   (((

Код

FILE *SoEntry(FILE *fp)     // fp - текущее положение указателя в файле
{
char *NextStr;
NextStr = new char[100];                           
FILE* Ptr;                          //Ptr - временный указатель (чтобы не потерять тек. зн-е fp)
Ptr = fp;


fgets(NextStr, 100, Ptr);
if (strstr(NextStr,"LOCUS") != NULL) return fp;
return NULL;
}



Подскажите, что не так? Может требуются принципиальные изменения? (Другой метод)
Когда мы используем fgets(Str, 100, fp), указатель fp перескакивает на след. строку?
PM MAIL   Вверх
szz
Дата 25.12.2006, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1289
Регистрация: 31.5.2005
Где: Moscow, Jerusalem

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



Ну смотри, во-первый ты рубишь по 100. А вдруг локус порежется? хз какой длины у тебя в файле строки.
Потом - где вообще цикл пробега по всему файлу? У тебя тут только указанные первые 100 читаются и все. Или цикл снаружи где-то?


--------------------
PM   Вверх
Sash31
Дата 25.12.2006, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да, цикл снаружи... Мне казалось, fgets(; 100; ) "режет" до 100 или до конца строки, если тот наступит раньше... Разве нет?

Кстати, в этом файле все строки оканчиваются \n... Может можно как то считывать до \n?
типа
 
while (ch != '\') сh = fgetc(fp);

?
PM MAIL   Вверх
Syrex
Дата 25.12.2006, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



попробуй getline
PM MAIL ICQ   Вверх
Partizan
Дата 25.12.2006, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



да смари дебаггером содержимое NextStr так и найдёшь где ошибка...


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Bima
Дата 26.12.2006, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



я не знаю, что у тебя не работает, но вот я взял твой код и все у меня работает. Возможно ты свою процедуру не правильно вызываешь, но здесь не телепаты, поэтому в будущем приводи весь код!!!
вот код который я накидал за 10 минут:
Код

#include "kod.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#define end_str 15 // количество строк в файле
TForm1 *Form1;
FILE *SoEntry(FILE *fp);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner):TForm(Owner){}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
FILE *stream;
FILE *ret;
stream = fopen("test.txt", "r+");
for (int i=1; i<end_str; i++) // Здесь обязательно нужно знать сколько строк у тебя в файле (end_str), иначе будет ошибка!!!!
   {
   ret=SoEntry(stream);
   if (ret!=NULL) i=end_str; //принудительный выход из цикла, когда придет ненулевой указатель.
   }
fclose(stream);
}
//---------------------------------------------------------------------------
FILE *SoEntry(FILE *fp){
char *NextStr;
NextStr = new char[100];
FILE* Ptr;
Ptr = fp;

fgets(NextStr, 100, Ptr);
Form1->Memo1->Lines->Add(AnsiString(NextStr)); // Это строка вставлена для отладки, ее можно заремировать!!!
if (strstr(NextStr,"LOCUS") != NULL) return fp;
return NULL;
}
//---------------------------------------------------------------------------

на форме одна кнопка и Мемо для отладки.



--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
Bima
Дата 26.12.2006, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот еще примерчик
посмотри, может тебе поможет
Код

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "kod.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TStringList *MyStringList = new TStringList();
int SoEntry(int fp);
int Count;
int Zakladka;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner):TForm(Owner){}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
MyStringList->LoadFromFile("test.txt");
Count=MyStringList->Count;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
delete MyStringList;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{ // найти первую позицию слова LOCUS в файле
Zakladka=SoEntry(0); // указываем первую строку (0)
if (Zakladka!=(0))
   Memo1->Lines->Add(IntToStr(Zakladka)); // выводим номер закладки в Мемо
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Zakladka=SoEntry(Zakladka+1); // указываем следующую строку после найденой
if (Zakladka!=(0))
   Memo1->Lines->Add(IntToStr(Zakladka));// выводим номер закладки в Мемо
}
//---------------------------------------------------------------------------
int SoEntry(int fp)
{
int Ret;
if (fp >= Count)  return 0;
for (int i=fp; i<Count; i++)
   {
   Ret=AnsiCompareText(MyStringList->Strings[i],"LOCUS");
   if (Ret==0)
      {
      Ret=i;
      i=Count;
      }
   else
      Ret=fp-1;// нужно, если цикл дошел до конца   
   }
return Ret;
}
//---------------------------------------------------------------------------


На форме 2 кнопки и Мемо. Первая кнопка ищет первое вхождение слова LOCUS, затем нужно использовать вторую кнопку для нахождения всех остальных слов LOCUS в файле.


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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