2010-09-27 109 views
1

我正在写我的C++项目,并在Visual Studio中的一切项目进展良好,但是当我编译它在Ubuntu上很多事情就错了。 例如:编译C++ ubuntu上

int main (int argsNum, char* args[]){ 
    Country* country = new Country("USA"); 
    Military* military = new Military("Army",country); 
    Shalishut* shalishut = new Shalishut(military); 
    Manager* manager = Manager::GetInstance(); 

    FileReader* fileReader = FileReader::GetInstance(); 
    fileReader->ReadCityConfig(args,country); 
    fileReader->ReadRoadConfig(args,country); 
    fileReader->ReadMilitrayCampConfig(args,military); 

    military->ShowBases(); 

    return 0; 
} 

void FileReader::ReadMilitrayCampConfig(char* args[], Military* military){ 
    string line; 
    char inputFileName [MAX_FILE_NAME_LEN]; 
    strcpy (inputFileName,args[3]); 
    ifstream myfile (inputFileName); //inputFileName 
    char* campName; 
    string cityName; 

    if (myfile.is_open()){ 
     while (!myfile.eof()){ //until the end of file 
      getline (myfile,line); //separate each line. 
      if ((line.size() != 0) && (line[0] != '#')) { 
       campName = strtok(&line[0],","); 
       cityName = (string)strtok(NULL,","); 
       Shalishut::FixName(campName); Shalishut::FixName(&cityName[0]); 
       if (!(military->IsBaseExist(campName))){ 
        if (military->GetCountry()->IsCityExist(cityName)){ 
         Base* baseToAdd = new Base(campName,cityName); 
         if (baseToAdd != NULL){ 
          military->AddBaseToMilitary(baseToAdd); 
          military->GetCountry()->FindCity(cityName)->AddBaseToCity(baseToAdd); 
         } 
        } 
        else cout << "ERROR: City named \"" << cityName << "\" does not exist, can't add base \"" << campName << "\" !" << endl<<endl; 
       } 
       else cout << "ERROR: Base Named \"" << campName << "\" is already exist in Military, can't create base!" << endl<<endl; 
      }  
     } 
     myfile.close(); 
    } 
    else throw ExceptionMilitaryCampConfigFileFault(); /*cout << "ERROR: Unable to open MilitaryConfig file!"<< endl;*/ 
} 

bool Country::IsCityExist(const string cityName){ 
    map<string ,City*>::iterator itCities; 
    itCities = m_cities.find((string)cityName); 
    if (itCities != m_cities.end()) return true; 
    else return false; 
} 

void Shalishut::FixName(char* name){ 
    int i; 
    name[0] = toupper(name[0]); 
    for (i=1 ; name[i] ; i++){ 
      name[i] = tolower (name[i]); 
     } 
    } 
} 

的问题是程序读取城市和道路,但是当它读取军营,我得到:

" does not exist, can't add base "Hazerim" ! 

即使在配置文件中,我有基地同名。 提醒:在视觉工作室,它完美的作品!

+2

你可能对你的数据文件DOS(CR + LF)行结尾,你的解析代码是不是合租稳健,因此不会处理这个非常好。 – 2010-09-27 10:22:38

+0

@Paul R,之前的编辑在最后3行更清晰! – DumbCoder 2010-09-27 10:22:49

+0

我现在看到,代码是清晰的,颜色..改变的东西? – Aviadjo 2010-09-27 10:35:39

回答

1

假设错误消息实际上是ERROR: City named _____ does not exist, can't add base "Hazerim"我会仔细看城市和城市为基地在你投入的资本/拼写。他们可能不匹配。

std::string上也使用strtok只是要求麻烦,因为它具有破坏性,字符串不会指望它们的内部状态被随机吹走。有像find_first_of这样的方法可以帮助你解析C++字符串。

1

像其他人说:

  • 仔细检查行结束(可能在输入文件运行DOS2UNIX的代替一个更强大的/错误=容易解决)

  • 确保一切的情况下,是正确的,文件名是区分大小写的

  • 知道它正在寻找的文件,确保一切都在CWD

1

我建议不std::string内部乱搞。我不知道这是合法的,肯定会造成问题。使用.c_str()获取C风格的字符串并将其复制到char [],或使用字符串函数来分析输入。

要进行调试,请输入insome输出语句,以便查看字符串值,或了解一些关于gdb的内容并逐步完成初始化运行。

cityname = (string)...只是普通的难看。既然你没有使用cityname指出范围,你可以声明string cityname(...);,并cityname总会被初始化,将被定义靠近它使用的地方。