2014-07-21 1 views
0

이 문제를 해결하는 방법을 알 수없는 신비한 문제가 생겨서 도움이 필요합니다.cygwin에서 호출 할 때 C++ exe가 파일에 다른 텍스트 출력을 씁니다.

나는 C++ exe를 작성했다.

house <CLASSMISSING> missing  
roof <CLASSMAJORWEAR> major wear 

이 태그에 대한 몇 가지 비교를하고 .csv 파일로 매우 간단 결과 (텍스트) 쓰기 : 그것은 몇 가지 라인이 좋아하는 포함하는 작은 텍스트 파일을 읽는 아주 간단한 작업이 있습니다.

house 11; MISSING 

이 출력에 의해 생성된다 : 같이 출력 보일 ​​것이다

fout << argv[3] << ";" << sC_damages.get_damage(sC_damages.worst_dam_ID).c_str() << "\n"; 

여기서는 argv [3]이 경우 명령의 프로그램에 전달 "11 집"됨 식별자 문자열 sC_damages.get_damage는이 경우 "MISSING"문자열을 출력합니다. 나는 CMD (Win7에)에서이 프로그램을 실행할 때

ofstream fout(argv[2], ios::app); 

또는 Visual Studio에서 2010 모든 괜찮 : 결과는 다음과 같은 방법으로 추가 모드로 연 파일에 기록됩니다. 그러나 나는 cygwin에서 bash 스크립트로 실행하고 싶다. 동일한 결과를 호출

cygdrive/d/CCpp/program.exe "out_tmp//house11.txt" houses.csv "house 11" 

다음 각 동일한 명령 행에 대한 출력 파일 houses.csv의 결과 (보고 :

내가 가진 C++ 프로그램에게 cygwin32 bash는 명령 줄에서 여러 번 호출

그래서 때때로

house 11;MISSING 
house 11;MISSING 
house 11;™ 
ï2åK¨vhouse 11;MISSING 
house 11;MISSING 
house 11;MISSING 
house 11;MISSING 
house 11;MISSING 
house 11;MISSING 
house 11òëc‰çÁu*Ihouse 11;MISSING 

하고 신비로운 문자 inserted.There가에 대한 패턴입니다입니다 : 나는 다음과 같은 재앙을 얻을)에 추가해야합니다. ofstream (필자는 C++ 프로그램에서 사용하는 파일 houses.csv에 기록) 방법

house 11;MISSING 
house 11;MISSING 
house 11;MISSING 
house 11;MISSING 
house 11;MISSING 
house 11;MISSING 
house 11;MISSING 
house 11;MISSING 
house 11;MISSING 
house 11;MISSING 
house 11;MISSING 

난 정말 이해할 수없는 프로그램이 호출 서로 다른 출력을 생성 : CMD를 호출 같은 출력은 완벽한 외모 CMD 또는 cygwin bash에서.

도와주세요!

P.

#include <fstream> 
#include <iostream> 
#include "damageClass.h" 

using namespace std; 

int main(int argc, char **argv) 
{ 
    char ch; 
    int dam_ID = 0; 
    int dam_ID_tmp = 0; 
    char sc_damage[80]; 
    char dump[256]; 
    string uT_Tag; 
    string source = argv[3]; 


    damages sC_damages; 
    sC_damages.reset(); 

    //check correct number command line arguments 
    if (argc != 4) 
    { 
     cout << "Usage: " << argv[0] << "<input concord.txt filename> <output csvfilename> <reportfilename> " << endl; 
     return(1); 
    } 


    //input concord.txt file 
    ifstream fin(argv[1]); 

    //outputcsv file 
    ofstream fout(argv[2], ios::app); 
    if (!fout) 
    { 
     cout << "Unable to open " << argv[2] << " in append mode.\n"; 
     return (1); 
    } 

    while (!fin.eof()) 
    { 
     while (fin.get(ch)) 
     { 

      uT_Tag = ""; 
      if (ch == '<') //if line in concord.txt starts with < 
       fin.putback('<'); 

      //read out damage tag from in between <> 
      if (fin.peek() == '<') 
      { 
       fin.ignore(1, '<'); 
       fin.getline(sc_damage, 80, '>'); 
       fin.getline(dump, 256); 
       uT_Tag = sc_damage; 
       int weight = sC_damages.get_dam_weight(uT_Tag); // weight= only for debug output. Class call necessary to compute worst_dam_ID 
       break; 
      } 
     } 
    } 

    cout << "writing: " << argv[3] << "; " << sC_damages.get_damage(sC_damages.worst_dam_ID) << endl; 
    fout << argv[3] << ";" << sC_damages.get_damage(sC_damages.worst_dam_ID).c_str() << "\n"; 

    fout.close(); 
    fin.close(); 
    return 0; 
} 

이 클래스의 정의입니다 :

#include "damageClass.h" 

