이 문제를 해결하는 방법을 알 수없는 신비한 문제가 생겨서 도움이 필요합니다.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();
};
은 정의되지 않은 동작처럼 보입니다. 우리는 실제 코드를 보여주지 않으면 ** 아무 것도 ** 말할 수 없습니다. –
argv [3]가 종료 null을 잃어 버리고있는 것처럼 보입니다. 그래서 어딘가에서 코드가 메모리를 손상시키고 있습니다.디버거를 사용하여 각 라인에서 argv [3]의 결과를 관찰하고 변경된시기를 확인해야합니다. std :: string을 사용하는 것은 좋은 생각이었습니다. 고정 길이 char 배열은 까다 롭습니다. sc_damange를 변경하고 문자열로 덤프하는 것으로 시작할 수도 있고, fin.getline 대신 std :: getline을 사용하는 것이 안전합니다. –
덕분에 많은 조언을 드리겠습니다. 내가 한 것은 출력을 위해 argv [3]를 생략하는 것입니다. 나는 심지어 "xxxxxxx"와 같은 내부 문자열을 정의하고 이것을 유일한 출력으로 만들었습니다. 그래서 프로그램 내에서 정의 된 스트링보다 다른 결과는 나오지 않고 여전히이 효과를 얻었습니다. (필자는 올바르게 생각 했음에도 불구하고 이미 이것을 더 이상 믿을 수 없습니다.) 많이 시도한 후에 남아있는 유일한 문제는 cygwin의 호출이 cmd의 호출과 다른 행동으로 이어지는 것처럼 보였습니다. – user3010324