對於初學者,請使用std::getline
將行改爲std::vector<std::string>
, 。然後按照需要的順序對其進行排序。 然後輸出它們。所以main
基本上變成三行:
std::vector<Line> data(readLines(inFile));
sortByBirthYear(data);
std::copy(data.begin(), data.end(), std::ostream_iterator<std::string>(outFile, "\n"));
當然,readLines
和sortByBirth
需要寫成 好,但他們都相當微不足道的爲好。
或者,更好的可能,你可以定義 一個DataLine
類的operator>>
,並operator<<
和 比較函數(operator<
),然後將所有你需要的是:
std::vector<DataLine> data(
(std::istream_iterator<DataLine>(inFile)),
(std::istream_iterator<DataLine>()));
std::sort(data.begin(), data.end());
std::copy(data.begin(),
data.end(),
std::ostream_iterator<std::string>(outFile, "\n"));
那是什麼我會這樣做,但是如果你剛剛開始使用C++,那麼你可能不會覆蓋必要的基礎知識,例如類和運算符 重載。
我還會根據您的代碼添加一件事:請勿訪問 您輸入的數據,而不要首先檢查輸入 是否成功。
EDIT(只使用基本功能實現):
如上(但沒有Line
型):
std::vector<std::string> data(readLines(inFile));
std::sort(data.begin(), data.end(), orderByBirthYear);
std::copy(data.begin(), data.end(),
std::ostream_iterator<std::string>(outFile, "\n"));
有:
std::vector<std::string>
readLines(std::istream& source)
{
std::vector<std::string> results;
std::string line;
while (std::getline(source, line)) {
results.push_back(line);
}
return results;
}
bool
orderByBirthYear(std::string const& lhs, std::string const& rhs)
{
return lhs.compare(54, 4, rhs, 54, 4) < 0;
}
但我堅持認爲:這是不是如何解決它。任何 合理的解決方案將首先爲您的 數據定義一個類,並使用它定義所有操作。這意味着 不僅僅定義了class
,還包含了運算符重載;如果您剛剛開始 ,您可能還沒有看到任何這些 (並且該作業對於該課程的質量而言不是一個好跡象)。
其餘的,你在正確的軌道上;對於面向行的 輸入,您應該閱讀使用getline
。然而,在那之後, 該行已經從輸入中提取出來;要進一步解析它, 您需要用它初始化一個std::istringstream
,並從中讀取 。除了您的輸入格式似乎基於 列,因此您可能使用substr
函數 std::string
來獲取單個字段。一旦你有 他們,你會想要去掉前導空白和尾隨空白,並且 可能會轉換爲數字類型(雖然只需排序 年,這是沒有必要的)。但是所有這些在邏輯上會在用戶定義的operator>>
到Data
類中發生。 (同樣,你會提供定義operator<<
寫 排序的數據出來,而且通常情況下,orderByBirthYear
,上面 將是一個類,以及用戶。)
我不會用C++這個 – P0W
這是什麼意思?我剛開始一個C++類,我們被要求這樣做。今天晚上到期的巨大任務,我無法獲得幫助,因爲我在UNI中幾乎不認識一個人。我知道其他人只是幫助彼此分享代碼。但是我必須自己來做這件事,可惜的是,在C++中! –
爲什麼你要逐一提取第1〜第2〜3〜6行? – P0W