C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
открыть файл, для считывания строк
Konstantine
Отправлено: 02.11.2006, 18:04


Мастер участка

Группа: Модератор
Сообщений: 545



чем открыть файл и считывать строки?
досовые fopen fgets глючат sad.gif
файл большой — до сотен Мб может доходить (хотя мне только последние строки читать)
Gal
Отправлено: 02.11.2006, 19:04


Станционный диспетчер

Группа: Участник
Сообщений: 124



Через класс ТStringList
CODE

ТStringList* StrListPtr = new TStringList();
StrListPtr->LoadFromFile(пролное имя файла);

StrListPtr->Count — количество строк
Grigoriy
Отправлено: 03.11.2006, 08:53


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE
(хотя мне только последние строки читать)

Да ему только последние строки нужно в память считать...
Примерная постановка задачи — примерный ответ.

Нужно переместить указатель файла в конец файла и с конца сканировать на такое двухбайтное слово
0x0A0D

То бишь после строки идут:
байт 0x0D — возврат каретки (Enter)
байт 0x0A — перевод на новую строку

Код приводить не буду...
Konstantine
Отправлено: 03.11.2006, 09:15


Мастер участка

Группа: Модератор
Сообщений: 545



читать в файл десятки и сотни мегабайт — неблагодарное дело...
второе — не знаю, но чё-то не по душе.
алгоритм следущий:
Инициализация:
- открываю файл
- ставлю позицию в конец файла
- запускаю таймер (0,5 — 1 сек)
работа по таймеру:
- считать с тек. позиции строки
- распарсить
- выдать в диаграму

и проблема — это как раз чтение по строкам...
Admin
Отправлено: 03.11.2006, 11:15


Владимир

Группа: Администратор
Сообщений: 1190



Может что-то наподобие:

CODE

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   AnsiString s;
   char ch;

   if((ih = FileOpen("D:\\CHANGE\\http060601.log", fmOpenRead)) == -1){
      ShowMessage("Ошибка чтения файла");
      return;
      }
   Read_Str(s);
   Label1->Caption = s;
   FileClose(ih);
}
//---------------------------------------------------------------------------
// чтение последней строки файла
void __fastcall TForm1::Read_Str(AnsiString &s)
{
  s = "";
  char ch;
  int n = 0;  // счетчик символов в строке
  FileSeek(ih, -1, 2);

  do{
      FileRead(ih, &ch, 1);
      s = AnsiString(ch) + s; n++;
      FileSeek(ih, -n-1, 2);
    }while(ch != '\n');
}
//-----


Konstantine
Отправлено: 03.11.2006, 11:35


Мастер участка

Группа: Модератор
Сообщений: 545



всё сделал, немножко не так...
в принципе-то вопрос состоял в уже готовой функции, а раз нет, то сделал так:
CODE
void __fastcall TForm1::Button1Click(TObject *)
{
if(f>0) return;
if(!FileExists(FileEdit->Text))
throw Exception("Нет такого файла");
f=FileOpen(FileEdit->Text,fmOpenRead+fmShareDenyNone);
if(f<=0)
throw Exception("Не открыт файл");
ShowMessage("Файл открыт");
if(pos==0)
pos=FileSeek(f,(__int64)0,2);
Timer1->Enabled=true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *)
{
__int64 p=FileSeek(f,(__int64)0,2);
__int64 size=p-pos;
if(size==0) return;
FileSeek(f,pos,0);
char *buf=new char[size];
FileRead(f,buf,size);
int i=0;
do
{int len=0;
while((i<size)&&(buf[i]!='\n')&&(buf[i]!=0))
{i++;len++;}
if(i>=size)
break;

ReadRow(buf+i-len,len); // чтение в структуру тек.класса

// вывод

i++;
}while(true);
pos=p;
}
//---------------------------------------------------------------------------

Вернуться в Вопросы программирования в C++Builder