Konstantine |
Отправлено: 02.11.2006, 18:04 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
чем открыть файл и считывать строки?
досовые fopen fgets глючат
файл большой — до сотен Мб может доходить (хотя мне только последние строки читать)
|
|
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;
}
//---------------------------------------------------------------------------
|
|
|