0

我有以下代码从 txt 文件中读取输入,如下所示

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

我的代码是将数据加载到地图中,然后我想打印地图内容以确保它已正确插入,我检查了 m 的值,因为它在分割线时使用。但是,在执行过程中,我将其视为 continue 0s,这意味着它永远不会进入 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;
          }
4

5 回答 5

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只打开文件。毕竟你只想从中读取。

于 2012-10-17T11:02:26.350 回答
1

您不能标记std::stringusing strtok。改用getline

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

在每次迭代中,token包含来自 的下一个已解析标记str

于 2012-10-17T10:59:55.917 回答
1

您的 fstream 不应在应用模式下打开。这将寻找文件到文件末尾。std::ios::app从中删除。

于 2012-10-17T11:00:11.923 回答
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;
}
于 2012-10-17T11:03:07.707 回答
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

这是不正确的,因为来自堪培拉和巴黎的 John 添加了 6,而 Juli 和 Mary 添加了 0。关于我在哪里弄错的任何想法,它关于时间向量,似乎我需要重置每一行的值或在插入后清除内容。额外的 0 呢?

于 2012-10-17T11:50:10.967 回答