[c++] integer wordt niet naar txtfile geschreven

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • fromalk
  • Registratie: Januari 2004
  • Laatst online: 28-07 15:16
Hallo allemaal,

ik zit vreemd genoeg al een uurtje of 2 met iets vrij basics te suggelen. In een functie maak ik gebruik van een bubblesort, nu wil ik de gesorteerde array (integer) en diens lengte wegschrijven in een txt file.

code:
1
2
3
4
5
6
7
8
9
ofstream bubble_file;
bubble_file.open ("/logfiles/bubblesort.txt",ios::in|ios::app);
if (bubble_file.is_open()) {
        bubble_file.width(200);
        bubble_file << right;
        bubble_file << "Bubblesort 1, array length: ";
        bubble_file << left;
        bubble_file << length;
...


length is een integer die het getal 99, 999 of 9999 bevat (succesvol getest). Nu lukt het mij simpelweg niet om die integer naar het textfile te schrijven. Na de variabele length wordt de opdracht precies afgebroken, er wordt daarna niets meer weggeschreven. Ik heb reeds geprobeerd de integer naar een string om te zetten. De integer weg te schrijven via; bubble_file.write((char*) &length, sizeof(int)); allemaal zonder succes.

Verder probeerde ik nog een aantal andere methodes die ik op het net vond maar allemaal zonder succes. Vermoedelijk ga ik de mist in omdat hij denkt dat lenght een keyword is of dergelijke? Hoe los ik dit nu het beste op?

Alvast bedankt

Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 01:05

Reptile209

- gers -

Check eens met een debugger of length de waarde heeft die je verwacht. Daarnaast: sluit je het bestand ook netjes na het wegschrijven (iets als bubble_file.close, eventueel eerst nog een bubble_file.flush, zie de help)?

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

  • fromalk
  • Registratie: Januari 2004
  • Laatst online: 28-07 15:16
Reptile209 schreef op zondag 22 november 2009 @ 21:48:
Check eens met een debugger of length de waarde heeft die je verwacht. Daarnaast: sluit je het bestand ook netjes na het wegschrijven (iets als bubble_file.close, eventueel eerst nog een bubble_file.flush, zie de help)?
de file wordt op het einde van de functie inderdaad netjes gesloten. In de debugger heeft length mooi de waarde 99 zoals ik ervan verwacht had (99 vervolgens 999 en dan 9999)

Acties:
  • 0 Henk 'm!

  • B0rf
  • Registratie: Oktober 2008
  • Laatst online: 03-10-2024
Als je met << een integer uit een bestand wilt lezen (of schrijven), moet het bestand als binary geopend worden. In linux gebeurt dit standaard, maar in windows niet. Probeer het bestand eens als binary te openen

Acties:
  • 0 Henk 'm!

  • fromalk
  • Registratie: Januari 2004
  • Laatst online: 28-07 15:16
ook binary het bestand openen had ik al geprobeerd;

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
#include <stdlib.h>
#include <stdio.h>
#include <sys/time.h>
#include <iostream>
#include <fstream> // required for writing/reading text files
#include <sstream>

using namespace std;
int hundred[99], thousand[999], tenthousand[9999];
double dif;
time_t start,end;

double bubblesort(int ArrayNumber) {            // array could have been the argument here but it would only consume more memory to pass the arrays as arguments, therefor I used 1 for hundred, 2 for thousand and 3 for thenthousand
    int length;
    int c;
    ofstream bubble_file;
    bubble_file.open ("/logfiles/bubblesort.txt",ios::in|ios::app|ios::binary);
    
    switch (ArrayNumber) {
        case 1: length = sizeof(hundred) / sizeof(int);
            break;
        case 2: length = sizeof(thousand) / sizeof(int);
            break;
        default: length = sizeof(tenthousand) / sizeof(int);
            break;
    }
    int sort[length];
    
    // put data in the sort array
    for(c=0;c<=length;c++) {
        sort[c] = tenthousand[c];
    }
    
    // bubblesort the array
    time (&start);
    int i, j, temp; 
    for (i =length;i>=0;i--) {
        for (j = 1; j <= i; j++) { 
            if (sort[j-1] > sort[j]) { 
                temp = sort[j-1]; 
                sort[j-1] = sort[j]; 
                sort[j] = temp; 
            }
        } 
    }
    
    
    if (bubble_file.is_open()) {
        bubble_file.width(200);
        bubble_file << right;
        bubble_file << "Bubblesort 1, array length: ";
        bubble_file << left;
        bubble_file << length;
        
        /*
        c=0;
        while (c<=length) {
            cout << sort[c] << "\t\t" << tenthousand[c] << endl;
            c++;
        }
         */
    
    }
    
    bubble_file.close();
    time (&end);
    dif = difftime (end,start);
    return dif;
}


int main () {
    // initialise
    srand(time(NULL)); // shuffle numbers in memory
    int c = 0;
    double time_req;
    
    // Generate numbers
    std::cout << "Welcome, please wait while arrays are being generated\n";
    do {
        tenthousand[c] = rand() % 10000;
        if (c<=99) {
            hundred[c] = tenthousand[c];
            thousand[c] = tenthousand[c];
        } else if (c<=999) {
            thousand[c] = tenthousand[c];
        }
        c++;
    } while (c<=9999);
    
    // Sort array's
    time_req = bubblesort(1);
    cout << "time needed for bubblesorting hundred records: " << time_req << "seconden \n";
    time_req = bubblesort(2);
    cout << "time needed for bubblesorting thousand records: " << time_req << "seconden \n";
    time_req = bubblesort(3);
    cout << "time needed for bubblesorting tenthousand records: " << time_req << "seconden \n";

    return 0;
}


de inhoud van het txt bestand is dan;
Bubblesort 1, array length: Bubblesort 1, array length: Bubblesort 1, array length:

[ Voor 11% gewijzigd door fromalk op 22-11-2009 22:32 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

B0rf schreef op zondag 22 november 2009 @ 22:05:
Als je met << een integer uit een bestand wilt lezen (of schrijven), moet het bestand als binary geopend worden. In linux gebeurt dit standaard, maar in windows niet. Probeer het bestand eens als binary te openen
Sorry, maar dit is complete onzin. De operators << en >> zullen altijd op tekst werken, ongeacht hoe de file geopend is. Daarnaast zal een fstream standaard altijd als text worden geopend, tenzij je expliciet meegeeft dat hij als binary moet worden geopend.

@TS: je loopjes kloppen sowieso al niet. Als je for(c=0;c<=length;c++) schrijft, dan loopt dat van 0 tot en met length. Dat zijn dus in totaal length+1 elementen (de 0 ook meetellen!). Maar je wilt maar length elementen, dus loop je tot length, oftewel, c < length.

Wat dat betreft denk ik ook dat je niet helemaal snapt dat je met int hundred[99] eigenlijk helemaal niet een array van 100 elementen declareert, maar een array van 99 elementen. Met indices 0 t/m 98. hundred[99] ligt buiten de array, want dat is het 100e element, en hij heeft er maar 99.

[ Voor 44% gewijzigd door .oisyn op 22-11-2009 23:43 ]

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.


Acties:
  • 0 Henk 'm!

  • fromalk
  • Registratie: Januari 2004
  • Laatst online: 28-07 15:16
bedankt voor de info maar dit heb ik vlak na het posten aangepast ;)

De kennis is een beetje roestig na 5jaar niets meer geprogrammeerd te hebben nl... Het probleem met het wegschrijven naar textfiles blijft echter

Acties:
  • 0 Henk 'm!

  • B0rf
  • Registratie: Oktober 2008
  • Laatst online: 03-10-2024
.oisyn schreef op zondag 22 november 2009 @ 23:35:
[...]

Sorry, maar dit is complete onzin. De operators << en >> zullen altijd op tekst werken, ongeacht hoe de file geopend is. Daarnaast zal een fstream standaard altijd als text worden geopend, tenzij je expliciet meegeeft dat hij als binary moet worden geopend.
Oeps sorry, je hebt gelijk. << en >> zijn operators die meteen getallen formatten. Was even in de war met een andere library, waar << en >> de data als binaire data wegschrijft, maar dit doen de std::streams niet

[ Voor 32% gewijzigd door B0rf op 23-11-2009 00:06 ]


Acties:
  • 0 Henk 'm!

  • bredend
  • Registratie: September 2001
  • Laatst online: 15:30
En als je
C++:
1
2
bubble_file << left;
bubble_file << length;

veranderd in
C++:
1
2
bubble_file << length;
bubble_file << left;

werkt length dan nog steeds niet of werkt left dan niet meer?

[ Voor 17% gewijzigd door bredend op 23-11-2009 00:10 ]


Acties:
  • 0 Henk 'm!

  • fromalk
  • Registratie: Januari 2004
  • Laatst online: 28-07 15:16
dan werkt length nog steeds niet

k heb net het programma gecompiled in windows onder visual studio, ook daar geen succes (ik gebruik zelf os x & x code)

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

@bredend: left is een stream manipulator die zorgt dat de output aan de linkerkant gealignd wordt.
fromalk schreef op maandag 23 november 2009 @ 00:01:
bedankt voor de info maar dit heb ik vlak na het posten aangepast ;)
Ja da's wel leuk, maar als je niet zorgt dat de code die je post niet 100% identiek is aan de code die je gebruikt kunnen we je ook niet helpen. Want blijkbaar werkt het nu nog steeds niet, en ik zie niet waarom. Maar ja, ik kijk dan ook naar een verkeerde versie van je code.

