Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C++ (auch C++0x und C++11) ::  Daten aus Datei einlesen  
Gehen Sie zu Seite Zurück  1, 2, 3  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
Klaus82
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2011
Beiträge: 171
Beitrag Klaus82 Mitglied 15:49:45 19.06.2012   Titel:              Zitieren

SeppJ schrieb:

(Achtung: Die mögliche Konvertierung der Streams nach void* führt manchmal zu interessanten Anfängerfehlern:
C++:
std::stringstream foo("Hallo Welt");
std::cout << foo;
Dies ist kein Compilerfehler, gibt aber nicht "Hallo Welt" aus, sondern einen kryptischen Zahlenwert.)


Öm, ja. Das hatte ich gestern erst. :rolleyes: :D

'unschuldig-an-die-Decke-guck-und-pfeif'

EDIT:
Na immerhin kann ich es reproduzieren:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <string>
#include <fstream>
 
int main()
{
    std::string filename("data.dat");
 
    std::ifstream infile(filename.c_str());
   
    std::cout << infile << std::endl;
   
    return 0;
}


Dann kriege ich
Code:
0x7fff0b4474f0


Also ich nehme an, dass ich mir damit die Adresse zeigen lasse, wo der 'Stream liegt' und ich eigentlich den Inhalt sehen möchte?

So wie ich z.B. einen Pointer derefenzieren muss, wenn ich das verändern möchte, worauf er zeigt?

Kann man das so vergleichen?

Gruß,
Klaus.


Zuletzt bearbeitet von Klaus82 am 15:54:35 19.06.2012, insgesamt 1-mal bearbeitet
Klaus82
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2011
Beiträge: 171
Beitrag Klaus82 Mitglied 16:19:33 19.06.2012   Titel:              Zitieren

Juhuuuu!!! Es funktioniert!

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <string>
#include <fstream>
 
int main()
{
    std::string filename("data.dat");
 
    std::ifstream infile(filename.c_str());
   
    std::string x_value, y_value;
   
    for(int i = 0; i < 4; ++i)
    {
        infile >> x_value;
        infile >> y_value;
   
        std::cout << x_value << "\t" << y_value << std::endl;
    }
   
    return 0;
}


Liefert tatsächlich:
Code:
1   1
2   4
3   9
4   16


Genau was in der Datei steht! :cool:

Gruß,
Klaus.
Sone
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.05.2012
Beiträge: 3135
Beitrag Sone Mitglied 17:12:42 19.06.2012   Titel:              Zitieren

Klaus82 schrieb:

Also ich nehme an, dass ich mir damit die Adresse zeigen lasse, wo der 'Stream liegt' und ich eigentlich den Inhalt sehen möchte?


Hier der Standard:

C++-Standard 27.4.4.3 Klausel 1 schrieb:
Returns: If fail() then a null pointer; otherwise some non-null pointer to indicate success then a value that will
evaluate false in a boolean context; otherwise a value that will evaluate true in a boolean context. The value type
returned shall not be convertible to int.


Es ist also (seit C++11?) nicht definiert, welchen Rückgabetyp der überladene Operator hat. Lediglich, dass der Rückgabetyp zu bool konvertierbar sein muss. Außerdem ist festgehalten, dass der Typ nicht zu einem Integral (sprich: zu int, long, short, char oder long long) konvertierbar sein darf (was eigentlich schon impliziert, dass es sich um einen Pointer handeln soll, ich sehe keinen Grund es anders zu machen).

Lange Rede kurzer Sinn: Versuch ja nicht, etwas mit dieser Adresse zu machen ;)

_________________
You want to do X, and you think Y is the best way of doing so. Instead of asking about X, you ask about Y. | Wenn man was zum Lachen braucht: Why C++ Sucks
camper
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.08.2004
Beiträge: 5771
Beitrag camper Mitglied 17:31:31 19.06.2012   Titel:              Zitieren

Hacker schrieb:
Klaus82 schrieb:

Also ich nehme an, dass ich mir damit die Adresse zeigen lasse, wo der 'Stream liegt' und ich eigentlich den Inhalt sehen möchte?


Hier der Standard:

C++-Standard 27.4.4.3 Klausel 1 schrieb:
Returns: If fail() then a null pointer; otherwise some non-null pointer to indicate success then a value that will
evaluate false in a boolean context; otherwise a value that will evaluate true in a boolean context. The value type
returned shall not be convertible to int.


Es ist also (seit C++11?) nicht definiert, welchen Rückgabetyp der überladene Operator hat. Lediglich, dass der Rückgabetyp zu bool konvertierbar sein muss. Außerdem ist festgehalten, dass der Typ nicht zu einem Integral (sprich: zu int, long, short, char oder long long) konvertierbar sein darf (was eigentlich schon impliziert, dass es sich um einen Pointer handeln soll, ich sehe keinen Grund es anders zu machen).

Lange Rede kurzer Sinn: Versuch ja nicht, etwas mit dieser Adresse zu machen ;)
Bitte nur als Standard zitieren, was auch Standard ist.

n3290 schrieb:
27.5.5.4 basic_ios flags functions [iostate.flags]
explicit operator bool() const;
1 Returns: !fail().
Sone
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.05.2012
Beiträge: 3135
Beitrag Sone Mitglied 17:38:22 19.06.2012   Titel:              Zitieren

camper schrieb:
Hacker schrieb:
Klaus82 schrieb:

Also ich nehme an, dass ich mir damit die Adresse zeigen lasse, wo der 'Stream liegt' und ich eigentlich den Inhalt sehen möchte?


