Function issue

Hello,

I wrote a code in C++ that can encode and decode files. After that the programm have to check or numbers from the file are lychrel numbers. I used functions for every action.
But when I put all those functions in a row, the last one doesn't work. See my 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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
#include <iostream>
#include <fstream>
#include <climits>
using namespace std;

    long omgekeerd(long);
    bool isPalindroom(long);

void bestanden(ifstream & invoer, ofstream & uitvoer, char & keuze) {
    string origineel; //Bestandsnaam invoer
    string doelfile; //Bestandsnaam uitvoer
    cout << "Goedendag, u kunt kiezen of u met dit programma een bestand wilt "
         << "coderen of decoderen." << endl;
    cout << "Voor coderen voer een 'c' in. Voor decoderen voer een 'd'"
         << "in." << endl;
    cin >> keuze;
    cout << "Voer de naam van het originele bestand in: " << endl;
    cin >> origineel;
    invoer.open(origineel, ios::in);
    cout << "Voer de gewenste naam van het doelbestand in: " << endl;
    cin >> doelfile;
    uitvoer.open(doelfile, ios::out);
}

bool isBackslash(char c) { //Bepaalt of karakter een backslash is
    if(c == 92) { //c is nummer van karakter in ascii
        return true;
    }
    else {
        return false;
    }
}//isBackslash

bool isCijfer(char c) { //Bepaalt of karakter een cijfer is
    if (c > 48 && c < 58) { //c is nummer van karakter in ascii
        return true;
    }
    else {
        return false;
    }
}//isCijfer

void coderen(ifstream & invoer, ofstream & uitvoer) { //Codeert invoer
    char kar1, kar2; //kar 1 is eerste karakter in invoer, kar2 de volgende
    int i = 1; //aantal zelfde karakters
    bool dubbel = false; //staan er 2 dezelfde karakters achter elkaar?

    kar1 = invoer.get();
    kar2 = invoer.get();
//coderen
    while(!invoer.eof()) {
    if(kar1 == '\n') {
        uitvoer.put('\n');
    }
    else {
        if(kar1!=kar2) {
            if(isBackslash(kar1) || isCijfer(kar1)) {
                uitvoer.put('\\');
            }
            uitvoer.put(kar1);
            if(i>1) {
                uitvoer << i;
            }
            i=1;
        }
        else {
            i++;
        }
    }
//Cijfers uit het invoerbestand naar het uitvoerbestand
    if(isCijfer(kar1)){
            dubbel = true;
        }
        kar1 = kar2;

        if (!isCijfer(kar2)&&dubbel==true){
            dubbel= false;
        }
        kar2 = invoer.get();
        }
        uitvoer.put(kar1);
        if (i>1){
            uitvoer << i;
    }
    cout << "Uw bestand is gecodeerd." << endl;
}//coderen

void decoderen(ifstream & invoer, ofstream & uitvoer){ //decodeert de invoer
    char kar1, kar2; //kar 1 is een volgende regel, kar 2 is volgende karakter
    int getal = 0; //Uitrekenen werkelijke getal
    int i = 1; //Teller voor aantal dezelfde karakters

    kar1 = '\n';
    kar2 = invoer.get();
//decoderen
    while (!invoer.eof()){
        if (isCijfer(kar2)) {
            getal = getal * 10 + (kar2 - '0');
        }
        else {
            if(getal > 0) {
                for(i=1; i < getal; i++)
                    uitvoer.put(kar1);
                    getal=0;
            }
            if(isBackslash(kar2)) {
                kar2 = invoer.get();
            }
            uitvoer.put(kar2);
            kar1 = kar2;
        }
        kar2 = invoer.get();
        }
    cout << "Uw bestand is gedecodeerd." << endl;
}//decoderen

bool isPalindroom(long getal) { //check of getal een palindroom is
    return getal == omgekeerd(getal);
}//isPalindroom

long omgekeerd(long num) { //is een getal een spiegelgetal?
    long omgekeerd = 0; //check of getal een spiegelgetal is
    while(num > 0) {
        long rest = num%10; //getal wat bij berekening er nog bij komt
        omgekeerd = (omgekeerd*10)+rest;
        num=num/10;
    }
    return omgekeerd;
}//omgekeerd

bool checkLychrel(long num, int & p) { //checkt of getal een lychrelgetal is
    if(isPalindroom(num)) {
        if(p>0) {
            p=p-1;
        }
        return false;
    }
    else {
    for(p=1; p>0; p++) { //p is teller voor iteraties
        num = num + omgekeerd(num);
        if(isPalindroom(num)) {
            return false;
        }
    }
     return true;
}
}//checkLychrel

void isLychrel(ifstream & invoer) {//haalt getallen uit de invoer en haalt deze
    int p=0; //teller iteraties    //door checkLychrel
    char kar; //karakter uit de invoer
    while(!invoer.get(kar)) {
        if(isCijfer(kar)) {
            invoer.unget();
            int n; //geheel getal uit invoer
            invoer >> n;
            if(n < INT_MAX) {
                if(checkLychrel(n, p)) {
                    cout << n << " is een lychrelgetal. " << endl;
            }
                else {
                cout << n << " is geen lychrelgetal." << " Het aantal iteraties"
                     << " om bij een palindroom te komen is " << p << endl;
            }
            }
            else {
                cout << n << " Dit getal is te groot." << endl;
            }
    }
}
}//isLychrel

int main() {
    ifstream invoer;
    ofstream uitvoer;
    char keuze;
    bestanden(invoer, uitvoer, keuze);
    if(keuze == 'c') {
        coderen(invoer, uitvoer);
    }
    if(keuze == 'd') {
        decoderen(invoer, uitvoer);
    }
    else {
        cout << "Wrong letter." << endl;
    }
    cout << "Dit programma controleert nu alle getallen uit de invoerfile op"
         << " lychrelgetallen." << endl;
    isLychrel(invoer);
return 0;
}//main 


So, everything works, except the isLychrel function.
When I write the code withoud the encode (void coderen()) part or the decode (void decoderen()) part, the isLychrel function works. What am I doing wrong?
Your functions coderen and decoderen read the entire input filestream. All of it. There is none left to read.

So when isLychrel goes to use invoer , invoer is all out of data. It's all gone. Your other functions already read all the data from that stream.
So, after the function coderen, the programm have to go back to the begin of the input filestream? How can I do that?
Simplest way would be to have a new stream.
Thankyou very much
Topic archived. No new replies allowed.