2017-02-20 6 views
-2

Ich habe versucht, dies für eine Weile zu lösen, und es scheint, dass alles, was ich versuche, es noch schlimmer gemacht hat. Ich entwerfe ein Programm, das eine Eingabedatei liest, Berechnungen durchführt und in eine Ausgabedatei druckt. (Es ist ein Grad Rechner der Art) Im Moment versuche ich nur, um es den Namen und die ID-Nummer in der Ausgabe für jede Zeile in der Eingabe anzuzeigen.Programm druckt keine Teile in Ausgabedatei C++

#include <iostream> 
#include <fstream> 
#include <cstring> 
#include <sstream> 

using namespace std; 

float printRecord (char name[20], char Id[20], ostream& outfile) 
{ 
outfile << name << " " << Id << endl; 
return 0; 
} 

int main() 
{ 
ofstream outfile; 
ifstream infile; 

std::string line; 

char file_nameI[21], file_nameO[21], name[20], Id[20]; 

float hworkgrade, grade1; 
int deductions; 

cout << "Please enter name of input file: "; 
cin >> file_nameI; 
infile.open(file_nameI); 
if (!infile) 
{ 
    cout << "Could not open input file \n"; 
    return 0; 
} 

cout << "Please enter name of output file: "; 
cin >> file_nameO; 
infile.open(file_nameO); 
if (!outfile) 
{ 
    cout << "Could not open output file \n"; 
    return 0; 
} 

    while (getline (infile, line)) 
    { 
    istringstream iss(line); 
    iss >> name >> Id; 
    cout<< name << " " << Id; 
    printRecord(name, Id, outfile); 
    cin.ignore(); 
    } 

    return 0; 

    } 

Hier ist der Eingang

Truman, Tod 12388671 100 100 100 
Seger,John 67894 100 100 100 100 
Victoire,Susan 938442 0 0 0 
Kodak,James 554668 101 100 100 
Frence,Lauren 602983 -1 100 100 
Hanz, Franz 58027201 100 100 100 
Laufeson,Loki 7920100 34 59 24 

Hier ist die Ausgabe:

12388671 
Seger,John 67894 
Victoire,Susan 938442 
Kodak,James 554668 
Frence,Lauren 602983 
58027201 
Laufeson,Loki 7920100 

Es überspringt die ersten und sechsten Namen.

Ich habe versucht, die Variablen auf String-Variablen zu ändern, um die Reihenfolge der Schleife zu ändern, die Einstellung der Name der Variablen zwei (erste und letzte)

Jede Hilfe sehr

+2

Gibt es Gründe, warum Sie nicht verwenden 'std :: string' im Gegensatz zu' char XYZ [xx] '? – WhiZTiM

+0

Schließen Sie Ihre Datei nach dem Schreiben darauf. – Sedrick

+1

Das richtige Werkzeug, um solche Probleme zu lösen, ist Ihr Debugger. Sie sollten Schritt für Schritt durch Ihren Code * gehen, bevor Sie auf Stack Overflow nachfragen. Für weitere Hilfe lesen Sie bitte [Wie kleine Programme zu debuggen (von Eric Lippert)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Zumindest sollten Sie Ihre Frage bearbeiten, um ein [minimales, vollständiges und verifizierbares] (http://stackoverflow.com/help/mcve) Beispiel einzufügen, das Ihr Problem zusammen mit den Beobachtungen, die Sie in der Debugger. –

Antwort

1

Der Unterschied zu schätzen wissen, ist, dass für Bei diesen beiden Eingabezeilen haben Sie ein Leerzeichen zwischen den Namen.

Vergleichen

Truman, Tod 12388671 100 100 100 
Seger,John 67894 100 100 100 100 

Seit istringstream::operator>> liest, bis ein Platz es in diesem Raum zu stoppen, wenn der erste String zu lesen und den zweiten Teil des Namens in der zweiten Zeichenfolge statt der Nummer erhalten.

Die Lösung macht Ihre Daten konsistent oder ermöglicht das Vorhandensein oder Fehlen von Leerzeichen beim Parsen der Zeilen.

Sie haben einen anderen Tippfehler, der Ihren Beispielcode hier unbrauchbar machen würde. Sie öffnen die Ausgabedatei nie. Sie öffnen die Eingabedatei zweimal !!

infile.open(file_nameO); =>outfile.open(file_nameO);

Einige feste up Code

#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <string> 

using namespace std; 

void printRecord (const string& name, const string& Id, ostream& outfile) { 
    outfile << name << " " << Id << endl; } 

int main() { 
    string line; 
    string file_nameI, file_nameO; 

    cout << "Please enter name of input file: "; 
    //cin >> file_nameI; 
    file_nameI = "grades.txt"; 
    cout << file_nameI << '\n'; 
    ifstream infile(file_nameI.c_str()); 
    if (!infile) 
    { 
     cout << "Could not open input file \n"; 
     return 0; 
    } 

    cout << "Please enter name of output file: "; 
    //cin >> file_nameO; 
    file_nameO = "gradesout.txt"; 
    cout << file_nameO << '\n'; 

    ofstream outfile(file_nameO.c_str()); 
    if (!outfile) 
    { 
     cout << "Could not open output file \n"; 
     return 0; 
    } 

    while (getline (infile, line)) 
    { 
     string name, id; 
     istringstream iss(line); 
     iss >> name >> id; 
     cout << name << " " << id; 
     printRecord(name, id, outfile); 
     cin.ignore(); 
    } } 
+0

Vielen Dank! Der Grund für die Inkonsistenz in der Eingabe ist auch, dass ich ursprünglich meinen Namen dort hatte, und als ich es hier gepostet habe, habe ich es offensichtlich geändert, aber ich habe es nicht überprüft. Aber ich habe deinen anderen Vorschlag hinzugefügt und jetzt funktioniert mein Code einwandfrei! – Morgan

Verwandte Themen