[Wichtig!!]Textdatei



  • cd9000's Beitrag:

    getline von std::ifstream (mein Favorit).

    Und das gehört zu C++ (STL) und hat nichts mit WinAPI zu tun! Außerdem bietet CFile oder CStdioFile auch eine Möglichkeit zum zeilenweisen auslesen. Egal welche Funktionen man benutzt, man muss immer solange auslesen bis man an der gewünschten Zeile ankommt. Es gibt keine Funktionen zum direkten anspringen einer Zeile.



  • der Befehl Getline sagt mir was anderes...
    das man ne Datei Zeile für Zeile auslesen kann und danach die betreffende raussuchen kann ist mir auch klar! Bei mehrern tausend Zeilen dauert das allerdings länger!

    eigentlich ist mir das auch scheissegal...hab jetzt keine Lust darüber zu diskutieren (was nicht heißt das ich unrecht hab;))



  • Es geht nicht anders! Man muss sich von Zeile zu Zeile durcharbeiten, auch wenn's länger dauert. Es gibt keinen Befehl (gibt's in C++ überhaupt nicht) "Getline".



  • Original erstellt von <?????>:
    Es gibt keinen Befehl (gibt's in C++ überhaupt nicht) "Getline".

    MSDN

    [ Dieser Beitrag wurde am 14.09.2002 um 18:35 Uhr von BF_31 editiert. ]



  • Ich sehe da nichts von Getline. getLine, getline, GetLine, aber nicht Getline 😉
    C++ ist case-sensitive!



  • is ja gut...man sei nicht so kleinlich!



  • Hallo zusammen,

    aber mit ein klein wenig Phantasie, bekommt man da schon auch was mit MFC hin. Man kann sich ja einen Index basteln. Das wären 2 Funktionen, einmal den Index basteln und zum anderen danach wieder String für String auslesen (und dabei die Position anfahren). Aber normalerweise sollte man mit einem StringArray zurechtkommen.

    Grüße, Volle.

    P.S.: Nur so als Idee..

    void CTextFilePointerDlg::OnBuildIndex() 
    {
        // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
    
        CStdioFile source;
        CFileException error;
        //CArray <DWORD, DWORD> index;
        CString lineBuf;
    
        source.Open("e:\\source\\vc++\\test\\TextFilePointer\\Daten\\dummy.txt", CFile::modeRead, &error);
    
        if (error.m_cause)
        {
            error.ReportError();
        }
        else
        {
            while (source.ReadString(lineBuf))
            {
                index.Add(source.GetPosition());
            }
    
            source.Close();
        }
    }
    
    void CTextFilePointerDlg::OnReadByIndex() 
    {
        // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
    
        CStdioFile source;
        CFileException error;
        //CArray <DWORD, DWORD> index;
        CString lineBuf;
        int arrayPos = 0;
    
        source.Open("e:\\source\\vc++\\test\\TextFilePointer\\Daten\\dummy.txt", CFile::modeRead, &error);
    
        if (error.m_cause)
        {
            error.ReportError();
        }
        else
        {
            while (arrayPos < index.GetSize())
            {
                source.ReadString(lineBuf);
                SetDlgItemText(IDC_OUTPUT, lineBuf);
                source.SeekToBegin();
                source.Seek(index.GetAt(arrayPos), CFile::begin);
                Sleep(1000);
                arrayPos++;
            }
    
            source.Close();
        }}
    


  • ich bin so kleinlich, weil ich merke das du keine Ahnung hast!



  • Soweit ich weiß führt kein Weg daran vorbei die ganze Datei auszulesen... Um eine bestimmte Zeile zu erhalten kann man folgende Funktion benutzen...(Anm. Hab sie hier geschrieben und nicht in MSDEV. Könnten kleine Fehlerchen drin sein)

    CString GetFileLine(CString filename, int nLine, int nMaxLine = _MAX_PATH)
    {
      int curline = 0;
    
      // Datei öffnen
      FILE* file;
      if((file = fopen(filename, "r")) != NULL)
      {
        curline++;
        char line[nMaxLine];
        while(fgets(line,nMaxLine,file))
        {
          if(curline == nLine)
          {
            fclose(file);
            return CString(line);
          }
        }
        fclose(file);
      }
    }
    

    Eine Möglichkeit um das auslesen schneller zu machen wäre sich Seeks für bestimmte Dateipositionen (z.B. ab Seek 12347 beginnen Namen mit Anfangsbuchstaben 'J') zu merken. Die Suche nach dem Namen 'Jürgen' beispielsweise wäre um einiges schneller. Dies hätte aber zur Folge, dass du in deiner Namensdatei vorher Seeks speichern müsstest bevor du anfängst die Namen einzufügen...

    Ein paar Funktionen...
    fseek(...) - Geht zum angegebnen Seek in der angegebenen Datei.
    ftell(...) - Teilt dir die aktuelle Position in der Datei mit an der du dich befindest.

    Achso, und eine Bemerkung an den "case-sensitive-man". Es wird wohl keiner den Inhalt dieses Forums durch den Compiler schicken. Wenn ich 'Malloc' schreibe werden wohl schon die meisten verstehen dass ich 'malloc' meine, oder??? Ist klar, dass man beim coden kleinlich sein muss aber ist das nötig sich hier wie einen Halbgott aufzuspielen weil man weiss wie eine Funktion geschreiben wird...

    [ Dieser Beitrag wurde am 15.09.2002 um 16:50 Uhr von MaSTaH editiert. ]



  • Ist noch keiner auf die Idee gekommen bei sowas eine Datenbankabfrage zu machen? Da braucht man dann keine seeks oder sowas mehr, und suchen geht auch... alerdings ist das nicht besonders leicht...



  • Original erstellt von PanicMan:
    Ist noch keiner auf die Idee gekommen bei sowas eine Datenbankabfrage zu machen? Da braucht man dann keine seeks oder sowas mehr, und suchen geht auch... alerdings ist das nicht besonders leicht...

    Es wurde nach einer textdatei gefragt...warum sollten wir dann was anderes vorschlagen?

    @<ganzvielefragezeichen> wenn du meinst das ich keien Ahnung habe dann musst du ja nicht mit mir reden bzw. schreiben!



  • @<??????> : bevor du hier anfängst reg user als unwissend hinzustellen, reg dich erstmal und versteck dich nicht hinter einer anonymität...



  • Um den Streit hier zu schlichten. Es gibt keine Funktion um eine bestimmte Zeile auszulesen oder in Dateien zu suchen und dann auszulesen.
    Die ist auch der Grund warum es Datenbanken gibt.
    Eine atenbank macht auch nicht anderes als die Datei einzu lesen und zu vergleichen.
    Allerdings kann man auf eine Spalte einen Index setzen. Dieser Speicher entweder die Position in Text oder wiederum den Datensatzbezeichner. (z.B. ID als Autoincrement)
    Daduch kann direkt zu angegebenen Position in der Datei gesprungen werden um den Text dann auszulesen. Bitte jetzt keine genaue Erklärung zu Datenbanken, da ich selbst weiß, daß eine DB komplexer arbeitet. (Sort des Index,etc)
    Ich denke, wenn die Dateien mit den Namen so groß ist, solltest du eine DB benutzen und ihr die Arbeit überlassen. Dafür wurden DB programmiert.
    Solltest du das nicht wollen dann bleibt dir nicht übrig als die TXT zu Sortieren und einen Index über den Anfangsbuchstaben anzulegen und den Zeiger mit in den Index zu speichern. Dann mußt du nicht die ganze Datei duchsuchen sondern nur ab Beginn des Anfangsbuchstabens.


Anmelden zum Antworten