使用C ++ get(char& c)读取文件时的行尾字符是什么?

时间:2010-07-21 01:32:39

标签: c++ file

我的问题是我正在尝试为ascii文本文件编写一个非常基本的词法分析器。到目前为止,它正确地读取和比较我的令牌列表,但是我无法在没有空格或按回车的情况下抓取最终令牌。在将字符串与我的令牌列表进行比较之前,我尝试使用分隔符^ Z ASCII 26作为另一个选择。这无效。我还尝试将f-> eof()检查移动到比较位置下方以查看它是否会阻止它然后检查eof标志。我没有运气。有谁可能开导我?下面的代码用于读取方法。 m_TokenList只是一个string类型的向量。

void CelestialAnalyzer::ReadInTokens(ifstream *f){
 vector<string> statement;
 vector<string> tokens;
 string token;
 char c;
 do{
 f->get(c);   // Read in each character
if(f->eof())
 break;

if(c == '\n' || c == ' ' || c == '^Z' || c == '\r'){ // 26 ASCII ^Z (end of file marker)
 for(unsigned int i=0; i<m_TokenList.size(); i++){
  if(!token.compare(m_TokenList[i])){
  tokens.push_back(token);
  token.clear();
 }
}
} else {
 token.push_back(c); // Add it to the token array
}
} while (true);





f->close();

for(unsigned int i=0; i<tokens.size(); i++){
cout << "Found Token: " << tokens[i].c_str() << endl;
}

}

m_TokenList初始化为

CelestialAnalyzer::CelestialAnalyzer(){
m_TokenList.push_back("KEY");  // Prints data
m_TokenList.push_back("GETINPUT"); // Grabs user data
m_TokenList.push_back("+");   // Addition/Concation
m_TokenList.push_back("-");   // Subtraction
m_TokenList.push_back("==");  // Equator
m_TokenList.push_back("=");   // Assignment
m_TokenList.push_back(";");   // End statement
m_TokenList.push_back(" ");   // Blank
m_TokenList.push_back("{");   // Open Grouping
m_TokenList.push_back("}");   // Close Grouping
m_TokenList.push_back("(");   // Parameter opening
m_TokenList.push_back(")");   // Parameter closing
for(unsigned int i=48; i<=57; i++){
 string s; s.push_back((char)i);
 m_TokenList.push_back(s); s.clear();
}
}

用于阅读的测试文件就是这个简单的例子。     1 + 2 = KEY

除非后面有空格或换行符,否则它将注册除“KEY”以外的所有内容。

2 个答案:

答案 0 :(得分:2)

你为什么不删除:

if(f->eof()) break;

并使用

if(f->eof() || c == '\n' || c == ' ' || c == '^Z' || c == '\r'){

然后打破?这样,当您点击EOF时,您将添加剩余的任何令牌。

或者,您可以在中断循环后检查令牌是否为非空,并在这种情况下添加它。

答案 1 :(得分:0)

双重'新线'怎么样?据我所知,在几个信使协议中,\ n \ n \ n \ r \ n与消息的结尾有关。我觉得这很合理。 :)