[c++] int uit txt bestand halen en in array zetten

Pagina: 1
Acties:

  • Pietjuh
  • Registratie: Augustus 2003
  • Laatst online: 20-05 05:07
Hey, ik ben bezig om mijn stappenmotor in een bepaalde sequentie te kunnen laten lopen, daarom had ik het idee om de commands in een txt bestand te typen, en dan uit te lezen. Maar het lukt me maar niet om ze in een array te krijgen. Ik breek er echt mijn hoofd over.

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
#include <iostream>
#include <fstream.h> // for file streams

using namespace std;

int main ()
{
     std::ifstream infile("temp.txt");
       char delaytemp[30];
       char motortemp[10];
       char speedtemp[10];
       int delay[100],motor[100],speed[100];
       int k;
  
  while(!infile.getline(motortemp, 10, '|').eof())
  {

  infile.getline(speedtemp, 10, '|'); 
  infile.getline(delaytemp, 10, '|');         
   motor[k] = atoi( motortemp ); 
   delay[k] = atoi( delaytemp );  
   speed[k] = atoi( speedtemp );
   k++;

   }
  
  cout << speed[1] <<endl;
  
     infile.close ();      
     system("PAUSE");
     return 0;;
}


Nu loopt mijn programma telkens vast. Maar als ik van motor, speed en delay geen array maak, maar een gewone int. Dan doet hij het wel, maar dan onthoud hij natuurlijk alleen de laatste waarde.

Het is misschien heel knullig geprogrammeerd, maar ik heb nog nooit iets gedaan met file i/o. Ik heb wel gisternacht tot 1 uur erop gezeten, en ik breek er nog steeds mijn hoofd over. So please help :P

[edit]
owja, de temp.txt ziet er bijvoorbeeld als volgt uit:

1|83|100|
4|48|200|
6|235|23|
346|4|324|

[ Voor 18% gewijzigd door Pietjuh op 15-10-2004 06:54 ]


  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Je zegt dat je programma vastloopt. Maar wat vindt de debugger ervan bijvoorbeeld? Waar loopt ie vast.
Wat ik vermoed als ik naar de code kijk is dat het misgaat omdat je k weliswaar declareert, maar nergens initialiseert op 0. Dus bevat k een ongedefinieerde waarde (misschien wel 436823) en ga je buiten de arrays indexeren. Dat leidt normaal gesproken tot een access violation...

[ Voor 26% gewijzigd door SWfreak op 14-10-2004 10:01 ]


  • Pietjuh
  • Registratie: Augustus 2003
  • Laatst online: 20-05 05:07
Je hebt helemaal gelijk, wat een achterlijke fout van mijn kant 8)7
Thanx iig, hij werkt nu :D

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Zoiets is netter (niet helemaal compleet, maar voor het idee):
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct MotorInfo {
   std::string optie1;
   std::string optie2;
   int waarde1;
};

typedef std::vector<MotorInfo> InfoVector;

InfoVector infos;

while ("not done") {
   MotorInfo tmp;
   infile >> tmp.optie1 >> tmp.optie2 >> tmp.waarde1;
   infos.push_back(tmp);
}


(oh en C++ gebruikt de header <fstream> niet <fstream.h>)

[ Voor 23% gewijzigd door Zoijar op 14-10-2004 11:26 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Als je het helemaal net wil doen:
Definieer een istream& operator>>(istream&, MotorInfo&). Daarna kun je std::copy gebruiken. (hint: er zit nog een klein stapje tussen)

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Psst.. Je hebt een dubbele ; achter return 0 staan ;)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

dat is niet fout

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Maar wel overbodig/tiepfout, ik denk ik zeg het ff

[ Voor 10% gewijzigd door Verwijderd op 15-10-2004 11:18 ]


Verwijderd

