доброго времени суток тру кодеры. столкнулся с проблемой, есть некий текстовый файл. с него надо кое что распарсить. т.к. парсить умею только паскалевскими или как их там строковыми функциями решил этот файл загружать в TStringList но не тут то было. Грузит одну строку и все. дальше никак. я так понимаю встречает какой то символ и думает что это конец файла. пробовал загрузить из TMemoryStream TStringList*file1=new TStringList; TMemoryStream*file=new TMemoryStream; file1->LoadFromFile("C:\\file.txt"); file1->LoadFromStream(file); аналогично - не грузит файл и все. подскажите пожалуйста как быть. заранее благодарю
1. Может в этой 1 строке и лежит весь текст из файла? 2. Посмотреть какие такие символы могут быть в файле через нормальный редактор, например Notepad++. Хотя бы какие там переносы строк. 3. У стринглиста есть свойство Linebreak или как-то так. Думаю, из названия все понятно? 4. Если все это не поможет, посмотри сколько реально загружается в TFileStream через Size, возможно проблема глубже. 5. Если в стрим нормально грузится, а в стринглист даже после установки LineBreak не грузится, смотрим какие такие байты находятся в файле. 6. Как последний вариант открываем или скидываем сюда метод ЛодФромСтрим и смотрим из за какого байта стопорится загрузка. Еще вариант - установка нужной кодировки. Какая версия дельфи? Какая кодировка файла?
в общем я выснил что файлик этот есть бинарный ( пробывал так (нашел в гугле): AnsiString text; TFileStream *in = new TFileStream("info",fmOpenRead); // открываем файл if( in != NULL ) { int size; in->Read(&size, sizeof(size)); if( size != 0 ) { try { text.SetLength(size); in->Read((void *)(text.data()), size); } catch( EOutOfMemory& ) {} } } delete in; ShowMessage(text); нифига не полуачается. кучу примеров перепробовал. пробовал этот файл в блокноте пересохранить - тогда открывает/загружает. может есть какой нибудь несложный выход типо как с блокнотом сохранить как? )
код какой-то странный у тебя file1->LoadFromFile("C:\\file.txt"); - загрузить в TStringList файл file1->LoadFromStream(file); - загрузить в TStringList данные из TMemoryStream который ничем не заполнен
это опечаточка просто ))) естесно вот так типа должно быть: TStringList*file1=new TStringList; TMemoryStream*file=new TMemoryStream(); file->LoadFromFile("C:\\log.txt"); Form1->Memo1->Lines->Add(file->Size); file1->LoadFromStream(file); ну и собсно суть вопроса теперь такова: как загрузить бинарный фал в стринглист?
M_script там в файле среди всего этого "бинарного мусора" нужные данные какбэ в виде обычного текста. я конечно понимаю что вопрос звучит бредово но надеюсь кто нибудь поймет меня
Эмм открой файл в hex редакторе и посмотри по каким смещениям расположены данные. Перемещай указатель fseek файла на нужное смещение и считывай нужные данные - это как убогий вариант
Code: Поочереди перебираешь байты Если байт от 33 до 126 добавляешь байт в строку иначе добавляешь строку в стринглист очищаешь строку
"else" лучше заменить на "else if(!str.IsEmpty())" или "else if(str.Length() > minlen)", чтобы убрать лишнее
в общем все сделал с горем пополам все гуд текст отфильтровал от "мусорных байтов" собралось все обратно в нормальном порядке стринг лист заполнен текстом из бинарника. если у кого то может когда то появится подобная нужда и он наткнется на эту тему (да такое часто случается гугл любит античат ) и подумает что автор жлоб сам узнал что хотел но не раскрыл тему а мне бы так пригодилось, оставляю здесь ссылку на годную инфу: http://www.cyberforum.ru/cpp-builder/thread270818.html и даже вторую http://sources.ru/builder/faq/029.html всех душевно благодарю. лучей добра вам тру кодеры античата
Решал решал недавно сходную задачу, только там надо было не выдернуть текст из бинарных данных, а детектить его.