入力ファイルを解析しようとすると、奇妙な問題が発生します。このファイルには他のファイルを含めることができ、それらも解析する必要があるという考えです。次のように定義された関数でこれを再帰的に行っています。
int parse_inp(const char* filename)
メイン ファイルは問題なく解析されますが、再帰呼び出しはファイル ストリームを開くことができません。
int parse_inp(const char* filename)
{
char buffer[BUFFER_MAX+1];
char* token;
std::string tok;
int keywordSection;
bool end_of_file;
int cardNum;
...
int i;
std::string tempop;
double tempd1, tempd2;
SetSegmentCard2 tempSetSegmentCard2;
int offset;
printf("%s\n", filename);
std::ifstream inp;
inp.clear();
inp.open(filename, std::ios::in);
if(!inp.good() || !inp.is_open())
{
char path1[256];
getcwd(path1,256);
printf("CWD: %s\n", path1);
fflush(NULL);
printf("Unable to open '%s'\n", filename);
return 0;
}
std::set<std::string> unrecognized;
std::string line;
while(inp.good() && !inp.eof())
{
getline(inp, line);
strcpy(buffer, line.c_str());
if (isComments(buffer)) //skip the comments line
continue;
if (buffer[0]=='*') //this is a keyword line
{
token = strtok(buffer," \n");
keywordSection = is_inp_keyw(token);
if (keywordSection==0)
unrecognized.insert(token);
cardNum = 0;
continue;
}
//a data line
tempop="";
char* found = NULL;
char path_buffer[100] = "Dyna3DWriter\\";
int pos = 0;
switch(keywordSection)
{
case 0: //not recognized
//end of last keyword, not recognizable word
break;
case 1: //KEYWORD
//"KEYWORD didn't do anything
break;
case 2: //TITLE
break;
case 3: //INCLUDE
token = strtok(buffer, "\n");
inp.clear();
parse_inp(token);
break;
...
}
}
if(inp.is_open())
{
inp.close();
inp.clear();
}
}
再帰ファイルは解析されません。私は多くのことを調べましたが、ほとんどの問題は、失敗ビットが設定されていること (これがinp.clear()
多くの呼び出しを行っている理由です)、または現在の作業ディレクトリについて間違った仮定を行っていることのいずれかであると思われました。
2 番目の理論をテストするために、以下を追加しました。
if(!inp.good() || !inp.is_open())
{
char path1[256];
getcwd(path1,256);
printf("CWD: %s\n", path1);
fflush(NULL);
printf("Unable to open '%s'\n", filename);
return 0;
}
また、作業ディレクトリとファイル名はどちらも正しいです。fopen(filename, "r")
--- の呼び出しを使用すると、同じ動作が見られperror("fopen")
ます。結果は次のようになります。
fopen: no such file or directory
EDIT:より多くのコードを記入