递归下降解析器帮助(不读取文本文件字符串)

时间:2015-06-08 02:11:28

标签: c++

char input[100]; //Used to check grammar
char *s;

int main(int argc, char *argv[]) {

    ifstream fin("input.txt");  //Open input file
    while (fin>>input) {  //Store text in input[]
        s = input;  //Point c at the input text

        cout<<"String read from file:  "<<input<<endl;  //Show input text
        if (A() && *s == '\0') {  //Testing the grammar
            cout<<"The string \""<<input<<"\" is in the language."<<endl;
        }
        else cout<<"The string \""<<input<<"\" is not in the language."<<endl;
        cout<<endl;  //Formatting for output in console
    }
    fin.close();  //Close input file


    return 0;
}

有人可以告诉我这里我做错了什么。解析器不从文本文件中读取字符串。

2 个答案:

答案 0 :(得分:1)

让我们把这看作是两个问题。

问题1:阅读文件。

我已经删除了对阅读数据绝对不可或缺的所有内容。

char input[100]; //Used to check grammar

int main(int argc, char *argv[]) {

    ifstream fin("input.txt");  //Open input file
    while (fin>>input) {  //Store text in input[]
        cout<<"String read from file:  "<<input<<endl;  //Show input text
    }
    return 0;
}

这里没有什么不对,但你应该认真考虑用char input[100];替换std::string input;,以避免因大标记而头痛。例如,看看这里发生了什么:

int main()
{
    stringstream stream("1234567890"); // pack ten characters into stream
                                       // note: no whitespace.
    char snookums[] = "snookums";
    char array[5];
    cout << snookums << endl; // prove contents of snookums
    stream >> array; // read up to first whitespace from stream into array
    cout << array << endl;  // display what we read.  
    cout << snookums << endl; // oh dear. Now look at poor snookums!
    return 0;
}

输出:

snookums
1234567890
67890

尽管数组大小为5,但它包含全部10.或者它是吗?不。可悲的是,可怜的snookums被碾过了。这不会发生在字符串中。

我们知道所有fin>>input只是从空白文件中读取30000个字符,消灭了程序的其余内存,程序在打印出来之前就已经死了。

无论如何,您的代码留下了一些问题:

你真的能打开文件吗?你真的不知道。你从未检查过。

文件是空的吗?也不知道。你没告诉我们。这是人们在评论中所提出的事情之一。

这些都没有解决任何问题,但希望能让您更好地了解出了什么问题。

string input; // using string in case the data you're reading is incompatible 
              //with a 100 character char array. 

int main(int argc, char *argv[]) {

    ifstream fin("input.txt");  //Open input file
    if (fin.is_open()
    {
        while (fin>>input) 
        {  //Store text in input
            cout<<"String read from file:  "<<input<<endl;  //Show input text
        }
    }
    else
    {
        cout << "Failed to open file." << endl;
    }
    return 0;
}

一旦你知道你是否真正在阅读数据,如果没有,为什么不呢。

问题2:语言解析。

我们无法帮助您。没有提供任何信息,但有一些关于编码风格的说明,因为它们将帮助您提出未来的问题:

除了你,

A()对每个人都没有意义。给它一个描述性的名称,以便除了你之外的其他人有一些关于它的作用的提示。 A()不带参数。我认为这是因为它在input上运行。好的,但为什么不通过input?成本很低,它为读者提供了更多信息。请注意评论者如何立即归入A()?那是恐惧。善良的恐惧。我们没有[在此插入咒骂]线索它是什么或它做什么,所以它立即被仔细检查。

A(input)读给我的是#34; A做了一些事情要输入。&#34;我不知道它的作用,但它是input的。除非该程序的作者有做傻事的历史,否则它可能只对input有所帮助而且我不必担心这个函数差不多。

LanguageInterpreter()告诉我,语言翻译器已经运行。并不多,但如果我正在查看文件阅读代码中的错误,我不太可能在那里找到它。不幸的是,它还告诉我LanguageInterpreter正在全球数据的盛宴,Crom只知道它可能对程序的其余部分产生什么样的副作用。

LanguageInterpretter(input)告诉了我很多。一方面它告诉我,我可以继续我的一天,因为它与数据文件的读入无关,或者更好地与之无关。我先检查其他地方是否存在错误。

答案 1 :(得分:0)

string *s;

int main() 
{
	string input;
    ifstream fin("input.txt"); 
	
	if(fin.is_open())
	{  
		while(getline(fin,input))
		{
			s=&input;
			
			if (A() && *s == '\0') /* error: no match for 'operator==' in '* s == '\000''*/



			{  //Testing the grammar
				cout<<"The string \""<<*s<<"\" is in the language."<<endl;
			}
			else cout<<"The string \""<<*s<<"\" is not in the language."<<endl;
			cout<<endl;  
			
			
		}
	}
    fin.close();  
	
    
    return 0;
}