C++ builder проблема с загрузкой файла

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by good_man, 26 Apr 2011.

  1. good_man

    good_man New Member

    Joined:
    24 May 2010
    Messages:
    112
    Likes Received:
    3
    Reputations:
    -2
    доброго времени суток тру кодеры.

    столкнулся с проблемой, есть некий текстовый файл. с него надо кое что распарсить. т.к. парсить умею только паскалевскими или как их там строковыми функциями решил этот файл загружать в TStringList но не тут то было. Грузит одну строку и все. дальше никак. я так понимаю встречает какой то символ и думает что это конец файла.

    пробовал загрузить из TMemoryStream

    TStringList*file1=new TStringList;
    TMemoryStream*file=new TMemoryStream;

    file1->LoadFromFile("C:\\file.txt");
    file1->LoadFromStream(file);

    аналогично - не грузит файл и все.

    подскажите пожалуйста как быть. заранее благодарю
     
  2. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    1. Может в этой 1 строке и лежит весь текст из файла?
    2. Посмотреть какие такие символы могут быть в файле через нормальный редактор, например Notepad++. Хотя бы какие там переносы строк.
    3. У стринглиста есть свойство Linebreak или как-то так. Думаю, из названия все понятно?
    4. Если все это не поможет, посмотри сколько реально загружается в TFileStream через Size, возможно проблема глубже.
    5. Если в стрим нормально грузится, а в стринглист даже после установки LineBreak не грузится, смотрим какие такие байты находятся в файле.
    6. Как последний вариант открываем или скидываем сюда метод ЛодФромСтрим и смотрим из за какого байта стопорится загрузка.

    Еще вариант - установка нужной кодировки.
    Какая версия дельфи?
    Какая кодировка файла?
     
  3. good_man

    good_man New Member

    Joined:
    24 May 2010
    Messages:
    112
    Likes Received:
    3
    Reputations:
    -2
    в общем я выснил что файлик этот есть бинарный (


    пробывал так (нашел в гугле):

    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);

    нифига не полуачается. кучу примеров перепробовал.

    пробовал этот файл в блокноте пересохранить - тогда открывает/загружает.

    может есть какой нибудь несложный выход типо как с блокнотом сохранить как? )
     
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    код какой-то странный у тебя
    file1->LoadFromFile("C:\\file.txt"); - загрузить в TStringList файл
    file1->LoadFromStream(file); - загрузить в TStringList данные из TMemoryStream который ничем не заполнен
     
  5. good_man

    good_man New Member

    Joined:
    24 May 2010
    Messages:
    112
    Likes Received:
    3
    Reputations:
    -2
    это опечаточка просто )))

    естесно вот так типа должно быть:

    TStringList*file1=new TStringList;
    TMemoryStream*file=new TMemoryStream();

    file->LoadFromFile("C:\\log.txt");
    Form1->Memo1->Lines->Add(file->Size);

    file1->LoadFromStream(file);

    ну и собсно суть вопроса теперь такова: как загрузить бинарный фал в стринглист?
     
    #5 good_man, 27 Apr 2011
    Last edited: 27 Apr 2011
  6. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Зачем бинарный файл грузить в класс для работы со строками?
     
  7. good_man

    good_man New Member

    Joined:
    24 May 2010
    Messages:
    112
    Likes Received:
    3
    Reputations:
    -2
    M_script

    там в файле среди всего этого "бинарного мусора" нужные данные какбэ в виде обычного текста.

    я конечно понимаю что вопрос звучит бредово но надеюсь кто нибудь поймет меня :)
     
  8. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Эмм открой файл в hex редакторе и посмотри по каким смещениям расположены данные.
    Перемещай указатель fseek файла на нужное смещение и считывай нужные данные - это как убогий вариант
     
    _________________________
  9. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Code:
    Поочереди перебираешь байты
       Если байт от 33 до 126
          добавляешь байт в строку
       иначе
          добавляешь строку в стринглист
          очищаешь строку
     
    1 person likes this.
  10. good_man

    good_man New Member

    Joined:
    24 May 2010
    Messages:
    112
    Likes Received:
    3
    Reputations:
    -2
    M_script

    спасибо, респект! :) вроде понел :)
     
  11. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    "else" лучше заменить на "else if(!str.IsEmpty())" или "else if(str.Length() > minlen)", чтобы убрать лишнее
     
  12. good_man

    good_man New Member

    Joined:
    24 May 2010
    Messages:
    112
    Likes Received:
    3
    Reputations:
    -2
    в общем все сделал с горем пополам :) все гуд :) текст отфильтровал от "мусорных байтов" собралось все обратно в нормальном порядке :) стринг лист заполнен текстом из бинарника.

    если у кого то может когда то появится подобная нужда и он наткнется на эту тему (да такое часто случается гугл любит античат :) ) и подумает что автор жлоб сам узнал что хотел но не раскрыл тему а мне бы так пригодилось, оставляю здесь ссылку на годную инфу:

    http://www.cyberforum.ru/cpp-builder/thread270818.html
    и даже вторую
    http://sources.ru/builder/faq/029.html

    всех душевно благодарю. лучей добра вам тру кодеры античата :)
     
  13. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Решал решал недавно сходную задачу, только там надо было не выдернуть текст из бинарных данных, а детектить его.