Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Tags einlesen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
10.01.2010, 18:22 Uhr
SSJ



Hallo zusammen

Die Foren- und googlesuche hat mich nicht weiter gebracht, wenn ich etwas uebersehen habe, waere ich um einen Hinweis froh.

Ich habe ein Textfile, das ich nach Tags durchsuchen und die Integer zwischen den Zahlen auslesen muss, um sie zusammen zu addieren.
Ich habe einen Code, wie ich den gesamten Inhalt des Files ausgeben kann, aber nicht wie ich spezifisch darin suchen kann. Externe Bibliotheken zum parsen duerfen nicht gebraucht werden.
Ich hoffe jemand weiss Rat.

Mein Code bisher:


C++:
#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char *argv[])
{
    char     filename[128];
    ifstream file;
    char     zeile[1024];

    // Dateinamen einlesen
    cout << "Dateinamen eingeben: ";
    cin.getline(filename, 127);

    // Datei öffnen
    file.open(filename, ios::in);

    if (file.good())
    {
        // Wenn die Datei geoeffnet werden konnte...

        // An den Anfang der Datei springen
        file.seekg(0L, ios::beg);

        while (! file.eof())
        {
            // Die Datei zeilenweise auslesen
            file.getline(zeile, 1024);
            cout << zeile << endl;
        }
    }
    else
    {
        // Wenn die Datei nicht geoeffnet werååden konnte,
        // aus welchen Gruenden auch immer...
        cout << "Datei nicht gefunden." << endl;
    }

    return 0;
}




Das File, um das es sich handelt:


Code:
<circuit>
    <series>
        <resistance>"5"</resistance>
        <parallel>
            <resistance>"2"</resistance
            <series>
                <resistance>"1"</resistance>
                <coil>"1"</coil>
            </series>
        </parallel>
        <condenser>"2"</condenser>
    </series>
</circuit>


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.01.2010, 21:55 Uhr
Hans
Library Walker
(Operator)


Hi,

das sieht stark nach Hausaufgaben aus, und das Programm nach einem vorgegebenen Gerüst, dass Ihr um die eigentliche Aufgabe ergänzen sollt. Bisher fehlt darin jeglicher Ansatz, der darauf schliessen lässt, das Du mit den gefundenen Zahlen irgendwas machst. Guck also noch mal in Deine Unterlagen, wie man mit Zahlen hantiert, und wie man das in das Programm einbauen könnte. Wenn du dann nicht weiter kommst, zeig uns was Du hast. Dann können wir auch weiter helfen. Allerdings erledigen wir die Aufgaben nicht für Dich.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
10.01.2010, 22:39 Uhr
SSJ



Tag
Ja das ist tatsaechlich ein Projekt, das ich abgeben muss.
Der Code ist aber kein Geruest, sondern den habe ich geschrieben. Bis dahin bin ich gekommen, und weiter komme ich momentan nicht. Es ist eben genau mein Problem, das ich nicht weiss, wie ich die Zahlen ueberhaupt auslesen soll.
Ich hatte auf einen Hint gehofft, ob es in C++ eine Funktion gibt, die das macht; und natuerlich erwarte ich nicht, das jemand die Aufgabe fuer mich loest.
Ich habe schon den ganzen Tag google bemueht und in zwei Buechern rumgestoebert
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
10.01.2010, 23:23 Uhr
Hans
Library Walker
(Operator)


Hi,

okay, dann lassen wir das mal so stehen.
Zahlen stehen in der Datei natürlich in Textform, d.h. als ASCII-Code. Und sinnigerweise sind sie auch noch von Anführungszeichen eingeschlossen, also so: "0". Dann wäre ein erster Schritt, nachdem Du eine Zeile gelesen hast,
* diese nach Anführungszeichen zu durchsuchen, indem Du alle Zeichen vergleichst.
* Wenn du ein Anführungszeichen gefunden hast, prüfst Du, ob es sich bei den folgenden Zeichen, um Ziffern handelt, bzw. die ASCII-Codes davon.
* Wenn dem so ist, rufst du eine Standardroutine wie beispielsweise atoi() auf, die Dir den Zahlenwert als int zurück gibt.
* Den merkst du Dir, und suchst hinter den zweiten Anführungszeichen weiter, bis die Zeile zu Ende ist.
* Das wiederholst Du solange, bis Du alle Zeilen durch hast.

Eine Kleinigkeit noch: atoi() ist eine C-Funktion, in C++ gibt es dafür mit Sicherheit noch eine andere Lösung, ich weis aber nicht, wie die heisst.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
11.01.2010, 15:32 Uhr
SSJ



Hallo
Danke fuer die Antwort.
Wie der Algorithmus aussieht weiss ich nur zu gut. Was ich nicht weiss, ist, welche Funktion diese Aufgabe uebernimmt.
Ich habe mit seekg() herumhantiert, aber bisher ist nichts rausgekommen; seit Tagen bin ich dran mich in iostream einzulesen und die einzelnen Funktionen davon auszuprobieren; jedes Mal motzt der Compiler.
Suche ich an der falschen Stelle?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
11.01.2010, 17:24 Uhr
0xdeadbeef
Gott
(Operator)


Bei derart kleinen Datenmengen wäre es wahrscheinlich einfacher, das ganze zuerst in einen String zu verpacken, etwa

C++:
#include <fstream>
#include <iostream>
#include <iterator>
#include <string>

int main() {
  std::ifstream fin("test.cc");
  std::string data(std::istreambuf_iterator<char>(fin.rdbuf()),
                   std::istreambuf_iterator<char>());


...und danach lässt sich das ganze mit ein bisschen Gefummel schon auseinandernehmen:

C++:
  std::string::size_type quote_open  = data.find('"');
  std::string::size_type quote_close = data.find('"', quote_open + 1);

  std::string num_str = data.substr(quote_open + 1,
                                    quote_close - quote_open - 1);


Die Zahlen auseinanderparsen würde man in C++ üblicherweise mit stringstream, etwa

C++:
#include <sstream>
#include <stdexcept>

template<typename to, typename from> to convert(from const &x) {
  to ret;

  std::stringstream fmt;

  fmt << x;
  fmt >> ret;

  if(!fmt) {
    throw std::invalid_argument("Fehler beim Konvertieren");
  }

  return ret;
}

// ...

int x = convert<int>("123");


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 11.01.2010 um 17:24 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
11.01.2010, 22:23 Uhr
Hans
Library Walker
(Operator)


Oh Beefy, Du bist ja mal wieder Genial!

@SSJ: In Deinem Programm fehlt u.a. eine int-Variable, die Du als Zählerindex verwendest, um das charfeld zu durchsuchen. Also etwa so:

C++:
int i=0;
while (zeile[i]!='\n') if (zeile[i]!='"') i++,continue;else cout<<zeile[i]<<endl;



Ist nicht getestet, aber so in etwa könnte das aussehen. Und die Variable für die Summe, die Du bilden sollst, fehlt ebenfalls.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: