2013-04-19 129 views
-3

我不太確定我會如何去做這件事。我有一個數組在每一行中有幾個值。例如,有一個「名稱」值,一個「id」值和一些其他值。我正在閱讀另一個文本文件,該文件有一個數字,我想然後'找到'數組並編輯它。我不知道我是否正確地解釋了它,但是讓我們說,例如,新的文本文件說。如何從數值中找到數組的一行?

2000 -1.6 

我會想,然後找到「陣列」擁有的「2000'的ID值。假設Array[3](使用陣列作爲我的陣列的示例名稱)的ID值爲2000。我如何讓程序「知道」Array[3]具有相同的值?我想讓它尋找與文本文件中的行具有相同ID的行。

此外,有沒有辦法讀取'-1.6'作爲一個整數1.6,但作爲一個負數沒有專門挑出它?如果我的解釋很奇怪,我很抱歉,但我想不出有任何其他方式說出來。

編輯:這是我現在的代碼。這只是程序中的一個問題,我不知道該怎麼辦。函數「getdata2」是我要做的地方。我希望該函數能夠讀取每行中有兩個值的文本文件(我知道該怎麼做);一個4位數字(ID)和一個數字值,如「-1.6」。我想查找ID與A/B/C.txt文件中的ID匹配的數組的行,並使用A/B/C.txt文件中的數值編輯其「weight」值。所以我想要做的一個例子就是這個。我執行我的程序。第三行的ID值爲'2000',權重值爲'52'。在我讀取peeps.txt(函數getdata中使用的第一個文本文件)的所有行後,我會執行函數getdata2,它將從A/B/C.txt讀取數據。如果該文件中的第一行文本的內容爲「2000 -1.6」,那麼我會希望它找到ID值爲2000的數組部分(本例中爲Person [3]),然後修改其重量值從中減去1.6,將其更改爲50.4。但我不知道如何去「發現」它。

#include <iostream> 
#include <fstream> 
#include <iomanip> 
#include <string> 
using namespace std; 
struct person 
{ 
string firstname; 
int id; 
double height; 
double weight; 
double bmi; 
double change; 
}; 
void getdata (person *array, person *ptr); 
void printData (person *array, person *ptr); 
void calculateBMI (person *array, person*ptr); 
void getdata2 (person *array, person *ptr); 
int main() 
{ 
person array[13]; 
person *ptr; 
ptr = &array[0]; 
getdata(array, ptr); 
calculateBMI(array, ptr); 
printData(array, ptr); 




} 

void getdata (person *array, person *ptr) 
{ 

ifstream inData; 
inData.open("peeps.txt"); 
while(!inData.eof()) 
{ 
    for(ptr = &array[0]; ptr < &array[13];ptr++) 
{ 
inData >> ptr->firstname >> ptr->id 
>> ptr->height >> ptr->weight; 

} 
} 
} 
void printData (person *array, person *ptr) 
{ 
cout << "Name" << "  ID" << "  Height" 
<< "  Weight " << "BMI" << endl; 
for(ptr = &array[0]; ptr < &array[13];ptr++) 
{ 
cout << ptr->firstname << " "<< ptr->id 
<< " "<< ptr->height << "  "<< ptr->weight << 
"  "<< ptr->bmi << endl; 
} 
} 
void calculateBMI (person *array, person*ptr) 
{ 
for(ptr = &array[0]; ptr < &array[13];ptr++) 
{ 
    ptr-> bmi = 703*(ptr->weight/((ptr->height)*(ptr->height))); 
} 
} 
void getdata2 (person *array, person *ptr) 
{ 
ifstream inData; 
string filename; 
int size; 
cout << "Select from file 'A', 'B', or 'C'" << endl; 
cin >> filename; 
if (filename == "a" || filename == "A") 
{ 
    inData.open("A.txt"); 
    cout << "Opening A.txt..." << endl; 
    size = 17; 
} 
if (filename == "b" || filename == "B") 
{ 
    inData.open("B.txt"); 
    cout << "Opening B.txt..." << endl; 
    size = 9; 
} 
if (filename == "c" || filename == "C") 
{ 
    inData.open("C.txt"); 
    cout << "Opening C.txt..." << endl; 
    size = 12; 
} 
else 
{ 
cout << "You have entered an incorrect filename." << endl; 
} 
while (size > 0) 
{ 

    size--; 
} 


} 
+0

你能更清楚一點你正在使用什麼類型?你在處理矢量? – bdwain

+1

還有什麼你的意思是「每行有幾個值」? – bdwain

+2

這不是一個合理的問題......您應該嘗試自己編寫一些代碼,並在遇到困難時詢問具體問題。現在,我們無法知道您是否知道如何打開文件,解析值,使用矢量,for循環等 - 所以我們不知道要提供多少細節。 –

回答

0

的std :: find_if會做你想要什麼,如果配對了一個仿函數(在這種情況下,isTarget)。

#include <iostream> 
#include <algorithm> 

struct X { int id; int val; }; 

class isTarget { 
public: 
    isTarget(int target): target_(target) {} 
    bool operator() (X &item) { return item.id == target_; } 
private: 
    int target_; 
}; 

int main() 
{ 
    X x[] = { {1000, 1}, {2000, 2}, {3000, 3}, {4000, 4} }; 
    X* ele = std::find_if(x, x+4, isTarget(3000)); // this does the work 
    std::cout << ele->val; 

    return 0; 
} 
相關問題