Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

считывание строки из файла *.log

9.0K
21 сентября 2006 года
j_anna
45 / / 10.07.2006
бьюсь уже не первый день со считыванием строки из log-файла. В Notebook этот файл выглядит, как:
[COLOR="Red"]
type 15:15:30 ok code
type 15:15:31 ok code
type 15:15:32 ok code
[/COLOR]

В Word спрашивает при открытии log-файла выберите кодировку и подходит Юникод.
Я читаю, как в хелпе строки из этого log-файла:
 
Код:
TStringList *ListStrings = new TStringList;
AnsiString ss;
ListStrings->LoadFromFile("file.log");
for(int n=0;n<ListStrings->Count;n++)
{
 ss=ListStrings->Strings[n+1];
}

у меня выводится яюТ
вопрос, как прочитать всё-таки строку?
1.9K
21 сентября 2006 года
SABROG
242 / / 26.01.2006
WideCharToString
9.0K
21 сентября 2006 года
j_anna
45 / / 10.07.2006
Пример файла. Пришлось его переименовать, так ка не разрешал прикреплять с расширением log
20K
21 сентября 2006 года
ssrgy
4 / / 20.09.2006
Например так:
в начале подключаем модуль
#include <fstream.h>

затем где-нибудь в основном коде пишем

[FONT="Courier New"]
FILE* pfile;

pfile=fopen("Имя_файла.log","r");

if(pfile!=NULL)
{
while(!feof(pfile))
{

if(fscanf(pfile,"%[^\n]",buf)!=NULL)//Считалась строка. она находится в buf
{

//-----------------------
///Какиелибо действия со строкой (buf)
//-----------------------
}
else
fscanf(pfile,"%h",&h);
}
fclose(pfile);
}[/FONT]

будьте внимательны
цикл while работает до тех пор пока не прочтется весь файл

поэтому, при формировании строки секция
if(fscanf(pfile,"%[^\n]",buf)!=NULL)//Считалась строка. она находится в buf
{

//-----------------------
///необходимо выполнить Какие-либо действия
//-----------------------
}
затем цикл продолжается на формирование второй строки и т.д. пока файл будет прочитан
309
21 сентября 2006 года
el scorpio
1.1K / / 19.09.2006
Ошибка !!!!
Цитата:

for(int n=0;n<ListStrings->Count;n++)
{
ss=ListStrings->Strings[n+1];
}


При отладке исключение ERangeError не выскакивает :confused:
Потому что в последней строке в таком случае может быть что угодно
Пиши

 
Код:
ss = ListStrings->Strings [n];


А вообще, как удалось сформировать log в Unicode? Или программа не твоя?
А 3 символа "яюТ" получается, потому что четвёртым символом в файле стоит '\0' - конец байтовой строки :(.
Решение:
Код:
TStringList *lst = new TStringList();
    //....................................
    int FileHandle = FileOpen ("File.log", fmOpenRead); // Открытие файла
    int FileSize = FileSeek(FileHandle, 0, 2); // Определение конца файла
    FileSeek (FileHandle, 0, 0); // Возвращение на начало файла
    wchar_t *pwsrt = new wchar_t [FileSize/2 + 1]; // Создание буфера
    FileRead (FileHandle, pwsrt, FileSize); // Чтение файла в буфер
    FileClose(FileHandle); // Закрытие файла
    lst->Text = pwsrt; // Загрузка файла в стринглист, приведение текста к AnsiString выполнится автоматически
    delete pwsrt; // Удаление буфера
    //...........
    delete lst;


[/code]
9.0K
21 сентября 2006 года
j_anna
45 / / 10.07.2006
всё равно считывает яюТ вместо того, что в файле, то есть Юникод как побороть?
1.9K
21 сентября 2006 года
SABROG
242 / / 26.01.2006
Формат файла определился как: UTF-16LE With signature.

Эти "яюТ" и есть сигнатура. Текст идет после.
309
21 сентября 2006 года
el scorpio
1.1K / / 19.09.2006
Код:
TStringList *lst = new TStringList();
//....................................
int FileHandle = FileOpen ("log1.txt", fmOpenRead); // Открытие файла
int FileSize = FileSeek(FileHandle, 0, 2); // Определение конца файла
FileSeek (FileHandle, 0, 0); // Возвращение на начало файла
wchar_t *pwsrt = new wchar_t [FileSize/2 + 1]; // Создание буфера
FileRead (FileHandle, pwsrt, FileSize); // Чтение файла в буфер
FileClose(FileHandle); // Закрытие файла
lst->Text =  pwsrt; // Загрузка файла в стринглист, приведение текста к AnsiString выполнится автоматически в конструкторе
delete[] pwsrt; // Удаление буфера <- здесь я исправил ошибку
//...........
for (int i = 0, Count = lst->Count; i < Count; i++)
    OutputDebugStringA (lst->Strings.c_str()); // Вывод текста в отладочную панель "Event Log"
delete lst;

Код работает
Есть два косяка. В начале первой строки и в конце последней ставится символ "?". Именно так конвертируются спецсимволы Unicode "FF FE" и "0A 00", которые добавила программа в свой лог. Удалять придётся вручную либо избавиться от них использованием следующих команд
 
Код:
AnsiString astr = pwsrt ;
lst->Text =  astr.SetLength (astr.Length()-1).Delete (1,1);

Ну и конечно же, при анализе лога придётся отдельно обрабатывать символы табуляции '\t', щедро разбросанные по всему файлу. А то, если выводить текст на экран построчно, "как есть" - выглядеть это может не эстетично :(
9.0K
22 сентября 2006 года
j_anna
45 / / 10.07.2006
log пишет не моя, естесственно, программа )
потом, конечно, мне в голову не приходило, что Юникод 16 бит (
код от [COLOR="Blue"]el scorpio[/COLOR] работает!
В общем-то больше ничего и не нужно.
Вопрос остался только по функции, раз уж она была в этой теме fscanf(pfile,"%[^\n]",buf)!=NULL)//Считалась строка. она находится в buf - в моём случае, наверно, нужно использовать fwscanf? приведите пример
1.9K
22 сентября 2006 года
SABROG
242 / / 26.01.2006
Как вариант, этой командой файл юникод превращается... превращается... в элега... ой ! В файл с ANSI кодировкой:

 
Код:
type 1.txt >2.txt


Можно ее вызывать через ShellExecute или WinExec. А потом парсить файл 2.txt обычным образом.
309
22 сентября 2006 года
el scorpio
1.1K / / 19.09.2006
Цитата:
Как вариант, этой командой файл юникод превращается... превращается... в элега... ой !


Элегантно :).

После этот файл банально грузится в StringList методом LoadFile, не озадачивая простого пользователя ручным открытием/закрытием файла, равно как двойной буферизацией и конвертированием информации.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог