[C++] probleem met inlezen bestand *

Pagina: 1
Acties:

  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 21:41
Ik moet een opdracht maken die vanaf 1 regel cijfers inleest. Hier moet ik dan later een driehoek van maken.De cijfers kunnen varieren van 1 tot 1000 en zijn gescheiden door een tab de 3 cijfers worden beeindigd door END aan het einde van de file te zetten.


Dit character voor character inlezen gaat goed, ook detecteerd hij de tabs enzo. Alleen als ik ze dan weer ga geven krijg echt van die wazige tekens te zien. Meer als er een fout zit in de pointers ofzo.

Please help me.
code:
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
124
125
126
127
128
#include <vcl.h>
#pragma hdrstop
#include <iostream.h>
#include <fstream.h>
#include <fstream>
#include <string.h>
#define TAB "\t"




//---------------------------------------------------------------------------

#pragma argsused

class CTriangle {
    int a, b, c;
  public:
    CTriangle(){};
    ~CTriangle(){};
    void set_valueA (int);
    void set_valueB (int);
    void set_valueC (int);
    int get_from_file(CTriangle);
    int get_valueA();
    int get_valueB();
    int get_valueC();


  //  int a, b, c;
};

const char * filename = "triangle.txt";


void CTriangle::set_valueA (int aa) {
  a = aa;
}

void CTriangle::set_valueB (int bb) {
  b = bb;
}

void CTriangle::set_valueC (int cc) {
  c = cc;
}


int CTriangle::get_valueA(){
return a;
}

int CTriangle::get_valueB(){
return b;
}

int CTriangle::get_valueC(){
return c;
}

int get_from_file(CTriangle& test){

  char * buffer;
  char a[50],b[50],c[100],END[50];

  long size,size2;
  int iTeller=0;
  int iTeller2=0;
//  size2 = 2;

  ifstream file (filename, ios::in|ios::binary|ios::ate);
  size = file.tellg();
  file.seekg (0, ios::beg);
  while (iTeller != size) {
    buffer = new char [size];
    file.read (buffer, 1) ;

    if (!strcmp(buffer,TAB))
    {
     cout << "tab found" << endl;
     iTeller2++;
    }
    else
    {
    if (iTeller2 == 0)
    {
      cout << buffer << endl;
      strcat(a,buffer);
    }
    if (iTeller2 == 1)
    {
      cout << buffer << endl;
      strcat(b,buffer);
    }
    if (iTeller2 == 2)
    {
      cout << buffer << endl;
      strcat(c,buffer);
    }
    if (iTeller == 3)
    {
     strcat(END,buffer);
       if (END== "END")
       {
         break;
       }
    }
    }
    iTeller++;
  }
  file.close();
  cout << "the complete file is in a buffer" << endl;
  cout << a << endl;
  cout << b << endl;
  cout << c << endl;
//  delete[] buffer;
};


int main () {
  CTriangle rect;
  get_from_file(rect);
//  cout << "Zijde A: " <<  rect.get_valueA() << endl;
//  cout << "Zijde B: " <<  rect.get_valueB() << endl;
//  cout << "Zijde C: " <<  rect.get_valueC() << endl;

  int iTemp;  cin >> iTemp;
}

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:57
Doe eens
code:
1
cout << *buffer;

ipv
code:
1
cout << buffer;

In het eerste geval gaat de variable waarnaar buffer verwijst getoond worden, in het 2de geval het adres waar buffer naar verwijst.
De naam van uw tabel is nl een pointer naar de geheugenlocatie van het eerste element van uw tabel.

Tip: zet in het vervolg code - tags rond uw code, dat leest makkelijker

https://fgheysels.github.io/


  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 21:41
Dat gaat wel goed. de fout krijg ik bij dit stuk

cout << a << endl;
cout << b << endl;
cout << c << endl;

en dat zijn geen pointers

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:57
Op vrijdag 08 februari 2002 14:07 schreef GAEvakYD het volgende:
Dat gaat wel goed. de fout krijg ik bij dit stuk

