2016-11-01 72 views
0

以下代碼適用於我需要做的項目,在該項目中,我收到一個文本文件,該文件的學生姓名和姓氏後跟他的成績。然後我必須將其轉換爲輸出文件,其中包含他的名字,然後是他的平均分數。我收到的文件中有多個學生一行一行地被處理。輸出應該relativly像代碼輸出廢話到輸出文件而不是字符串?

Rzam, Look   = 0.00 
Bambi, Lambi   = 40.47 
Coop, Jason   = 27.31 

但礦僅僅打印垃圾如

0x7fffb08e8698 = 0.000x7fffb08e8698 = 0.000x7fffb08e8698 = 0.000x7fffb08e8698 = 0.000x7fffb08e8698 = 0.000x7fffb08e8698 = 0.000x7fffb08e8698 = 0.000x7fffb08e8698 = 0.000x7fffb08e8698 = 0.000x7fffb08e8698 = 0.00

這是我到目前爲止有:

#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <iomanip> 

using namespace std; 

struct Student 
{ 
    string fname; 
    string lname; 
    double average; 
}; 

int read(ifstream &fin, Student s[]); 

void print(ofstream &fout, Student s[], int amount); 


int main() 
{ 
    const int size = 10; 
    ifstream fin; 
    ofstream fout; 
    string inputFile; 
    string outputFile; 
    Student s[size]; 

    cout << "Enter input filename: "; 
    cin >> inputFile; 
    cout << "Enter output filename: "; 
    cin >> outputFile; 
    cout << endl; 

    fin.open(inputFile.c_str()); 
    fout.open(outputFile.c_str()); 

    read(fin , s); 
    print(fout, s, size); 

    fin.close(); 
    fout.close(); 

} 

int read(ifstream &fin, Student s[]) 
{ 
    string line; 
    string firstName; 
    string lastName; 
    double score; 
    double total; 
    int i=0; 
    int totalStudents=0; 
    Student stu; 

    while(getline(fin, line)){ 
     istringstream sin; 
     sin.str(line); 

     while(sin >> firstName >> lastName){ 
      stu.fname = firstName; 
      stu.lname = lastName; 

      while(sin >> score){ 
      total *= score; 
      i++; 
      } 
      stu.average = (total/i); 
     } 
     s[totalStudents]=stu; 
     totalStudents++; 
    } 
    return totalStudents; 
} 

void print(ofstream &fout, Student s[], int amount) 
{ 
    ostringstream sout; 
    for(int i = 0; i<amount; i++) 
    { 
     sout << left << setw(20) << s[i].lname << ", " << s[i].fname; 
     fout << sout << setprecision(2) << fixed << "= " << s[i].average; 
    } 
} 
+0

看起來你打電話存儲器地址的垃圾......嘗試使用c_str( )爲fname和lname字符串...例如's [i] .fname.c_str()' –

+0

已嘗試,但無效 –

回答

1

你有幾個錯誤s,這已經添加到你的問題:

  1. print功能

    ,你寫一個ostringstream,然後嘗試寫文件流。這很好,但是它打印了ostringstream緩衝區的地址。因此,此更改將導致其打印內容:

    fout << sout.str() << setprecision(2) << fixed << "= " << s[i].average; 
    

.str()使用。雖然你根本不需要臨時數據流...

  1. 你不會在輸出中放置換行符,因此所有操作都會在一行中結束閱讀:

這樣做的另一個變化使得它看起來是這樣的:

fout << sout.str() << setprecision(2) << fixed << "= " << s[i].average << '\n'; 
  • 您需要將循環內的ostringstream sout;,所以它是復位每次都是。否則,你會得到奇怪的複合輸出。

  • 您不使用通過您的閱讀功能計算的學生數!所以它總是試圖打印10!做這樣的事情:

    int count = read(fin , s); 
    print(fout, s, count); 
    
  • 如果沒有分數讀,我想你會被零有一個鴻溝。所以你應該添加一張支票。

  • 您應該確保不會超過size學生被閱讀。或者更好的是,將它們放在std::vector中,然後從函數中返回。它更簡單,更不容易出錯。

  • 您每次開始閱讀學生時都需要重置i,否則後面的學生會被分得太多。每個人都需要獨立計數。

  • 我不知道這些是唯一的問題,但可以肯定它應該讓你開始在正確的軌道上:-)

    +0

    非常感謝。這是我第一個大學級別的科幻課,所以它意味着很多 –

    +0

    沒問題。我也只是注意到我會編輯回答的一個小問題。祝你好運! –

    +0

    另外,不要氣餒,而你的代碼有幾個問題,它也做了很多事情! 'while(getline(fin,line)){'是一個美麗的模式,我希望更多的新的C++開發人員使用新的!你在適當的地方使用了'std :: string',而不是同時處理原始緩衝區。 –