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;
}
有人可以告诉我这里我做错了什么。解析器不从文本文件中读取字符串。
答案 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;
}