cout << a << endl;
cout << b << endl;
cout << c << endl;

en dat zijn geen pointers
Het zijn wel pointers. Kijk maar eens je declaratie na:
code:
1
char a[50]

Een array is , zoals ik eerder al zei een pointer.
Dus, als je doet
code:
1
cout << a;

Dan ga je eigenlijk het adres van het eerste element van de array gaan tonen. Je kunt dit op die manier oplossen:
code:
1
cout << *a

of
code:
1
cout << a[0]; // voor het eerste element te tonen

(Edit eens je post, en zet code-tags rond je code, dan is het al wat makkelijker leesbaar en is het makkelijker om fouten op te sporen).

https://fgheysels.github.io/


  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 21:41
Dammit heb beide manieren geprobeerd maar lukt nog steeds niet./

cout << "a is:" << a[0] endl;
cout << "b is:" <<*b << endl;
cout << "c is:" <<*c << endl;


Ligt het niet aan de reservering van het geheugen ofzo??, ik heb al lopen pielen met a[4] enzo maar niets helpt

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:57
Je leest nummers (int) in in een character array. Die integers zullen dan, doordat ze in een char-veld komen omgezet worden naar de ASCII waarde van dat getal en daardoor krijg je dus die rare tekens. Je krijgt dus de ASCII representatie van ieder nummer.

Zoek eens naar functies die int naar char converteren enzo.

https://fgheysels.github.io/


  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 21:41
Ja maar dat gaat niet werken. Ik lees ze in van een fiel dus zijn ze auto als char *. Als ik probeer te conveteren zegt die dat ook namelijk

  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 21:41
Dat gaat niet werken, de ingelezen charaters zijn al char *.
Dus van integer naar char omzetten hoeft niet meer.

Heb ik een pointer ofzo verkeerd staan ofzo, bij het vullen van de variabelen a.b.c????

Ik worddd gek

  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

Hmm.. laat ik het zo stellen hier
klopt dus echt totaal niks van, ga eerst maar
weer eens goed nadenken. Je wil meerdere punten
inlezen maar in die klasse heb je geen array van
getallen. Je geeft test mee aan "get_from_file"
maar die zien we nergens meer terug in je functie.
Of je code klopt niet of ik snap er geen f*ck van
wat je wilt.

Skill is when luck becomes a habit.


  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 21:41
Heb je gelijk in dat ik test niet gebruikte. Was me nog helemaal niet opgevallen. Maar de functies GetValueA kan ik ook niet pakken want dat zijn INTergers. En dan werkt de het optellen van de getallen niet meer want 1+0 = 1 en geen 10.



Iemand een oplossing ??

  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 21:41
Ik heb het geprobeert op te lossen, maar er zit ergens een fout in. hij telt niet helemaal goed

de Uitvoer is nu

Zijde a = 20
Zijde b = 2580
Zijde C = 40

in de file staat dit 10 20 30 END
code:
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <iostream.h>
#include <fstream.h>
#include <fstream>
#include <string.h>
#define TAB "\t"




//---------------------------------------------------------------------------

#pragma argsused

class CTriangle {
    int a, b, c;
  public:
    CTriangle(){};
    ~CTriangle(){};
    void set_valueA (int);
    void set_valueB (int);
    void set_valueC (int);
    int get_from_file(CTriangle);
    int get_valueA();
    int get_valueB();
    int get_valueC();


  //  int a, b, c;
};

const char * filename = "triangle.txt";


void CTriangle::set_valueA (int aa) {
  a = aa;
}

void CTriangle::set_valueB (int bb) {
  b = bb;
}

void CTriangle::set_valueC (int cc) {
  c = cc;
}


int CTriangle::get_valueA(){
return a;
}

int CTriangle::get_valueB(){
return b;
}

int CTriangle::get_valueC(){
return c;
}

