2014-02-24 12 views
-3

這裏是輸入文件:試圖把數字變成變量從ifstream的文件

Attendance: 5 
Midterm: 20 
Final: 20 
Homework: 15 
Projects: 40 
Mc Pherson, David Patrick 
Attendance: 12 15 
Midterm: 80 100 
Homework: 50 100 
Homework: 60 100 
Homework: 80 100 
Project: 90 100 
Project: 80 100 
Project: 75 100 
Final: 80 100 

我正在跟做的是這個輸入文件,然後把它通過將輸出成績冊代碼負責。我目前所堅持的部分是試圖將這些數字轉化爲變量並在它們之前跳過這些單詞。我嘗試使用cin.ignore(),但這不起作用,或者至少在我的實現它。

我該如何去做這樣的事情?

編輯:對於那些,問這裏是我的代碼。主文件:

//This file tests out gradebook.h 
#include <iostream> 
#include <fstream> 
#include "gradebook.h" 
using namespace std; 

int main() 
{ 
ifstream in ("gradebook.txt"); 
ostream out ("grades.txt"); 

while (!in.fail()) //tests to see if there are any more numbers coming in from resistors.h 
{ 
    //process input 
    gradebook (in, cout); 
} 

in.close(); 
return 0; 
} 

這裏是我的其他的文件:

//This program will format a gradebook 
#include <iostream> 
#include <vector> 
#include <string> 
#include <cmath> 
using namespace std; 

void gradebook (istream& in, ostream& out) 
{ 
string firstname[2]; 
string lastname[2]; 
string dummy; 
//header for table 

int projwe; 
int hwwe; 
int attendwe; 
int midwe; 
int finalwe; 
int attendgr[2]; 
int midgr[2]; 
int hwgr1[2]; 
int hwgr2[2]; 
int hwgr3[2]; 
int projgr1[2]; 
int projgr2[2]; 
int projgr3[2]; 
int finalgr[2]; 
int attendgrade; 
int hwgrade1; 
int hwgrade2; 
int hwgrade3; 
int projgrade1; 
int projgrade2; 
int projgrade3; 
int midtermgrade; 
int finalsgrade; 
double averagegr; 
//weights for each category 

in >> dummy >> attendwe; 
in >> dummy >> midwe; 
in >> dummy >> finalwe; 
in >> dummy >> hwwe; 
in >> dummy >> projwe; 
in >> firstname[2]; 
in >> lastname[2]; 
in >> dummy >> attendgr[2]; 
in >> dummy >> midgr[2]; 
in >> dummy >> hwgr1[2]; 
in >> dummy >> hwgr2[2]; 
in >> dummy >> hwgr3[2]; 
in >> dummy >> projgr1[2]; 
in >> dummy >> projgr2[2]; 
in >> dummy >> projgr3[2]; 
in >> dummy >> finalgr[2]; 
//loads words and weights into above variables 

attendgrade = ((attendgr[0]*attendwe) + (attendgr[1]*attendwe))/2; 
//calculates the overall attendance grade 

hwgrade1 = ((hwgr1[0]*hwwe) + (hwgr1[1]*hwwe)) /2; 
hwgrade2 = ((hwgr2[0]*hwwe) + (hwgr2[1]*hwwe)) /2; 
hwgrade3 = ((hwgr3[0]*hwwe) + (hwgr3[1]*hwwe)) /2; 
//calculates the overall homework grade 

projgrade1 = ((projgr1[0]*projwe) + (projgr1[1]*projwe)) /2; 
projgrade2 = ((projgr2[0]*projwe) + (projgr2[1]*projwe)) /2; 
projgrade3 = ((projgr3[0]*projwe) + (projgr3[1]*projwe)) /2; 
//calculates the overall project grade 

midtermgrade = ((midgr[0]*midwe) + (midgr[1]*midwe)) /2; 
//calculates the overall midterm grade 

finalsgrade = ((finalgr[0]*finalwe) + (finalgr[1]*finalwe)) /2; 
//calculates the overall finals grade 

averagegr = (finalsgrade + midtermgrade + projgrade1 + projgrade2 + projgrade3 + hwgrade1 + hwgrade2 + hwgrade3 + attendgrade)/9; 
//calculates the average grade 

out << "LastName" << "," << "FirstName" << "," << "HW1" << "," << "HW2" << "," << "HW3" << "," 
<< "Proj1" << "," << "Proj2" << "," << "Proj3" << "," << "Midterm" << "," << "Final" << "," << "Average" << endl; 
//outputs the header for the table 

out << firstname << "," << lastname << "," << attendgrade << "," << hwgrade1 << "," << hwgrade2 << "," << hwgrade3 << "," 
<< projgrade1 << "," << projgrade2 << "," << projgrade3 << "," << midtermgrade << "," << finalsgrade << "," << averagegr << endl; 
//outputs the numbers in the table 
} 

現在我得到一個奇怪的錯誤,這是在主要的10號線:

error C2664: 'std::basic_ostream<_Elem,_Traits>::basic_ostream(std::basic_streambuf<_Elem,_Traits> *,bool)' : cannot convert parameter 1 from 'const char [11] to std::basic_streambuf<+Elem,_Traits> *' 
+0

你應該發佈你試過的代碼,否則這看起來像是一個「爲我寫代碼」的問題。 – crashmstr

+0

您也可以發佈輸入文件的規格。我無法從你提供的小樣本中找出它。 (這些數字之前的單詞看起來很重要,在這種情況下,你不想跳過它們,但也要閱讀它們。) –

+0

你可以*不*寫這麼多的代碼,並期望它工作。從小而簡單的開始,然後逐步建立起來,進行測試。無論如何,你不清楚'ostream out(「grades.txt」)是什麼意思,'',因爲你再也不用'out'了,但是你不能用這種方式構建'ostream'。也許你的意思是'ofstream'。 – Beta

回答

1
string dummy; 
int n; 
fin >> dummy >> n; 
+0

副手,看起來比這更難一點。儘管嚴格地說,這是他的文字的答案,似乎很清楚,他還沒有意識到更多。 (例如,「Mc Pherson,David Patrick」會發生什麼事情?) –

+0

@JamesKanze:當然,這不是一個有競爭力的解決方案,但它足以讓OP開始。如果OP花費了很多努力後就停滯不前,我們可以給出更詳細的答案。 – Beta

+0

我嘗試了他所說的,但是我從main.cpp中得到了一個奇怪的錯誤。我會在OP中發佈我的代碼。 – user3267493

0

我試圖猜測格式:它是一個標題,每個元素的權重爲 ,後面跟着一個名字, 多項成果,通過的ElementType _n_,其中元素類型是指在 頭給出的元素中指定的每個結果,Ñ該評價點的 數目,並且最大點數。在這種情況下,最好的 解決方案可能是逐行解析,然後搜索 ':'。如果沒有':',這是一個名字,否則,您必須 解析:

std::string name; 
std::string line; 
while (std::getline(fin, line)) { 
    std::string::const_iterator colon = std::find(line.begin(), line.end(), ':'); 
    if (colon == line.end()) { 
     name = line; 
    } else if (name.empty()) { 
     parseHeaderLine(std::string(line.begin(), colon), std::string(colon + 1, line.end())); 
    } else { 
     parseDataLine(name, std::string(line.begin(), colon), std::string(colon + 1, line.end())); 
    } 
} 

至於解析,您可以在線路的兩個 部分使用std::istringstream