2016-12-13 88 views
-1

我有一份來自大學的作業,其中有一個具有多個值的文本文件。 他們在不同的線路上,我必須把它們存儲在一個矢量。 我們還必須使用一個具有ifstream,ofstream和int Vector的Class,但它們都在Class的私有部分,我似乎無法使用它們(不允許更改該類!)。 我們通過getline獲取了值,但現在需要將它們從字符串轉換爲int,但問題是我們不允許添加更多的庫。 我們被允許使用的庫是:C++將文本文件中的數據轉換爲int向量

iostream string fstream vector

在將這些任何幫助,將不勝感激!

下面是簡介:

計劃1

編寫包含符合以下 聲明一個類的節目(即本聲明應該在你的 CPP文件的頂部放) :

您的程序應從名爲'sales.txt' 的文件讀取銷售值,並將代表這些值的條形圖輸出到名爲 'graph.txt'的文件中。通過顯示一行 星號在條形圖中創建每個條形圖。每個星號代表100英鎊的銷售額。

例如, 'sales.txt' 文件包含以下值:

1000 
500 
1200 
600 
200 

這裏是 'graph.txt' 文件中的程序後,應該包含爲 執行什麼:

SALES BAR CHART 
(each * equals £100) 
Store 1: ********** 
Store 2: ***** 
Store 3: ************ 
Store 4: ****** 
Store 5: ** 

這裏是我們不允許改變的類:

#pragma once 
#include<iostream> 
#include<string> 
#include<fstream> 
#include<vector> 

using namespace std; 

class SalesData 
{ 
private: 
ifstream inputfile; 
ofstream outputfile; 
vector<int> salesrecords; 
public: 
void loadDataFromFile(string filename); 
void saveBarChartToFile(string filename); 
}; 

我已經完全跳過了這個類,並創建了新的ifstream/ofstream和向量。 輸出我工作得很好,我正在努力的輸入!

void loadDataFromFile() 
{ 
    ifstream inputfile; 
    vector<int> salenumbers; 
    int holder; 

    inputfile.open("sales.txt"); 

    if (!inputfile.is_open()) 
    { 
     cout << "Text Not Open Error!"; 
    } 
    else 
    { 
     string line; 
     vector<string> text; 
     int i = 0; 



     while (inputfile.good()) 
     { 
      getline(inputfile, line); 
      text[i] = line; 
      i++; 
     } 
     for (int z = 0; z <= 5; z++) 
     { 
      int num = atoi(text.at(z).c_str()); 
      salenumbers.push_back(num); 
     } 



    } 
    inputfile.close(); 

    saveBarChartToFile(salenumbers); 
} 

我已經嘗試了多種方法,像直到eof,只是把它直接進入一個int向量,他們沒有工作。我發現很多方法將字符串更改爲int,但它需要更多的庫。

另外,如果我可以利用這個類,它會使它更容易。

我要提出一個新的問題,但它不會讓我,所以將它添加到這一個:

我有一個功能,以輸出到我與COUT測試文件,它工作正常打印到屏幕上。現在我已經改變它輸出到一個文件,但沒有任何東西出現在文件中。

想知道如果任何人都可以看到的錯誤:

void saveBarChartToFile(vector<int>numbers) 
{ 
    ofstream outputfile; 

    outputfile.open("graph.txt", std::ios_base::app); 


    if (!outputfile.is_open()) 
    { 
     cout << "FILE NOT OPEN ERROR!"; 
    } 
    else 
    { 
     for (int i = 0; i < numbers.size(); i++) 
     { 
      int stars = 0; 
      int starAmount = numbers[i]/100; 
      outputfile << "Shop" << (i + 1) << ":"; 
      for (int j = 0; j < starAmount; j++) 
      { 
       outputfile << "*"; 
      } 
      outputfile << "/n"; 
     } 
     outputfile.close(); 
    } 
} 
+0

你能比「我似乎無法使用它們」更具體嗎?從這裏很難看出你的代碼是什麼樣的。 – molbdnilo

+0

您能告訴我們提供給您的課程 – baliman

+0

您可以使用 將字符串轉換爲int string str =「123」; int numb; istringstream(str)>> numb; – baliman

回答

0

你應該直接讀取整數。

int sale; 
vector<int> salenumbers; 
while (inputfile >> sale) 
{ 
    salesnumbers.push_back(sale) 
} 

這應該繼續閱讀整數並將它們保存到文件末尾。 給一個嘗試這種邏輯,而不是塊

string line; 
vector<string> text; 
int i = 0; 

while (inputfile.good()) 
{ 
    getline(inputfile, line); 
    text[i] = line; 
    i++; 
} 
for (int z = 0; z <= 5; z++) 
{ 
    int num = atoi(text.at(z).c_str()); 
    salenumbers.push_back(num); 
} 

關於新的「問題」。 我可以生成文件,其內容例如在我的情況下:

Shop1:**************************** ************************************************** ************************************************** ************************************************** ************************************************** ************************************************** ************************************************** ************************************************** **********************/nShop2:******** ************************************************** ************************************************** ************************************************** ************************************************** ************************************************** ************************************************** **************************************** ************************************************** ************************************************** **********/nShop3:************ ************************************************** ************************************************** ************************************************** ************************************************** ************************************************** ************************************************** ************************************************** ************************************************** ************************************************** ************************************************** ************************************************** **************************************/n

使用此測試代碼:

int main(int argc, char* argv[]) { 
    vector<int> sale; 
    sale.push_back(40000); 
    sale.push_back(50000); 
    sale.push_back(60000); 
    saveBarChartToFile(sale); 

} 
+0

工作正常!我和一個哥們一直在我們的腦海裏徘徊! 你能否解釋一下這個片段對我更好一點,因爲我相信我將來會再次需要這個片段! –

+0

當然!只要整個文件中存在整數就可以讀取所有文件,基本上這就是「while(inputfile >> sale)」所告訴的內容。只要你閱讀一個有效的整數,保存你剛剛閱讀的當前一個,並將其保存在所有銷售編號(「salenumbers.push_back(sale);」)的向量中,然後在文件中向前移動並查看下一個。 現在,我不確定在此之前需要額外的檢查,但只要您檢查了文件是否打開正確(「if(!inputfile.is_open())」),在這種簡單情況下應該可以。 – fedepad

+0

我現在有另一個問題。我正在用cout測試我的輸出函數,看看它是否打印出來(它是),但它似乎沒有打印到文件! 這裏是功能: –