2017-02-20 83 views
-2

我一直在試圖解決這個問題,現在似乎我所嘗試的所有東西都讓它變得更糟。我正在設計一個程序,它讀取輸入文件,計算並打印到輸出文件。 (它是一個排序計算器)現在我只是試圖讓它顯示輸入中每行的輸出中的名稱和ID號。程序沒有將部件打印到輸出文件中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; 

    } 

這裏是輸入

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 

這裏是輸出:

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

它跳過第一和第六名。

我試圖改變的變量字符串變量,改變循環的順序,名字爲兩個可變(第一和最後一個)

任何幫助是極大的讚賞

+2

你爲什麼不使用'的std :: string'而不是'字符XYZ [XX]'任何理由嗎? – WhiZTiM

+0

寫完後關閉文件。 – Sedrick

+1

解決這些問題的正確工具是您的調試器。在*堆棧溢出問題之前,您應該逐行執行您的代碼。如需更多幫助,請閱讀[如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您應該\編輯您的問題,以包含一個[最小,完整和可驗證](http://stackoverflow.com/help/mcve)示例,該示例再現了您的問題,以及您在調試器。 –

回答

1

所不同的是,那兩條輸入行,你名字之間有一個空格。

比較

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

由於istringstream::operator>>直到空間讀取第一個字符串時,它會在那個空間停止,並會收到名稱的第二部分第二個字符串,而不是數量最多讀取。

該解決方案使您的數據一致,或者在解析行時允許存在或不存在空間。

您還有一個錯誤,它會使您的示例代碼在這裏不可用。你永遠不會打開輸出文件。你打開輸入文件兩次!

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

一些搞掂代碼

#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

非常感謝!此外,輸入不一致的原因是因爲我最初在那裏有我的名字,當我在這裏發佈它時,我明顯改變了它,但是我沒有仔細檢查。不過,我添加了其他建議,現在我的代碼完美無缺地工作了! – Morgan