Klopt, maar het is ook niet nodig. En soms wil je het zelfs niet. Bij ons is het een policy dat eigen code moet compileren zonder enige compiler warning (en uiteraard zonder errors :P ). Met dit soort code krijg je vaak een 'empty statement' warning of iets in die aard.
Niet dat het voor dit privé projectje wat uitmaakt, zoals je zegt, maar goed... :)

  • JayVee
  • Registratie: Mei 2002
  • Laatst online: 14-11-2025

JayVee

shibby++!

ASCII stupid question, get a stupid ANSI!


Verwijderd

Vrijdag verveeldag, dus hier een complete "nette" C++ oplossing.

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
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
#include <fstream>
#include <vector>
#include <algorithm>
#include <iterator>

class motor_info {
friend std::istream& operator >> (std::istream&, motor_info&);
public:
    static const char DELIMITER= '|';

    motor_info()        {}

    int delay() const   { return delay_; }
    int motor() const   { return motor_; }
    int speed() const   { return speed_; }

private:
    int delay_;
    int motor_;
    int speed_;
};

std::istream& operator >> (std::istream& s, motor_info& mi)
{
    if(s >> mi.delay_) {
        if(s.get() != motor_info::DELIMITER)
            s.setstate(std::ios::failbit);
        else if(s >> mi.motor_) {
            if(s.get() != motor_info::DELIMITER) 
                s.setstate(std::ios::failbit);
            else if(s >> mi.speed_) {
                if(s.get() != motor_info::DELIMITER)
                    s.setstate(std::ios::failbit);
            }
        }
    }
    return s;
}

std::ostream& operator << (std::ostream& s, const motor_info& mi)
{
    return (s << mi.delay() << motor_info::DELIMITER
            << mi.motor() << motor_info::DELIMITER
            << mi.speed() << motor_info::DELIMITER);
}

int main()
{
    std::ifstream infile("temp.txt");
    std::vector<motor_info> infos;

    // Lees het bestand in
    std::copy(
            std::istream_iterator<motor_info>(infile),
            std::istream_iterator<motor_info>(),
            std::back_inserter(infos));

    bool error= !infile.eof();
    infile.close();

    // Schrijf de info vector naar cout
    std::copy(
            infos.begin(),
            infos.end(),
            std::ostream_iterator<motor_info>(std::cout, "\n"));

    return error ? 1 : 0;
}

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 15 oktober 2004 @ 14:49:
[...]

Klopt, maar het is ook niet nodig. En soms wil je het zelfs niet. Bij ons is het een policy dat eigen code moet compileren zonder enige compiler warning (en uiteraard zonder errors :P ). Met dit soort code krijg je vaak een 'empty statement' warning of iets in die aard.
Waarom zou je voor een empty statement in hemelsnaam een warning krijgen :? Ik kan me geen situatie indenken wanneer dit tot foutieve code zal leiden (hence is er niets om voor te waarschuwen). Heb het even getest, zowel comeau als msvc++ 7.1 geven geen warning voor een empty statement op het hoogste warning level

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Ik zou het zo doen.
Verwijderd schreef op 15 oktober 2004 @ 16:59:
Vrijdag verveeldag, dus hier een complete "nette" C++ oplossing.

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
int main()
{
    std::ifstream infile;
   infile.exceptions(std::ios::badbit | std::ios::failbit);

try {
   infile.open("temp.txt");

    std::vector<motor_info> infos;

    // Lees het bestand in
    std::copy(
            std::istream_iterator<motor_info>(infile),
            std::istream_iterator<motor_info>(),
            std::back_inserter(infos));

} catch (std::exception& exc) {
   std::cout << "An error occured parsing the input (" << exc.what() << ")" << std::endl;
   exit(1);
}
    infile.close();

    // Schrijf de info vector naar cout
    std::copy(
            infos.begin(),
            infos.end(),
            std::ostream_iterator<motor_info>(std::cout, "\n"));

    return 0;
}
Min of meer hetzelfde...

Verwijderd

