Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

28.06.2008, 16:42

[WinApi] Dateien aus einer .txt datei auslesen

Ich möchte aus einer .txt Datei die nur zahlen enthält, zahlen solange in __int64 lvl_start speichern bis ich z.b. die zahl 37 erhalte. __int64 lvl start hat nun den wert 37 die nöchste zahl soll jetzt in __int64 exp gespeichert werden. __int64 benutz ich weil ich es mit 11-stelligen zahlen zu tun hab.
einlesen wollte ich dateien mit:

Quellcode

1
std::ifstream dat_ein;

das sieht dann so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 __int64 lvl_start;
__int64 lvl_end;
__int64 lvl_data;

std::string dateiname = ("list.txt");
          std::ifstream dat_ein;

          dat_ein.open(dateiname.c_str());

                  while(lvl_start != lvl_data)
        {
                      dat_ein >> lvl_data;
        }

          dat_ein >> exp;


Nur leider klappt es nicht, als fehlermeldung bekomm ich:

Quellcode

1
error C2679: Binaerer Operator '>>' : Kein Operator definiert, der einen rechtsseitigen Operator vom Typ '__int64' akzeptiert (oder keine geeignete Konvertierung moeglich)


gibt es für WinApi eine eigene Variante der Dateieinlesung??

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

28.06.2008, 16:46

Das Problem ist, dass die Standardbibiothek Datentypen, wie __int64 nicht kennt. (Was dir die Fehlermeldung auch bereits sagt). Also benutze einen Typen, den er kennt und dann kannst du immernoch in den anderen typen casten.

3

28.06.2008, 16:47

oje und wo soll ich dann eine 11-stellige zahl speichern? in string und dann nach __int64 konvertieren?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

28.06.2008, 17:00

Hmm. Also __int64 sollte er eigentlich kennen. (bei mir long long). Aber ich denke mal, dass der Fehler wo anders liegt.
Er sucht da irgendwie einen Binären Operator. Ohne weiteren Code kann ich jetzt nichts zu sagen. Ausser du hast den Operator >> irgendwie überladen?

5

28.06.2008, 17:14

hier mal der code :?

C-/C++-Quelltext

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
case ID_BTN_UEBERNEHMEN:
        {
          char szText[256];
          char szText1[256];
          char szText3[256];
          __int64 lvl_start;
          __int64 lvl_end;
          __int64 lvl_data;
          __int64 exp;
          __int64 dif;
          __int64 bb;



          

          // Text aus der Editbox holen

          GetWindowText (hEditBox, szText, 256);
          GetWindowText (hEditBox2, szText3, 256);


          lvl_start = atoi (szText);
          lvl_end = atoi(szText3);

          


          if(lvl_start >= 100 || lvl_start <= -1 || lvl_end >= 100 || lvl_start <= -1)
          {
              int Resultat;


              Resultat = MessageBox (hWnd, "Please chose your lvl from lvl 0 to lvl 100!", "Wrong lvl!", MB_OK | MB_ICONINFORMATION);

              if (Resultat == IDOK)
              {
                  lvl_start = 0;
                  lvl_end = 0;
                  return (0);
              }

              lvl_start = 0;
              lvl_end = 0;
          }



          //lvl datenbank, addieren etc...


          std::string dateiname = ("list.txt");
          std::ifstream dat_ein;

          dat_ein.open(dateiname.c_str());

          if(!dat_ein)
          {
              int Resultat;

              Resultat = MessageBox (hWnd, "list.txt could not be opened!", "Error opening a file!", MB_OK | MB_ICONERROR);

              if (Resultat == IDOK)
              {
                  
                  return (0);
              }
          }

                  while(lvl_start != lvl_data)
        {
                      dat_ein >> lvl_data;
        }

          dat_ein >> exp;




          dif = lvl_end - lvl_start;

          /*if( dif==1)
          {
            cout << endl << w<< exp << x<< endl;

            goto ende;
          }*/



          for( dif = dif-1; dif >= 0; --dif)
          {
            dat_ein >> lvl_data;
            dat_ein >> bb;

            



            exp=exp+bb;
          }

          //cout << endl << w<< exp << x <<endl;










          //lvl datenbank ende...


          itoa(exp,szText1,10);





          SetWindowText (hText6, szText1);

          return (0);

        }


die datei list.txt ist so aufgebaut:
[list]
0 0
1 118
2 470
3 1058
4 1880
.
.
.
96 445992756
97 478197705
98 511933580
99 547263228
[/list]

benutz ich anstatt __int64 nur int klappt bei mir alles gut, nur ich kann keine ganz langen zahlen mehr richtig anzeigen...

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

28.06.2008, 17:24

Also bei mir kompiliert das anstandslos. Was haste den für einen Compiler?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

28.06.2008, 17:32

Bei älteren Visual C++ Compilern gibts keine Version für __int64 vom >>-Operator. Für diese Fälle musst du dir selbst eine Version schreiben:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
#if _MSC_VER <= 1200

inline std::istream& operator>>( std::istream& stream, __int64& value )
{
    char buff[ 20 ];
    stream >> buff;
    value = _atoi64( buff );
    return stream;
}

#endif
@D13_Dreinig

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

9

13.07.2008, 13:31

Bringt ihm aber eh wenig, da er mit atoi am Anfang umwandelt ... ist ein einfacher integer, demnach ;)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Werbeanzeige