2016-03-06 105 views
-5

因此,我目前是計算機工程專業的第二年級學生,我已經遇到了一個巨大的牆,這是我正在註冊的C++數據結構類。要創建應讀取文件中的數據,將該數據輸入到矢量中並顯示該文件的最小值和最大值。她還希望我使用模板,但我只是試圖在我穿過那條路之前將這件事情從地面上移開。現在我遇到的問題是除了在我的代碼中的這一點之外,我無法得到任何東西。將文件讀入矢量(C++)問題

現在這段代碼顯然是不完整的,但我似乎無法弄清楚如何將這些值讀入向量,然後拋出字符串的值。說實話,我迷失在醬汁裏,因爲缺乏一個更好的比喻,把褐色的東西扔到牆上,看看它是否粘住。我單獨瞭解這些主題,但將它們組合並投入數據文件讓我失去了知識。如果有人可以花時間坐下來幫助我解決這個問題,因爲我的教授一週沒有回覆我的電子郵件(僅限在線課程),這個項目將在週二到期,我一直在爲最後2幾天沒有完成。

我非常感謝幫助和理解我即將失去它。我在Java,Diff Eq或HTML/CSS課程中沒有問題,但是這個C++課程絕對支配我(在C++課程介紹中收到了B)。再次感謝,我感謝任何人可以幫助!

//Nicholas Stafford 
//COP2535.0M1 
//Read in text file into multiple vectors and display maximum and minimum integers/strings. 

#include <iostream> 
#include <string> 
#include <vector> 
#include <fstream> 
#include <algorithm> 


using namespace std; 



int main() { 

    ifstream inputFile; //File input object 
    const int fSize = 6; 
    int numCt = 0; //Counts number of integers 
    vector<int> numInt(fSize); 
    string numWd; 


    //Open input file 
    inputFile.open("minmax.txt"); 

    //Data validation for file 
    if (inputFile) 
    { 
     //Try method to remove string values 
     try 
     { 
      //Only pull the integer values into a vector 
      while (inputFile >> numInt) 
      { 
       numCt++; 
      } 
     } 
     catch (string noString) 
     { 
      cout << noString; 
     } 

    } 
} 
+0

嘗試輸入一個整數,然後將整數添加到向量中。沒有必要跟蹤矢量中的整數數量,矢量爲你做。 – Kundor

+0

我會建議找一位導師/與同學一起在學校工作。這個廣泛的問題(特別是額外的不必要的信息)通常在SO上表現不佳。 – user2864740

+0

如果你知道C++和它的標準庫,那麼有一種非常簡單的方法可以實現你想要的功能。但爲了幫助您解決這個問題,您首先需要了解輸入單個值的基本知識,以及如何將它們逐個添加到矢量中。 –

回答

1

你提到你在Java的背景,我很遺憾地通知您,您是從Java的炎痛苦:

try 
    { 
     //Only pull the integer values into a vector 
     while (inputFile >> numInt) 
     { 
      numCt++; 
     } 
    } 
    catch (string noString) 
    { 
     cout << noString; 
    } 

這或多或少如何將這些各種各樣的事情在Java中工作:如果發生錯誤,Java通常會拋出異常。在這裏,您試圖讀取一個int值,並且假設在讀取的下一個項目不是整數時拋出異常。

這就是它通常在Java中的工作原理,但這不是C++的工作原理。

如果>>運算符失敗,C++將輸入流設置爲錯誤狀態,並且在沒有執行轉換的情況下正常返回,從而使int值未初始化。 C++不會拋出異常。通常,C++代碼比等效的Java代碼少得多的異常。

正如我以前多次說過的那樣,我認爲C++的初學者由於沒有錯誤,在輸入流上使用>>操作符,因此不公平地經歷了很多挫折。他們的教師教導他們一直使用它,但他們確實不應該這樣做。這是一本教科書的例子。

您期待>>讀取下一行文字。它沒有。它從輸入流中讀取下一個以空格分隔的glob。如果你有

2 3 

那麼>>運營商將只讀取 '2',而不是 '3'。此外,>>運算符就像任何形式的空白一樣對待換行符。而且,正如我所提到的,由於>>處理錯誤報告的方式,您必須明確地檢查它。

總之,這個你應該如何處理輸入的每一行,在C++:

std::string line; 

std::getline(std::cin, line); 

這讀取文本的單行。而已。你完成這一步後,才,你就可以開始與>>運營商亂搞,要弄清楚什麼是在那裏:

std::istringstream parse(line); 

parse >> numInt; 

if (parse.fail()) 
{ 
    // Conversion failed, to what you want with it. 
} 

清潔,簡單,這裏解析故障不會影響狀態輸入流,如果發生故障,您必須重置該輸入流。

+0

好吧,我明白了。 getline()運算符將是C++中的正確​​方法。我將重新構建程序並從那裏開始。感謝您的幫助 – NStafford

+1

**默認情況下**不會拋出異常,但通過設置[例外](http://www.cplusplus。com/reference/ios/ios/exceptions /)標誌。 –

+0

我從你寫的東西看。所以我應該明確地用C++來做這些例外,而不是靠語言的運作方式? – NStafford