[Wichtig!!]Textdatei



  • Hi,

    ich hab ein kleines Problem.. Und zwar hab ich zwei Textdateien in der Männer- und Frauennamen stehen.. und man gibt jetzt im Programm einfach mal nen Namen ein und das Programm soll mir dann sagen (falls der Name in einer der beiden Dateien ist) ob es nun ein weiblicher oder männlicher Name ist..

    Lese ich jetzt jede Dateien komplett in zwei Arrays ein und vergleiche dann?? Was aber bei großen Dateien zu einem kleinen Problem wird oder??

    Oder kann ich direkt in der Datei suchen also sowas wie File.FindString?? Kann ich mir dann auch die Zeilennummer ausgeben lassen??

    Oder gibts da noch andere Möglichkeiten??

    Ach und wie kann ich ne aus ner Datei die n-te Zeile auslesen (also z.B. die 6 Zeile)

    Bin für jede Hilfe dankbar!!

    [ Dieser Beitrag wurde am 14.09.2002 um 10:23 Uhr von Jens_Arpe editiert. ]

    [ Dieser Beitrag wurde am 14.09.2002 um 12:33 Uhr von Jens_Arpe editiert. ]



  • mit MFC CFile überhaupt nicht!
    Geht nur mit winapi



  • Geht nur mit winapi

    Begründe! Warum soll das nicht mit MFC funktionieren? 😕



  • weil man mit MFC nicht aus einer bestimmten Zeile einer Datei lesen kann!
    Man muss die ganze Datei einlesen und sich dann selbst die betreffende Zeile raussuchen



  • Das geht auch mit WinApi nicht. WinApi besitzt noch nicht mal eine Funktion um zeilenweise aus einer Datei auszulesen. Muss man sich dann sogar noch selber basteln.
    Das ist doch ganz normal das man nicht direkt eine spezielle Zeile lesen kann!



  • Datei auslesen

    s. cd9000's Beitrag



  • 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.


Log in to reply