2014-03-04 53 views
0

這是一個相當原始的問題,所以我猜解,應該不難,但我沒有找到一個方法如何做到這一點簡單的,也沒有我總結它實際上在互聯網上找到它。
所以去的問題,我的信息,像這樣的文件:C++檢查,如果從文件中讀取的最後一件事是一些

1988 Godfather 3 33 42 
1991 Dance with Wolves 3 35 43 
1992 Silence of the lambs 3 33 44 

我不得不把所有的信息在數據結構的要求,因此可以說這將是int yearstring name和三個用於數字的int類型。但是,我怎麼知道我讀的下一個東西是否是一個數字呢?我永遠不知道這個詞有多長。
預先感謝任何花時間處理這樣一個原始問題的人。 :)
編輯:不要考慮自己的冠軍數字電影。

+1

'的std :: getline'和解析串入部件和/或使用更好的分隔符不是一個空間。 – crashmstr

+0

如果您可以控制文件格式,請使用空格以外的內容作爲分隔符。 ','或'|'可能就足夠了。 –

回答

2

你將有一些重大的問題,當你去嘗試分析其他電影一樣,自由威利2

你可以嘗試,而不是把它當作一個標準: :stringstream並依靠最後三個塊作爲你正在尋找的數據,而不是用Regular Expression來推廣。

1

你最好的選擇是使用C++ regex

這將使你在想什麼解析一個更爲精細的控制。 例子:

year -> \d{4} 
word -> \w+ 
number->\d+ 
+0

我其實是C++的新手,能否更好地解釋它是如何工作的?我想我明白d代表十進制,w代表一個字母(?),但是這是如何在一般情況下工作的? – Rywi

+2

這將是非常難以得到的權利時,電影標題的數字(例如,「冰河世紀2」),當電影的標題是一個實際的數字(例如「300」)結束,或。 –

+0

@ZacHowland Ohh感謝您的糾正。我沒有注意到文本是電影標題,並可能包含數字。 – DhruvPathak

0

如果你沒有在文件格式的控制,你可能想要做的東西沿着這些路線(僞過程):

1) read in the line from the file 
2) reverse the order of the "words" in the file 
3) read in the 3 ints first 
4) read in the rest of the stream as a string 
4) reverse the "words" in the new string 
5) read in the year 
6) the remainder will be the movie title 
+0

我真的很喜歡這個想法,我可以問你,我應該用什麼方法來改變它? – Rywi

+0

@Rywi你將不得不寫自己([有一些做其他SO問題](http://stackoverflow.com/questions/1009160/reverse-the-ordering-of-words-in-a-string) ),但是您可以在步驟2和4中重複使用它。 –

0

閱讀每場爲一個字符串,然後轉換成相應的字符串整數。

1)initially 
    1983 
    GodFather 
    3 
    33 
    45 
    are all strings and stored in a vector of strings (vector<string>). 

2)Then 1983(1st string is converted to integer using atoi) and last three strings are also converted to integers. Rest of the strings constitute the movie_name 

下面的代碼已經假設輸入文件已經過驗證的格式下寫成的。

// open the input file for reading 
ifstream ifile(argv[1]); 
string input_str; 

//Read each line   
while(getline(ifile,input_str)) { 
stringstream sstr(input_str); 
vector<string> strs; 
string str; 
while(sstr>>str) 
    strs.push_back(str); 
    //use the vector of strings to initialize the variables 
    // year, movie name and last three integers 
      unsigned int num_of_strs = strs.size(); 

      //first string is year 
    int year = atoi(strs[0].c_str()); 

      //last three strings are numbers 
    int one_num = atoi(strs[num_of_strs-3].c_str()); 
    int two_num = atoi(strs[num_of_strs-2].c_str()); 
    int three_num = atoi(strs[num_of_strs-1].c_str()); 
    //rest correspond to movie name 
    string movie_name(""); 
    //append the strings to form the movie_name 
      for(unsigned int i=1;i<num_of_strs-4;i++) 
     movie_name+=(strs[i]+string(" ")); 
     movie_name+=strs[i]; 

恕我直接改變文件中的分隔符從空間到一些其他字符,或;或:,將顯着簡化解析。 例如,如果以後對數據的規格變化,而僅最近三年,無論是過去三,最後四個可整數,然後上面的代碼將需要大規模的重構。

相關問題