Hier der Standard:

C++-Standard 27.4.4.3 Klausel 1 schrieb:
Returns: If fail() then a null pointer; otherwise some non-null pointer to indicate success then a value that will
evaluate false in a boolean context; otherwise a value that will evaluate true in a boolean context. The value type
returned shall not be convertible to int.


Es ist also (seit C++11?) nicht definiert, welchen Rückgabetyp der überladene Operator hat. Lediglich, dass der Rückgabetyp zu bool konvertierbar sein muss. Außerdem ist festgehalten, dass der Typ nicht zu einem Integral (sprich: zu int, long, short, char oder long long) konvertierbar sein darf (was eigentlich schon impliziert, dass es sich um einen Pointer handeln soll, ich sehe keinen Grund es anders zu machen).

Lange Rede kurzer Sinn: Versuch ja nicht, etwas mit dieser Adresse zu machen ;)
Bitte nur als Standard zitieren, was auch Standard ist.

n3290 schrieb:
27.5.5.4 basic_ios flags functions [iostate.flags]
explicit operator bool() const;
1 Returns: !fail().


In welchem Standard bin ich denn?

www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf
Und du?

_________________
You want to do X, and you think Y is the best way of doing so. Instead of asking about X, you ask about Y. | Wenn man was zum Lachen braucht: Why C++ Sucks
Klaus82
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2011
Beiträge: 171
Beitrag Klaus82 Mitglied 17:43:01 19.06.2012   Titel:              Zitieren

Hi,

jetzt natürlich die Masterfrage:
Wie kriege ich die Werte meiner Strings in wissenschaftlicher Notation in einen integer umgewandelt.
Also bisher habe ich
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <stdlib.h>
 
int main()
{
    std::string filename("f.positive.dat");
 
    std::ifstream infile(filename.c_str());
   
    std::string s1,s2,s3;
    double energy;
    long int number, integrated_number;
   
    for(int i = 0; i < 4; ++i)
    {
        infile >> s1;
        infile >> s2;
        infile >> s3;
 
        energy = atof(s1.data());
        number = atol(s2.data());
 
        std::cout << s1 << "\t" << s2 << std::endl;
        std::cout << energy << "\t" << number << std::endl;
    }
 
    return 0;
}


Was mir dann die Ausgabe liefert
Code:
1
2
3
4
5
6
7
8
0.000000000000000E+000  7.460079967364139E+023
0   7
3.300000000000000E-002  9.496822501615066E+020
0.033   9
6.600000000000000E-002  7.581970551546497E+020
0.066   7
9.900000000000002E-002  6.117185676453359E+020
0.099   6


Also die eine Zeile zeigt schön den Inhalt des Strings, während die andere Zahl gerade bei der Konvertierung in einen Integer leider versagt. :(

Also Bonus will ich das ganze sowieso noch durch 1.0e16 teilen, geht das nicht auch direkt mit dem String?
Die einfache Zeile
C++:
s2 / 1.0e16

führt leider zu einer Fehlermeldung.

Gruß,
Klaus.
Sone
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.05.2012
Beiträge: 3135
Beitrag Sone Mitglied 17:44:17 19.06.2012   Titel:              Zitieren

@Klaus: Lies doch gleich eine Zahl anstatt eines Strings ein :confused:

_________________
You want to do X, and you think Y is the best way of doing so. Instead of asking about X, you ask about Y. | Wenn man was zum Lachen braucht: Why C++ Sucks
Klaus82
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2011
Beiträge: 171
Beitrag Klaus82 Mitglied 17:45:59 19.06.2012   Titel:              Zitieren

Du meinst anstatt
C++:
infile >> s1;
infile >> s2;
infile >> s3;


eben nur
C++:
infile >> energy;
infile >> number;
infile >> integrated_number;


EDIT:
Ne, geht nicht. :(

Gruß,
Klaus.


Zuletzt bearbeitet von Klaus82 am 18:00:20 19.06.2012, insgesamt 1-mal bearbeitet
Sone
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.05.2012
Beiträge: 3135
Beitrag Sone Mitglied 18:17:24 19.06.2012   Titel:              Zitieren

Klaus82 schrieb:

eben nur
C++:
infile >> energy;
infile >> number;
infile >> integrated_number;


EDIT:
Ne, geht nicht. :(


Das kann nicht sein.
Zeig den Fehler.

_________________
You want to do X, and you think Y is the best way of doing so. Instead of asking about X, you ask about Y. | Wenn man was zum Lachen braucht: Why C++ Sucks
camper
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.08.2004
Beiträge: 5771
Beitrag camper Mitglied 18:40:46 19.06.2012   Titel:              Zitieren

Hacker schrieb:
In welchem Standard bin ich denn?

www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf
In gar keinem. Wie schon auf der ersten Seite steht handelt es sich nur um einen Entwurf, noch dazu um einen uralten (wie man auch an der url erkennen kann).

n3290 ist zwar auch nur ein Entwurf, bis auf die Formatierung (und Kleinigkeiten wie Vorwort etc.) aber identisch mit dem Standard.

Der letzte frei zugängliche Entwurf ist n3242, der recht nah am endültigen Standard ist (die Änderungen seit 3242 sind in 3292 aufgefüht, man kann es sich also theoretisch selbst zusammensuchen).
c++.de :: C++ (auch C++0x und C++11) ::  Daten aus Datei einlesen  
Gehen Sie zu Seite Zurück  1, 2, 3  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.