int get_from_file(CTriangle& test){

  char * buffer;
  char a[50],b[50],c[100],END[50];

  long size,size2;
  int iTeller=0;
  int iTeller2=0;
//  size2 = 2;

  ifstream file (filename, ios::in|ios::binary|ios::ate);
  size = file.tellg();
  file.seekg (0, ios::beg);
  while (iTeller != size) {
    buffer = new char [size];
    file.read (buffer, 1) ;

    if (!strcmp(buffer,TAB))
    {
     cout << "tab found" << endl;
     iTeller2++;
    }
    else
    {
    if (iTeller2 == 0)
    {
      cout << buffer << endl;
      if (test.get_valueA() == 0)
        {
        test.set_valueA(atoi(buffer));
        }
      else
        {
        if (atoi(buffer) == 0)
          {
            test.set_valueA(test.get_valueA()*10);
          }
        else
          {
            test.set_valueA(test.get_valueA()+ atoi(buffer));
          }
         }
    }

    if (iTeller2 == 1)
    {
      cout << buffer << endl;
      if (test.get_valueB() == 0)
        {
        test.set_valueB(atoi(buffer));
        }
      else
        {
        if (atoi(buffer) == 0)
          {
            test.set_valueB(test.get_valueB()*10);
          }
        else
          {
            test.set_valueB(test.get_valueB()+ atoi(buffer));
          }
         }
    }
    if (iTeller2 == 2)
    {
      cout << buffer << endl;
      if (test.get_valueC() == 0)
        {
        test.set_valueC(atoi(buffer));
        }
      else
        {
        if (atoi(buffer) == 0)
          {
            test.set_valueC(test.get_valueC()*10);
          }
        else
          {
            test.set_valueC(test.get_valueC()+ atoi(buffer));
          }
         }
    }
    if (iTeller == 3)
    {
     strcat(END,buffer);
       if (END== "END")
       {
         break;
       }
    }
    }
    iTeller++;
  }
  file.close();
  cout << "the complete file is in a buffer" << endl;
 // cout << test.get_valueA() << endl;
 // cout << test.get_valueB() << endl;
 // cout << test.get_valueC() << endl;
//  delete[] buffer;
};


int main () {
  CTriangle rect;
  get_from_file(rect);
  cout << "Zijde A: " <<  rect.get_valueA() << endl;
  cout << "Zijde B: " <<  rect.get_valueB() << endl;
  cout << "Zijde C: " <<  rect.get_valueC() << endl;

  int iTemp;  cin >> iTemp;
}

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
ik heb de code niet helemaal doorgelezen, maar denk dat je iig Triangle::a, b en c moet initializeren op 0 in je constructor.

  • Tomatrix
  • Registratie: Juni 1999
  • Laatst online: 27-02-2025
Kan je niet gewoon met fscanf rechtstreeks een int inlezen?

  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 21:41
WOWWWWWWWWWW

Kerel jij bent mijn held.


Zo'n klein foutje, heb ze op nul gezet in de constructor en gelijk draaien.

Pffff wat dom van me

Thanks man

Verwijderd

volgens mij kan het veeeeeeeeel makelijker, aangezien je toch een istream gebruikt :-)

Je moet eventuele fouten maar negeren wat ik type dit uit m'n hoofd in :P

class CTriangle
{
friend istream& operator>>( istream& is, CTriangle& triangle);

private:
int a;
int b;
int c;
}

friend istream& operator>>( istream& is, CTriangle& triangle)
{
is >> triangle.a;
is >> triangle.b;
is >> triangle.c;

return is;
}


void main()
{
ifstream if( "triangle.txt")

CTriangle triangle;

if >> triangle;
}


Eventueel zou je nog een try/catch block kunnen gebruiken om een eventuele fout af te vangen (end of file etc..).

In je orginele code zit nog een memory leak trouwens 8-)

Succes met je opdracht verder.

  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 21:41
Eens kijken of ik het op jou manier kan krijgen
Pagina: 1