2013-10-13 33 views
0

因此,對於我的第二個C++類,我們必須編寫一個程序來創建5個結構體和一個類的數組。在結構中是一個int,一個5個雙精度數組和一個81個元素的字符數組。當然,其中一項功能是從用戶那裏獲取信息。該功能被稱爲setStructData():我在做什麼輸入功能有問題?

void Prog1Class::setStructData() 
{ 
    for(int i=0; i<5; i++) 
    { 
     cout<<"input an integer, five doubles, and a character array up to 80 characters."<<endl; 
     cin>>StructArray[i].m_iVal; 
     for(int j=0; j<5; j++) 
     { 
      cin>>StructArray[i].m_dArray[j]; 
     } 
     cin.ignore('\n'); 
     cin>>StructArray[i].m_sLine; 
     cout<<"String entered: "<<StructArray[i].m_sLine<<endl; 
    } 

} 

下一個函數getStructData()是結構和COUT的陣列中的每個元件採取給用戶的元件在一行中,下一個元件上的下一行和如此等等,直到顯示陣列上的所有5個元素。這是我有:

void Prog1Class::getStructData(int index, Prog1Struct *struct_ptr) 
{ 
    struct_ptr=&StructArray[index]; 
    cout<<struct_ptr->m_iVal<<" "; 
    for(int i=0; i<5; i++) 
    { 
     cout<<struct_ptr->m_dArray[i]<<" "; 
    } 
    cout<<struct_ptr->m_sLine<<endl; 
} 

這個節目時,我通過鍵盤輸入(這是在structarray輸入的每個元素在同一行)進入工作,但我的教授給了我們一個文本文件test.txt是我們應該使用,它看起來像這樣(與字符數組在另一條線路比其他人):

10 1.2 2.3 3.4 4.5 5.6 
Test string 1 
20 2.3 3.4 4.5 5.6 6.7 
Test string 2 
30 3.4 4.5 5.6 6.7 7.8 
Test string 3 
40 4.5 5.6 6.7 7.8 8.9 
Test string 4 
50 5.6 6.7 7.8 8.9 9.1 
Test string 5 

其多數民衆贊成擰我的程序了文本文件,因爲它有一個完全的字符數組不同的路線。我相信它只是我輸入數據的方式,但我不知道如何解決它。有人能幫助我嗎? 當我使用I/O重定向來使用test.txt文件輸入我的數據時,我得到它輸出第一行(沒有字符串),然後剩下的就是一堆瘋狂的垃圾。請幫助我!d

回答

1

首先,您應該總是驗證您的輸入是否成功!也就是說,始終使用格式化的輸入字符數組,當看完後檢查流仍處於良好的狀態,例如:

if (!(std::cin >> StructArray[i].m_dArray[j])) { 
    std::cout << "failed to read double value\n"; 
} 

接下來,你應始終首先設置寬度!如果不設置你的寬度創建一個攻擊向量進入你的程序,可以被黑客攻擊(也可能沒有關係你的家庭作業,但一旦你創建專業的軟件它很可能無關緊要):

if (!(std::cin >> std::setw(sizeof(StructArray[i].m_sLine)) >> StructArray[i].m_sLine)) { 
    std::cout << "failed to read string\n"; 
} 

注意,但是,格式化的輸入始終停止讀取第一個空格字符。來自文件的輸入似乎包含形式爲Test string的字符串,這將導致Test被讀取,並且string被留在流中以供下一個要讀取的項目。您可以使用getline()讀取所有輸入,直到行尾。但是,由於所有格式化的輸入操作都傾向於在數據流中留下空格字符,例如數字後面的換行符,因此您應該讀取前導空格。例如,你可以使用

if (!(std::cin >> std::ws).getline(StructArray[i].m_sLine, sizeof(StructArray[i].m_sLine)) { 
    ... 
} 

就個人而言,我更願意用std::getline(std::cin >> std::ws, str)與第二個參數是std::string型的,但似乎你的任務不允許使用std::string類。 操縱器std::ws讀取所有前導空格。