//const char *damageTags[5] = { "CLASSOK", "CLASSMINORWEAR", "CLASSMAJORWEAR", "CLASSBROKEN", "CLASSMISSING"}; 
//const char *damages[5] = { "NODAMAGE", "MINORWEAR", "MAJORWEAR", "BROKEN", "MISSING"}; 

damages::damages() 
{ 
    this->damageClasses.clear(); 

    damageClass dC; 
    dC.m_damageTag = ""; 
    dC.m_damage = "NOFINDING"; 
    dC.dam_weight = 0; 
    this->damageClasses.push_back(dC); 

    dC.m_damageTag = "CLASSOK"; 
    dC.m_damage = "NODAMAGE"; 
    dC.dam_weight = 1; 
    this->damageClasses.push_back(dC); 

    dC.m_damageTag = "CLASSMINORWEAR"; 
    dC.m_damage = "MINORWEAR"; 
    dC.dam_weight = 2; 
    this->damageClasses.push_back(dC); 

    dC.m_damageTag = "CLASSMAJORWEAR"; 
    dC.m_damage = "MAJORWEAR"; 
    dC.dam_weight = 3; 
    this->damageClasses.push_back(dC); 

    dC.m_damageTag = "CLASSBROKEN"; 
    dC.m_damage = "BROKEN"; 
    dC.dam_weight = 4; 
    this->damageClasses.push_back(dC); 

    dC.m_damageTag = "CLASSMISSING"; 
    dC.m_damage = "MISSING"; 
    dC.dam_weight = 5; 
    this->damageClasses.push_back(dC); 
} 

damages::~damages() 
{ 
    this->damageClasses.clear(); 
} 

int damages::get_dam_weight(string UT_damageTag) 
{ 
    for (unsigned int i = 0; i < this->damageClasses.size(); i++) 
    { 
     damageClass dC = this->damageClasses.at(i); 
     if (dC.m_damageTag == UT_damageTag) 
     { 
      this->worst_dam_ID = max(dC.dam_weight, this->worst_dam_ID); 
      return dC.dam_weight; 
     } 
    } 
    return 0; 
} 

string damages::get_damage(int dam_weight) 
{ 
    for (unsigned int i = 0; i < this->damageClasses.size(); i++) 
    { 
     damageClass dC = this->damageClasses.at(i); 
     if (dC.dam_weight == dam_weight) 
     { 
      return dC.m_damage; 
     } 
    } 
    return "ERROR: no matching damage class"; 
} 

void damages::reset() 
{ 
    this->worst_dam_ID = 0; 
} 

및 클래스의 선언 :

#include <string> 
#include <vector> 

using namespace std; 


//class description 
class damageClass 
{ 
public: 
    //attributes 
    string m_damageTag; 
    string m_damage; 
    int dam_weight; 
}; 


class damages 
{ 
public: 
    damages(void); 
    ~damages(void); 

    //attributes 
    vector<damageClass> damageClasses; 
    int worst_dam_ID; 

    //methods 
    int get_dam_weight(string UT_damageTag); 
    string get_damage(int dam_weight); 
    void reset(); 
}; 
+0

은 정의되지 않은 동작처럼 보입니다. 우리는 실제 코드를 보여주지 않으면 ** 아무 것도 ** 말할 수 없습니다. –

+0

argv [3]가 종료 null을 잃어 버리고있는 것처럼 보입니다. 그래서 어딘가에서 코드가 메모리를 손상시키고 있습니다.디버거를 사용하여 각 라인에서 argv [3]의 결과를 관찰하고 변경된시기를 확인해야합니다. std :: string을 사용하는 것은 좋은 생각이었습니다. 고정 길이 char 배열은 까다 롭습니다. sc_damange를 변경하고 문자열로 덤프하는 것으로 시작할 수도 있고, fin.getline 대신 std :: getline을 사용하는 것이 안전합니다. –

+0

덕분에 많은 조언을 드리겠습니다. 내가 한 것은 출력을 위해 argv [3]를 생략하는 것입니다. 나는 심지어 "xxxxxxx"와 같은 내부 문자열을 정의하고 이것을 유일한 출력으로 만들었습니다. 그래서 프로그램 내에서 정의 된 스트링보다 다른 결과는 나오지 않고 여전히이 효과를 얻었습니다. (필자는 올바르게 생각 했음에도 불구하고 이미 이것을 더 이상 믿을 수 없습니다.) 많이 시도한 후에 남아있는 유일한 문제는 cygwin의 호출이 cmd의 호출과 다른 행동으로 이어지는 것처럼 보였습니다. – user3010324

답변

0

오른쪽이 다음과 같이

코드는 어려운 것이었다. SafeGuard LanCrypt를 사용하고 있습니다. Cygwin에서 파일을 추가 할 때 명백하게 임의의 기호가 생성됩니다. 암호화되지 않은 공유에 쓰면 문제가 해결됩니다.

관련 문제