2013-09-27 166 views
0

我想感謝所有幫助我解決問題的人。我終於能夠按出生年份安排數據!非常感謝。如果有人能幫助我最後一個問題,那簡直太好了從一個文本文件到另一個文本文件的處理線

如果我有一個文本文件,幾行是這樣的:

1 4:48:08 Orvar Steingrimsson     1979 30 - 39 ara  IS200 
2 4:52:25 Gudni Pall Palsson     1987 18 - 29 ara  IS870 

我怎麼能輸出這個數據到一個新的文本文件但只列出三件事情:年 - 名字 - 時間......讓這兩條線路是這樣的:

1979 Orvar Steingrimsson 4:48:08 
1987 Gudni Pall Palsson 4:52:25 

我的猜測是這樣的:

ifstream in("inputfile.txt"); 
ofstream out("outputfile.txt"); 
int score, year; 
string name, time, group, team; 
while (getline(in,str)); 
in >> score >> time >> name >> year >> group >> team; 
//and then do something like this 
out << year << name << time << '\n'; 

但是我有一種感覺,我將無法循環遍歷整個文本文件和所有200行。任何提示讚賞!謝謝

+0

我不會用C++這個 – P0W

+0

這是什麼意思?我剛開始一個C++類,我們被要求這樣做。今天晚上到期的巨大任務,我無法獲得幫助,因爲我在UNI中幾乎不認識一個人。我知道其他人只是幫助彼此分享代碼。但是我必須自己來做這件事,可惜的是,在C++中! –

+0

爲什麼你要逐一提取第1〜第2〜3〜6行? – P0W

回答

0

「我知道今年是永遠的54在每行」

所以第58字符,可以這樣考慮:

int main() 
{ 
    ifstream in("laugavegurinn.txt", ios::in); 
    ofstream out("laugavegurinn2.txt"); 
    string str; 
    multimap<int, string> datayear; 

    while (getline(in,str)) { 
     int year = stoi(str.substr(54, 4)); 
     datayear.insert(make_pair(year,str)); //use insert function 
     // multimap don't have [] operator 
      } 

    for (auto v : datayear) 
     out << v.second << "\n"; 

    in.close(); 
    out.close(); 
} 
+0

你是我最好的朋友,是救命恩人。儘管爲此工作了大約一週,並在本網站上提出了無數問題,嘗試了許多方法並反覆閱讀我的C++書,但沒有任何工作。直到你出現。真誠的,謝謝 –

0

對於初學者,請使用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")); 

當然,readLinessortByBirth需要寫成 好,但他們都相當微不足道的爲好。

或者,更好的可能,你可以定義 一個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,上面 將是一個類,以及用戶。)

+0

是的,剛開始,我們幾乎沒有涵蓋sh **。儘管如此,這是該項目。你能通過定義一個DataLine類來幫助我理解你的意思嗎?我知道我需要定義它,如在 class DataLine {...}但是什麼? –

+0

@MagnusOttiBenediktsson我無法描述如何在這個論壇上寫一個班級;太多了。我已經編寫了一份粗略的草案,以便如何在沒有任何額外的課程的情況下做到這一點,但這不是在現實生活中做到這一點的方式。 –

相關問題