beim öffnen von dateien fehlt ne menge :(



  • hallo, ich möchte eine doc-datei in einem string laden und dann damit weiter arbeiten. leider kann ich nur die ersten acht zeichen sehn.
    notepad kanns doch aber auch ...

    ich habs jetzt so:

    TStringList *slFile = new TStringList;
    slFile->LoadFromFile("C:\\test.doc");
    ShowMessage(slFile->GetText());
    

    danke für eure hilfe.



  • Tja, DOC ist ein binäres Format... Das bedeutet, dass an beliebigen Stellen ein 0-Byte stehen kann. Das wiederum bedeutet für die Standard-String-Funktionen, dass der String zu Ende ist. (C-Definition). Notepad kann das vermutlich nur, weil er die NULL-Bytes mit einem anderen Zeichen ersetzt.

    -junix



  • und wie kann ich die null mit einem anderen zeichen ersetzen?

    so?:

    AnsiReplaceText(text, "\0", " ")
    


  • Nein, natürlich musst du zunächst die Datei binär verarbeiten. Also mit einem Char-Puffer die Datei einlesen, durch den Puffer gehen und wenn das Zeichen Null ist durch z.B. ' ' ersetzen.

    -junix



  • so, ich glaubs, ich habs:

    FILE *file;
      char buf[20000];
    
      file = fopen("c:\\test.doc", "rb");
    
      fread(buf, strlen(buf)+1, 1, file);
    
      fclose(file);
    
      for(int i = 1; i < strlen(buf)+1; i++)
        if(buf[i] == '\0')
          buf[i] = ' ';
    
      Memo1->Text = buf;
      {
    

    aber komischer weise muss ich mehrmals auf den button klicken, damit sich das richtige "zeichenchaos" zeigt



  • upsi, die geschweifte klamme muss natürlich weg



  • mmmmmh

    FILE *file;
      char buf[20000];
    
    /* diesen Puffer solltest du mit memset gescheiterweise noch 0 setzen. */
    
      file = fopen("c:\\test.doc", "rb");
    
      fread(buf, strlen(buf)+1, 1, file);
    /* das geht unter Umständen schief. da der Speicherinhalt nicht definiert ist, kann es durchaus sein, 
       dass z.B. an der 4. stelle bereits ein Nullzeichen steht. Die Folge davon wäre dann, dass
       strlen() nur 4 zurückgibt.... */
    
      fclose(file);
    
      for(int i = 1; i < strlen(buf)+1; i++)
        if(buf[i] == '\0')
          buf[i] = ' ';
    
      Memo1->Text = buf;
      {
    


  • aha, keine ahnung wie ich das umsetzen soll, aber ich hab mal noch was versucht, was doch eigentlich funtkionieren sollte. jetzt zeigt er mir aber nach dem drücken auf den button nur ein ">".

    FILE *file;
      char buf;
      AnsiString text = "";
    
      file = fopen("C:\\test.doc", "rb");
    
      do
      {
        buf = fgetc(file);
    
        if((buf >= 32) && (buf <= 255))//122))
          text += buf;
      }
      while(buf != EOF);
    
      Memo1->Text = text;
    
      fclose(file);
    


  • mit OLEAutomation gehts am einfachsten.

    Öffne die Datei mit Word über OLE.



  • ochneee, da kenn ich mich noch weniger aus.
    außerdem will ich ja zum schluss kein text sehn, sondern ich will nach wörtern suchen.



  • ich hab jetzt endlich, dass was ich haben wollte 😃

    wenn jemand meint, dass da was nicht stimmt, bitte posten - danke.

    ifstream   stFile;
    char       cBuffer;
    AnsiString asText = "";
    
    stFile.open("C:\\test.doc", ios::binary);
    
    if(stFile.is_open())
    {
      while(!stFile.eof())
      {
        stFile.get(cBuffer);
    
        if((cBuffer >= 32) && (cBuffer <= 122))
          asText = asText + cBuffer;
      }
    
      Memo1->Lines->Add(asText);
    }
    else
      ShowMessage("fehler beim öffnen");
    


  • ochmenno, mir is grad aufgefalln, dass der keine umlaute anzeigt. und wenn ich ein unsigned char nehme, dann geht gar nix mehr 😞



  • Lies doch einfach bis zum nächsten '\n' ein, dann hast Du in jedem Fall die komplette Zeile. Wie das geht, sagt Dir der Körnig-Reich (Cernighan/Ritchey), oder Du suchst generell mal nach Dateioperationen in der BCB-Hilfe. Ich habe sowas schon mal gemacht, kann aber gerade den passenden Code dafür nicht wiederfinden.
    Spontan würde ich sagen: Solange Zeilen lesen, bis in irgendeiner '\n' vorkommt, und bis dahin die gelesenen anenanderkleben mit strcat oder so.


Anmelden zum Antworten