這是我的第一個問題,所以我可能會錯過“正確的結構”。
無論如何,我有一個頭檔案,有一個函式。此函式 (void readFile()) 在 cpp 檔案中定義。在這個定義中,我有很多重復的代碼。
如果它在 main 中,我只需宣告一個新函式,在其中定義可重復的,然后每次呼叫該函式。但由于它位于非主 cpp 檔案中,因此我在此程序中遇到問題。
基本上,我的函式所做的是逐個字符地讀取檔案,并根據文本將資料保存到不同的物件中。
我的代碼如下所示:
source.open("bookings.txt", std::ios::in);
char c;
source.get(c);
while (c != '|'){
CurrentID.push_back(c);
source.get(c);
}
object.setID(CurrentID)
此代碼重復自身,僅替換“object.setID”行。我嘗試宣告函式“search(std::ifstream x, char y, std::string z);” 有定義
void Search(std::ifstream x, char y, std::string z){
x.get(y); // next after |
while (y != '|'){
z.push_back(y);
x.get(y);
}
}
但是,如果我嘗試在“void readFile()”定義中呼叫此函式,如下所示:
// First block as a repeatable
source.get(c);
while (c != '|'){
CurrentID.push_back(c);
source.get(c);
}
object->setID(CurrentID)
CurrentID.clear();
// second block as a function, with repeatable code commented out
void Search(std::ifstream quelle, char c, std::string &CurrentID);
/* source.get(c);
while (c != '|'){
CurrentID.push_back(c);
source.get(c);
}*/
object->setPrice(stof (CurrentID));
CurrentID.clear();
它從第一個塊中的“CurrentID.clear()”直接跳轉到第二個塊中的“object->setPrice”,忽略了 void Search 函式的存在。有什么建議如何使函式作業,或者以其他方式洗掉重復的代碼?
uj5u.com熱心網友回復:
我不知道這是否能準確回答你的問題。如果沒有,請發布您的整個代碼,尤其是readFile函式。
假設您想要一個readFile函式:
- 決議輸入流,并且
- 填寫結構串列的欄位 ID(字串)和價格(浮點數)
object, - 流中的值由
|字符分隔,并且, - 對重復代碼使用第二個函式
readToken(即,從輸入流中讀取,直到找到分隔符并回傳一個字串)。
下面的代碼就是這樣做的。注意:
- 您將
readFile和定義readToken為單獨的函式,并且 - 兩者都會改變輸入流的狀態。
[演示]
#include <iostream>
#include <sstream>
#include <string> // stof
#include <vector>
struct object {
std::string id;
float price;
};
std::string readToken(std::istringstream& iss) {
std::string ret{};
char c{};
while (true) {
iss >> c;
if (not iss.eof() and c != '|') {
ret.push_back(c);
} else {
return ret;
}
}
}
std::vector<object> readFile(std::istringstream& iss) {
std::vector<object> ret{};
while (not iss.eof()) {
auto id = readToken(iss);
auto price = std::stof(readToken(iss));
ret.emplace_back(id, price);
}
return ret;
}
int main() {
std::istringstream input{"ID1|25.5|ID2|3.14"};
auto objects = readFile(input);
for (const auto& o : objects) {
std::cout << o.id << ", " << o.price << "\n";
}
}
// Outputs:
//
// ID1, 25.5
// ID2, 3.14
一個更簡單的方法是std::getline讀取令牌:
[演示]
std::vector<object> readFile(std::istringstream& iss) {
std::vector<object> ret{};
while (not iss.eof()) {
std::string id{};
std::getline(iss, id, '|');
std::string price_str{};
std::getline(iss, price_str, '|');
auto price = std::stof(price_str);
ret.emplace_back(id, price);
}
return ret;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/523695.html
標籤:功能c 11重复冗余
