tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
9
ZUGRIFFE
1423
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von xFile
    xFile xFile ist offline Mitglied Silber
    Registriert seit
    Dec 2004
    Ort
    Hagen
    Beiträge
    60
    hallo,

    ich arbeite mit dem c++ builder 2010 und möchte (muss) eine utf-8 kodierte datei einlesen.
    habe schon mehrere stunden damit verbracht etwas zu finden was mich weiterbringt, hoffe ihr könnt mir helfen.

    der vorgang ist recht einfach: menü -> datei öffnen -> datei auswählen ... nun befinde ich mich in meiner funktion TForm1::Oeffnen(TObject *Sender).

    ich habe nun schon versucht die datei mit TFileStream einzulesen und den inhalt dann einer textbox / memobox zuzuweisen, funktioniert jedoch nicht.
    ziel ist es, den inhalt zb in einer TEdit oder Memo box anzeigen zu lassen.

    weiterhin habe ich dann die datei mit den win32 funktionen eingelsen, inhalt liegt nun als char string vor (mehre bytes entsprechen halt einem zeichen), jedoch bekomme ich die nicht nach unicodestring konvertiert um diese dann einer komponente der vcl zuzuweisen.

    danke euch schon mal!

    gruß adam
     

  2. #2
    Avatar von ComFreek
    ComFreek ComFreek ist offline [x] Let it be logic!
    tutorials.de Moderator
    Registriert seit
    Jun 2009
    Beiträge
    2.357
    Blog-Einträge
    4
    Zeig doch den Code mit TFileStream, damit müsste es doch klappen.
     
    mfg ComFreek

    Falls ich dir geholfen habe, würde ich mich über ein DANKE freuen!
    Kenn mich am besten aus in C++, WEB-Sprachen (PHP, HTML, JavaScript) und vllt. mehr
    [PHP] Überprüfen, ob Website erreichbarSicherheit in PHP-Codes schaffenGoogle Chrome-Extension für tutorials.dejson_compress()

  3. #3
    Avatar von xFile
    xFile xFile ist offline Mitglied Silber
    Registriert seit
    Dec 2004
    Ort
    Hagen
    Beiträge
    60
    der folgende code wirft eine Exception der Klasse EReadError: "Ungültiger Eigenschatfwert".
    Lasse ich den TReader weg und versuche es nur mit dem FileStream, dann weis ich nicht wie ich das in die Eigenschaft "Text" meiner Komponente bekommen soll.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    void __fastcall TForm1::Oeffnen1Click(TObject *Sender)
    {
        TFileStream *Streamer;
        TReader* rd;
     
        if(OpenTextFileDialog1->Execute())
        {
            Streamer = new TFileStream(OpenTextFileDialog1->FileName, fmOpenRead);
     
            try
            {
                rd = new TReader(Streamer, 100);
     
                rd->ReadListBegin();
                this->Memo1->Text = rd->ReadString();
                rd->ReadListEnd();
            }
            __finally
            {
                delete Streamer;
                delete rd;
            }
        }
    }

    bzw. wie bekomme ich es hin, dass ich überhaupt eine Textdatei einlesen kann (mit den Borland Klassen)?
    Im o.g. Code funktioniert ja dies noch nicht einmal. Es gibt zwar die Möglichkeit den Inhalt einer Komponente direkt abzuspeichern, jedoch sind dann darin auch "Steuerzeichen / Informationen" enthalten. Ich muss eine Textdatei einlesen die ein Menüaufbau repräsentiert (ähnlich XML).
    Geändert von xFile (20.01.11 um 12:04 Uhr)
     

  4. #4
    Avatar von xFile
    xFile xFile ist offline Mitglied Silber
    Registriert seit
    Dec 2004
    Ort
    Hagen
    Beiträge
    60
    habe es nun irgendwie hinbekommen, ob diese Lösung schön ist, kann ich nicht beurteilen.
    Nun muss ich nur noch die ersten 3 Byte überspringen, denn da steht das Byte Order Mark.
    Falls ihr Änderungsvorschläge habt, wäre ich dankbar.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    void __fastcall TForm1::Oeffnen1Click(TObject *Sender)
    {
        TFileStream *Streamer;
        char a[100];
     
        if(OpenTextFileDialog1->Execute())
        {
            Streamer = new TFileStream(OpenTextFileDialog1->FileName, fmOpenRead);
     
            try
            {
                Streamer->ReadBuffer(&a, 100);
                this->Memo1->Text = UTF8ToUnicodeString(a);
            }
            __finally
            {
                delete Streamer;
            }
        }
    }
     

  5. #5
    Avatar von ComFreek
    ComFreek ComFreek ist offline [x] Let it be logic!
    tutorials.de Moderator
    Registriert seit
    Jun 2009
    Beiträge
    2.357
    Blog-Einträge
    4
    Naja du kannst mit deiner Lösung nur 100 Zeichen einlesen.
    Ich würde zuerst auf ByteOrderMark (BOM) prüfen. Wenn es diese gibt entweder diese wegschneiden oder den Rest in eine andere Variable schreiben.
    Ich kenne mich leider nur ansatzweise in BCB 6 aus (nutze ihn aber auch nicht mehr), deshalb kann ich dir nur einen Ansatz verraten.
     
    mfg ComFreek

    Falls ich dir geholfen habe, würde ich mich über ein DANKE freuen!
    Kenn mich am besten aus in C++, WEB-Sprachen (PHP, HTML, JavaScript) und vllt. mehr
    [PHP] Überprüfen, ob Website erreichbarSicherheit in PHP-Codes schaffenGoogle Chrome-Extension für tutorials.dejson_compress()

  6. #6
    GillBates GillBates ist offline Mitglied Silber
    Registriert seit
    Oct 2007
    Ort
    BW
    Beiträge
    69
    Wenn es nicht unbedingt TFileStream sein muss, dann versuch mal folgendes:

    Code :
    1
    2
    3
    
    TStringList* sList = new TStringList;
    String FileName = "C:\test.txt";      // oder was auch immer
    sList->LoadFromFile(FileName , TEncoding::UTF8);

    grüssle
     
    GillBates


    Hab' gerade einen Intel und einen AMD aus dem 3. Stock geworfen ... der AMD war tatsächlich schneller!

    [X] <-- Nail here for new Monitor

  7. #7
    Avatar von xFile
    xFile xFile ist offline Mitglied Silber
    Registriert seit
    Dec 2004
    Ort
    Hagen
    Beiträge
    60
    Zitat Zitat von GillBates Beitrag anzeigen
    Wenn es nicht unbedingt TFileStream sein muss...
    hey,
    was benutzt du den grundsätzlich? hatte das auch mal mit StringList ausprobiert, aber habe dafür nur bsp. gefunden die direkt in eine komponente einlesen.

    gruß
    adam

    (mittlerweile funktioniert das einlesen bei mir mit filestream und auch das prüfen auf ByteOrderMark ist schon fertig)
     

  8. #8
    GillBates GillBates ist offline Mitglied Silber
    Registriert seit
    Oct 2007
    Ort
    BW
    Beiträge
    69
    Zitat Zitat von xFile Beitrag anzeigen
    hey,
    was benutzt du den grundsätzlich? hatte das auch mal mit StringList ausprobiert, aber habe dafür nur bsp. gefunden die direkt in eine komponente einlesen.
    Wenn möglich nutze ich TStringList. Ist einfach am bequemsten.
    Und TStringList hat rein gar nichts mit Komponenten zu tun. Ist nur ein Abbild der Datei im Speicher.
    Eben ein Array von Strings. Was du dann damit anstellt bleibt dir überlassen.

    Beispiel( Erweiterung meones Vorschlags ):

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    TStringList* sList = new TStringList;
    String FileName = "C:\test.txt";      // oder was auch immer
    sList->LoadFromFile(FileName , TEncoding::UTF8);
     
    for( int i = 0; i < sList->Items->Count; i++ )
    {
        Memo1->Lines->Add( sList->Strings[i] );
       // do something ...
    }
     
    // oder:
    Edit1->Text = sList->Strings[15];
     
    // oder ...
     
    // und speichern:
    sList->SaveToFile(FileName , TEncoding::UTF8);
    mal so aus der Hüfte geschossen


    Einfach mal die Online Hilfe, die SuFu hier, Google, ... bemühen. Lohnt sich.


    grüssle
     
    GillBates


    Hab' gerade einen Intel und einen AMD aus dem 3. Stock geworfen ... der AMD war tatsächlich schneller!

    [X] <-- Nail here for new Monitor

  9. #9
    Avatar von xFile
    xFile xFile ist offline Mitglied Silber
    Registriert seit
    Dec 2004
    Ort
    Hagen
    Beiträge
    60
    ah super vielen dank.
    hast recht, damit ist es wirklich einfacher! den member "items" gibt es beim c++ builder 2010 nicht, aber habe das nun über "capacity" gelöst.
    er liest die strings (ein string = eine zeile) zwar von hinten nach vorne in der datei, aber das ist kein problem.

    problem hier ist nun folgendes: überprüfung auf gültige utf-8 datei mit BOM. habe das sonst so gemacht, dass ich die ersten 3 zeichen eingelesen habe um erstmal zu prüfen ob BOM vorhanden. bei stringlist schneidet er die ja direkt ab und decodiert die datei.
    soll ich dann jetzt trotzdem meine überprüfung weiterhin nutzen und danach mit stringlist arbeiten? dann würde ich aber einmal mit streamfile und dann zusätzlich mit stringlist arbeiten.
     

  10. #10
    GillBates GillBates ist offline Mitglied Silber
    Registriert seit
    Oct 2007
    Ort
    BW
    Beiträge
    69
    Zitat Zitat von xFile Beitrag anzeigen
    ah super vielen dank.
    ... den member "items" gibt es beim c++ builder 2010 nicht, ...
    stimmt, sollte:

    Code :
    1
    2
    3
    4
    5
    
    for( int i = 0; i <sList->Count; i++ )    
    {
        Memo1->Lines->Add( sList->Strings[i] );
       // do something ...
    }
    heissen.

    Und für die Prüfung der BOM gibts zwar bestimmt elegantere Lösungen, aber wenns funktioniert dann ist das Ziel wohl erreicht.


    grüssle
     
    GillBates


    Hab' gerade einen Intel und einen AMD aus dem 3. Stock geworfen ... der AMD war tatsächlich schneller!

    [X] <-- Nail here for new Monitor

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 31.08.09, 15:11
  2. [] Textdatei einlesen?
    Von chilledkroete im Forum Java Grundlagen
    Antworten: 17
    Letzter Beitrag: 15.04.08, 11:19
  3. Verständnis-Probleme beim Textdatei in Variable einlesen
    Von Lautsprecher im Forum Visual Basic 6.0
    Antworten: 3
    Letzter Beitrag: 23.12.05, 09:49
  4. Textdatei einlesen
    Von Guntpat1981 im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 23.01.05, 00:29
  5. Textdatei einlesen?
    Von Lukasz im Forum Javascript & Ajax
    Antworten: 4
    Letzter Beitrag: 08.09.03, 17:26