[ Voor 69% gewijzigd door .oisyn op 23-11-2009 00:34 ]

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.


Acties:
  • 0 Henk 'm!

  • bredend
  • Registratie: September 2001
  • Laatst online: 15:30
.oisyn schreef op maandag 23 november 2009 @ 00:30:
@bredend: left is een stream manipulator die zorgt dat de output aan de linkerkant gealignd wordt.
* bredend houdt het voortaan bij Java topics ;)

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-09 22:43
Waarschijnlijk schrijf je met je array gedoe op de foute plek zoals .oisyn al aangeeft, alles wat je daarna doet werkt wel of niet, afhankelijk van of je wel of niet lief bent geweest dit jaar.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Waarom open je een output stream met ios::in?

Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 01:05

Reptile209

- gers -

Zo te zien komt de TS goed weg met ios::in, omdat ofstream automagisch een outputstream opent. Maar echt lekker ziet het er idd niet uit :).

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

  • Coltrui
  • Registratie: Maart 2001
  • Niet online

Coltrui

iddqd

Kan je in C++ Length zomaar als naam voor een variabele gebruiken?

Acties:
  • 0 Henk 'm!

Verwijderd

code:
1
2
3
4
5
6
7
8
[26] Air:~/Temp/Mehh/build/Debug $ rm bubblesort.txt; ./Mehh; cat bubblesort.txt 
Welcome, please wait while arrays are being generated
time needed for bubblesorting hundred records: 0seconden 
time needed for bubblesorting thousand records: 0seconden 
time needed for bubblesorting tenthousand records: 1seconden 
Bubblesort 1, array length: 100...
Bubblesort 1, array length: 1000...
Bubblesort 1, array length: 10000...


