2012-10-17 63 views
0

我有一個從txt文件讀取輸入以下代碼作爲跟隨閱讀文件和拆分C++中的線

Paris,Juli,5,3,6 
Paris,John,24,2 
Canberra,John,4,3 
London,Mary,29,4,1,2 

我的代碼加載數據到地圖上,然後我要打印的地圖內容製作確保它已被正確插入,我檢查了m在分割線時的使用情況。然而,在執行過程中,我將它作爲0繼續,這意味着它永遠不會進入while循環。我以前使用過這部分代碼,它工作。我找不到我犯了錯誤的地方。

#include <iostream> 
#include <fstream> 
#include <string> 
#include <cstdlib> 
#include <vector> 
#include<map> 
using namespace std; 

struct info { 
     string Name; 
     int places;// i will use the binary value to identfy the visited places example 29 is 100101 
      // this means he visited three places (London,LA,Rome) 
     vector<int> times; // will represent the visiting time,e.g. 1,2,5 means london 1 time, LA 
        // twice and Rome five times 


     }; 
map<string,vector<info> > log; 
map<string,vector<info> >::iterator i; 
fstream out; 
int main() { 
    out.open("log.txt", std::ios::in | std::ios::out | std::ios::app); 
      string line; 
      char* pt; 
      string temp[19]; 

    // for each line in the file 
    while (!out.eof()) 
    { 
     getline(out,line);//read line from the file 
     pt=strtok(&line[0],",");//split the line 
     int m=0; 
     while (pt != NULL) 
     { 
     temp[m++] = pt; // save the line info to the array 
     cout<<m<<" "; 
     pt = strtok (NULL, ","); 
     } 
     cout<<m<<" "; // during the execution I get this as continues 0s which means it is never enter the while loop 
     info tmp; 
     // read the other data 
     tmp.Name=temp[1]; 
     tmp.places=atoi(temp[2].c_str()); 
     for (int i=3;i<=m;i++) 
     { 
     tmp.times.push_back(atoi(temp[i].c_str())); 
     }   
     // create a new object 
     log[temp[0]].push_back(tmp); 
     } 

vector<int>::iterator j; 
    for(i=log.begin();i!=log.end();i++) { 
    cout<< "From "<< i->first<<" city people who travels: "<<endl; 
    for (size_t tt = 0; tt < (i->second).size(); tt++) { 
    cout<< (i->second[tt]).Name<< " went to distnations "<< (i->second)[tt].places<<" \nwith the folloing number of visiting time "; 
    for (j=((i->second[tt]).times).begin();j!= ((i->second[tt]).times).end();j++) 
    cout<<*j<<" "; 
    } 
    } 


      system("PAUSE"); 
      return 0; 
      } 
+0

另請參閱[此問題](http://stackoverflow.com/q/236129/1025391)在C++中分割字符串。 – moooeeeep

+0

strtok需要char *,但它採取「字符串」類型?我其實不知道。 cstring是否包含在你的代碼中? strtok應該在那裏。 – taufique

+0

也許你的輸入文本是**而不是**命名爲'log.txt' –

回答

1

你的fstream不應該在app模式下打開。這將查找文件到文件末尾。從中刪除std::ios::app

1

使用strtok不能標記std::string。使用getline代替:

std::string str("some,comma,separated,data"); 
std::string token; 
while (getline(str, token, ',')) { 
    cout << "Token: " << token << end; 
} 

在每次迭代中,token包含str下一個解析的標記。

3

這是一個錯誤

// for each line in the file 
while (!out.eof()) 
{ 
    getline(out,line);//read line from the file 

應該

// for each line in the file 
while (getline(out,line)) 
{ 

我覺得很坦然令人難以置信多久重複這個錯誤。 eof不符合您的想法。它測試上次讀取因文件結束而失敗。您正在使用它來嘗試和預測下一次讀取是否會失敗。這根本就不行。

此行是一個錯誤

pt=strtok(&line[0],",");//split the line 

strtok作品在C字符串,也不能保證它會在std::string工作。

但這些都不可能是你真正的錯誤。我建議只打開文件ios::in。畢竟你只想讀取它。

+0

actullay我想從文件中讀取數據,然後向其添加新數據。我之前在這種程序中使用過strtok,它起作用。 – user1749118

+0

如果我把你寫的while條件,程序不讀取任何數據。 – user1749118

+0

@ user1749118當然有效。但你很幸運。不能保證它總能正常工作。您使用的下一個編譯器或您編寫的下一個程序可能無法正常工作。你應該像Nickolay說的那樣去做。 – john

0

這是錯誤的temp[m++] = pt; // save the line info to the array

切換到這樣的事情,而不是「TEMP」

std::vector<std::string> vTemp; 

pt=strtok(&line[0],",");//split the line  
while (pt != NULL) 
{ 
vTemp.push_back(pt); // save the line info to the array  
pt = strtok (NULL, ","); 
} 

還要考慮使用像這樣做的分裂。

std::vector<std::string> SplitString(const std::string &strInput, char cDelimiter) 
{ 
    std::vector<std::string> vRetValue; 

    std::stringstream ss(strInput); 
    string strItem; 
    while(std::getline(ss, strItem, cDelimiter))  
    { 
     // Skip Empty 
     if(strItem.size()==0)  
      continue; 

     vRetValue.push_back(strItem); 
    } 

    return vRetValue; 
} 
0

@halfelf我簡單的錯誤真是偉大的解決方案,它的工作原理,但現在的問題是,當我打印,我得到這個

From Paris city people who travels: 
Juli went to distnations 5 
with the folloing number of visiting time 3 6 0 
John went to distnations 24 
with the folloing number of visiting time 2 6 
From Canberra city people who travels: 
Johnwent to distnations 4 
with the folloing number of visiting time 3 6 
From London city people who travels: 
Mary went to distnations 29 
with the folloing number of visiting time 4 1 2 0 

這是不正確的,因爲6是從加入約翰數據堪培拉和巴黎和0被添加到朱莉和瑪麗。 任何想法在哪裏我錯了,它關於時間向量,似乎我需要重置每行的值或清除插入後的內容。那額外的0呢?

+0

解決這個問題,只是從for循環中刪除=符號for(int i = 3; i <= m; i ++)'..謝謝大家的幫助 – user1749118