Zoijar schreef op 15 oktober 2004 @ 17:20:
Ik zou het zo doen.

[...]

Min of meer hetzelfde...
Hmm, wordt die exception nu niet altijd gegooid? Na het lezen van het laatste motor_info object van de stream zal s >> mi.delay_ (in de >> operator) de stream state op zowel fail() als eof() zetten.

[ Voor 9% gewijzigd door Verwijderd op 15-10-2004 17:31 ]


Verwijderd

.oisyn schreef op 15 oktober 2004 @ 17:06:
Waarom zou je voor een empty statement in hemelsnaam een warning krijgen :? Ik kan me geen situatie indenken wanneer dit tot foutieve code zal leiden (hence is er niets om voor te waarschuwen). Heb het even getest, zowel comeau als msvc++ 7.1 geven geen warning voor een empty statement op het hoogste warning level
Het was wat onduidelijk geformuleerd denk ik (en misschien wat bij het haar getrokken), maar ik bedoelde niet meteen een empty statement zoals in deze return. En ik heb ook niet beweerd dat het tot foutieve code moet leiden, noch dat je een warning moet krijgen. Maar het kan. Metrowerks CodeWarrior geeft er bvb wel vaker een warning op. Laatst nog gehad met code als dit (vereenvoudigd):
C++:
1
2
3
4
5
6
7
8
9
10
namespace myname
{
   int iets;
};

int main( ... )
{
  ...
  return 0;
}

Die ';' na de namespace moet niet, dus daar krijg je echt een 'empty statement' warning voor in Metroworks CodeWarrior. GCC zegt hier dan weer niets, en ook een wat oudere msvc++ (dacht versie 6) zwijgt in alle talen...

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat hoort dan ook een error te zijn, in de global scope zijn er geen "statements", alleen declaraties, definities en directives. Comeau rapporteert dat keurig. Dat waar het over ging was gewoon in function scope, waar statements wel bestaan en waar empty statements volledig legaal zijn. (Of dit alles design-technisch nou zo geweldig in elkaar zit of niet laat ik maar even in het midden)

En ik bedoelde ook niet dat jij beweerde dat het tot foute code kon leiden, ik bedoelde dat er geen reden is om een warning te geven aangezien het niet tot foute code kan leiden

[ Voor 10% gewijzigd door .oisyn op 16-10-2004 00:12 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Je hebt gelijk denk ik. Een empty statement kan geen foute code veroorzaken.
Ik zat echt met vermijden van compile warnings in CodeWarrior in m'n gedachten toen ik m'n eerste post deed over dat ';' gedoe, maar ik had ergens een rare hersenkronkel zitten denk ik want het is inderdaad niet zo logisch wat ik zei. Die ';' na die namespace zou, nu ik er over nadenk, inderdaad eerder een warning in de trend van 'empty declaration' ofzo moeten zijn (kan het nu niet proberen want geen CodeWarrior hier).
Aangezien we ook nogal beginnen afwijken van het topic ga ik het hier bij laten.
/me gaat eerst es memtest86 draaien om z'n hersenen te verifieren :+

[ Voor 6% gewijzigd door Verwijderd op 16-10-2004 01:56 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

MSVC++ 7.1 slikt verdwaalde ;'s in global scope overigens ook gewoon, zelfs zonder warning :). Maar als je de grammatica erbij haalt zou het eigenlijk niet eens mogen parsen.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Verwijderd schreef op 15 oktober 2004 @ 17:30:
Hmm, wordt die exception nu niet altijd gegooid? Na het lezen van het laatste motor_info object van de stream zal s >> mi.delay_ (in de >> operator) de stream state op zowel fail() als eof() zetten.
Oh, ja, daar heb je geloof ik gelijk in ja. Ben ik al eens eerder op de fout in gegaan herinner ik me nu.

  • Pietjuh
  • Registratie: Augustus 2003
  • Laatst online: 20-05 05:07
thanx voor de replies!
Pagina: 1