Gokje, in je project settings heb je GCC 4.2 als compiler ingesteld staan? Apple's dynamic versie van die library lijkt een beetje kapot te zijn. Als je je compiler settings verandert naar 'GCC 4.0' OF je standaard c++ library type naar 'static' werkt het wel...

Zie ook hier: http://stackoverflow.com/...ke-in-snow-leopard-x-code

Think different :+

[ Voor 6% gewijzigd door Verwijderd op 23-11-2009 17:29 ]


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-09 22:43
Verwijderd schreef op maandag 23 november 2009 @ 17:27:
code:
1
2
3
4
5
6
7
8
[26] Air:~/Temp/Mehh/build/Debug $ rm bubblesort.txt; ./Mehh; cat bubblesort.txt 
Welcome, please wait while arrays are being generated
time needed for bubblesorting hundred records: 0seconden 
time needed for bubblesorting thousand records: 0seconden 
time needed for bubblesorting tenthousand records: 1seconden 
Bubblesort 1, array length: 100...
Bubblesort 1, array length: 1000...
Bubblesort 1, array length: 10000...


Gokje, in je project settings heb je GCC 4.2 als compiler ingesteld staan? Apple's dynamic versie van die library lijkt een beetje kapot te zijn. Als je je compiler settings verandert naar 'GCC 4.0' OF je standaard c++ library type naar 'static' werkt het wel...

Think different :+
Ik snap niet hoe je tot die conclusie kan komen als de code duidelijk kapot is.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

Verwijderd

farlane schreef op maandag 23 november 2009 @ 17:30:
[...]


Ik snap niet hoe je tot die conclusie kan komen als de code duidelijk kapot is.
Omdat ik de code eerst gefixed heb...

Testcase om te reproduceren:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <fstream>

int main () 
{
    int integer = 5000;
    
    std::ofstream f;
    f.open ("out.txt",std::ios::out);
    
    f <<"Integer: ";
    f <<integer;
    f <<std::endl;
    
    return 0;
}


En dat gaat in een XCode 3.2.1 command line project, debug build met standaard instellingen fout.

[ Voor 43% gewijzigd door Verwijderd op 23-11-2009 17:38 ]


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-09 22:43
Verwijderd schreef op maandag 23 november 2009 @ 17:32:
Omdat ik de code eerst gefixed heb...
Ah okay

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • bobo1on1
  • Registratie: Juli 2001
  • Laatst online: 18-05 17:57
Hoe bekijk je bubblesort.txt? Door de manier waarop je de tekst wegschrijft (regelbreedte van 200, geen newlines, openen in append mode) kan het er in sommige editors wat vreemd uit gaan zien.

Impedance, a measure of opposition to time-varying electric current in an electric circuit.
Not to be confused with impotence.


Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Maar TS zegt dat het met VC++ ook niet werkt...

Acties:
  • 0 Henk 'm!

Verwijderd

Maar hij zegt niet wat er dan niet werkt. Zijn programma is immers nogal brak. Mijn testcase zou 't wel op VC++ moeten doen...

Edit: Een windows ding met VC++ heb ik hier nu niet, maar op IBM AIX (xlc++) werkt m'n testcase prima...

[ Voor 31% gewijzigd door Verwijderd op 23-11-2009 17:56 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Fijn dat TS ook nog even reageert om te vertellen of het probleem is opgelost, ofzo...
Pagina: 1