TStringList *ListStrings = new TStringList;
AnsiString ss;
ListStrings->LoadFromFile("file.log");
for(int n=0;n<ListStrings->Count;n++)
{
ss=ListStrings->Strings[n+1];
}
считывание строки из файла *.log
[COLOR="Red"]
type 15:15:30 ok code
type 15:15:31 ok code
type 15:15:32 ok code
[/COLOR]
В Word спрашивает при открытии log-файла выберите кодировку и подходит Юникод.
Я читаю, как в хелпе строки из этого log-файла:
Код:
у меня выводится яюТ
вопрос, как прочитать всё-таки строку?
WideCharToString
Пример файла. Пришлось его переименовать, так ка не разрешал прикреплять с расширением log
в начале подключаем модуль
#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
{
//-----------------------
///необходимо выполнить Какие-либо действия
//-----------------------
}
затем цикл продолжается на формирование второй строки и т.д. пока файл будет прочитан
Цитата:
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;
//....................................
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]
всё равно считывает яюТ вместо того, что в файле, то есть Юникод как побороть?
Эти "яюТ" и есть сигнатура. Текст идет после.
Код:
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;
//....................................
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);
lst->Text = astr.SetLength (astr.Length()-1).Delete (1,1);
Ну и конечно же, при анализе лога придётся отдельно обрабатывать символы табуляции '\t', щедро разбросанные по всему файлу. А то, если выводить текст на экран построчно, "как есть" - выглядеть это может не эстетично :(
потом, конечно, мне в голову не приходило, что Юникод 16 бит (
код от [COLOR="Blue"]el scorpio[/COLOR] работает!
В общем-то больше ничего и не нужно.
Вопрос остался только по функции, раз уж она была в этой теме fscanf(pfile,"%[^\n]",buf)!=NULL)//Считалась строка. она находится в buf - в моём случае, наверно, нужно использовать fwscanf? приведите пример
Код:
type 1.txt >2.txt
Можно ее вызывать через ShellExecute или WinExec. А потом парсить файл 2.txt обычным образом.
Цитата:
Как вариант, этой командой файл юникод превращается... превращается... в элега... ой !
Элегантно :).
После этот файл банально грузится в StringList методом LoadFile, не озадачивая простого пользователя ручным открытием/закрытием файла, равно как двойной буферизацией и конвертированием информации.