/ / Verwendung von fstream Object als Funktionsparameter - c ++, function, fstream

Verwenden von fstream Object als Funktionsparameter - c ++, function, fstream

#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>

void vowel(fstream a){
char ch;
int ctr = 0;
while(!a.eof()){
a.get(ch);
if (ch == "A" || ch == "E" || ch == "I" || ch == "O" || ch == "U"){
cout << ch;
ctr++;
}
}
cout << "Number of Vowels: " << ctr;
}

main(){
fstream a;
a.open("temp.txt", ios::in);
vowel(a);
return 0;
}

In diesem einfachen Programm versuche ich, die Anzahl der Caps Vowels in der Datei temp.txt zu zählen. Ich erhalte jedoch den Fehler:

Auf ios :: ios (ios &) kann in der Funktion nicht zugegriffen werden fstream :: fstream (fstream &)

Stattdessen öffnet die Datei in der Funktion selbst den Job. Wieso ist es so? Danke vielmals

NB:

Wie verwende ich fstream (speziell ofstream) über einen Funktionsparameter?

Hier steht, dass es so funktionieren soll wie ich es versuche.

Rick

Antworten:

8 für die Antwort № 1

Ein fstream Objekt ist nicht kopierbar. Gehen Sie stattdessen durch Verweis: fstream&:

void vowel(fstream& a)

Beachten Sie, dass Sie den Anruf vermeiden können open() indem Sie dem Konstruktor dieselben Argumente zur Verfügung stellen:

fstream a("temp.txt", ios::in);

und nicht benutzen while(!a.eof()), überprüfen Sie das Ergebnis der Lesevorgänge sofort. Das eof() wird nur gesetzt, wenn versucht wird, über das letzte Zeichen in der Datei hinaus zu lesen. Das bedeutet, dass !a.eof() wird wahr sein, wenn der vorherige Aufruf an get(ch) lese das letzte Zeichen aus der Datei, aber anschließend get(ch) wird fehlschlagen und eof setzen, aber der Code wird den Fehler erst bemerken, nachdem er verarbeitet wurde ch Auch wenn das Lesen fehlgeschlagen ist.

Beispiel korrekte Struktur:

while (a.get(ch)) {

2 für die Antwort № 2

Sie müssen die fstream durch Referenz:

void vowel(fstream& a){ .... }
//                ^ here!

2 für die Antwort № 3

Versuche dies. Anstatt die Datei zu senden, zählen Sie die Vokale in der Zeile.

#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
int vowels=0;
void vowel(string a){
char ch;
int ctr = 0;
int temp=0;
for(temp=0,temp<a.length();temp++){
ch=a.at(temp);
if (ch == "A" || ch == "E" || ch == "I" || ch == "O" || ch == "U"){
cout << ch;
ctr++;
}
}
vowels+=ctr;
}

main(){
fstream a;
a.open("temp.txt", ios::in);

string temp;
while(getline(a,temp))
{
vowel(temp);
function2(temp);
function3(temp);


... so on for more then one functions.

}
vowel(a);
return 0;
}

Wenn Sie die Datei übergeben möchten, verwenden Sie die oben genannten Ans. (übergeben Sie fstream als Referenz).


-1 für die Antwort № 4

Es gibt viele Dinge, die Sie tun können, um Ihr Problem zu beheben, 2 von ihnen sind das Ifstream im globalen Geltungsbereich deklarieren und Deklarieren Sie Ihre Methode auch in global.

C ++

#import<stuff>
//other imports here

ifsteam in_stream;
void method_Name(ifstream in_stream,string user_input);

int void main(){
string user_input;
instream.open("dogs.txt");//you can open your file here or in the method
//Code here

cin>> user_input;
method_Name(user_input);

return 0;
}

void method_Name(){
//or even better opening file here

//do stuff

}

In deinem Fall kannst du es auch in eine Methode mit dem "&" nach ifstream so etwas wie übergeben Vokal (ifstream & a);

Ich habe die erste Instanz in einigen meiner Programme verwendet, um .csv-Dateien zu öffnen und von ihnen keine Probleme zu lesen. Überprüfe übrigens, ob die Datei tatsächlich geöffnet wurde, indem du etwas wie ...

 if (in_stream.fail( )){//Checking to see if file failed to open
cout << "Input file opening failed.n";
exit(EXIT_FAILURE);
}