-1

我在用 c++ 构建的程序遇到了非常奇怪的问题,这里重要的是这个对象的构造函数(“扫描仪”)接收到一个带有一些文件名的向量,现在我想要做的是传递所有这些到另一个文件,然后从那里将它全部传递到一个字符串流以在其他地方解码,这一切都工作得很好,直到我试图用两个文件来做,突然最后一个文件得到了字符序列“\ 200 \ 001”附加到它一些奇怪的原因搞砸了我的整个程序,现在奇怪的是它只发生在某些文件上而不是其他文件上,坦率地说,我对正在发生的事情感到困惑。

以下是相关代码:

Scanner::Scanner(vector<string> files):
lineCount(1),
colCount(-1),
needToken(true),
lastToken(0),
lbl(false)
{
  ifstream ifile;
  ofstream ofile("temp.calc", ofstream::trunc);
  ofile.close();
  for(vector<string>::iterator it = files.begin(); it != files.end(); ++it){
    ofile.open("temp.calc", ofstream::binary | ofstream::app);
    ifile.open((*it).c_str(), ifstream::binary);
    if(ifile.is_open() && ofile.is_open()){
      ifile.seekg(0,ifile.end);
      long size = ifile.tellg();
      ifile.seekg(0);
      char * buffer = new char[size];
      ifile.read(buffer,size);
      ofile.write(buffer,size);
      delete[] buffer;
      ifile.close();
      ofile.close();
    }
  }
  ifile.open("temp.calc");
  ifile.seekg(0,ifile.end);
  long size = ifile.tellg();
  ifile.seekg(0);
  char * buffer = new char[size];
  ifile.read(buffer,size);
  inStream = new istringstream(buffer);
  ifile.close();
  delete[] buffer;
}

我真的非常困惑为什么会发生这种情况,而且并非总是如此,例如我可能会使用 expresion1.calc 和 expresion2.calc 并且它可以工作文件,或者我可能会自己使用 expresion3.calc 或 4 并且它有效,但如果我特别将这两者结合起来,一切都会搞砸。

以下是导致问题的文件包含的内容:expresion3.calc

a = 3 + 4;\n

表达式4.calc

b = 3 * 4;\n

这就是它们里面的全部内容,然而,当我用 gdb 检查缓冲区的内容时,在 \n 之后会有 \200\001。

我真的可以使用帮助家伙,非常感谢。

4

1 回答 1

0

std::istringstream将 astd::string作为输入。你正在传递它char*。因此创建了一个临时std::string对象,它期望char*以空值终止,而您的代码并未强制执行。我建议你显式创建一个std::string,这样你就可以将缓冲区传递size给它的构造函数:

inStream = new istringstream(string(buffer, size));

在旁注中,您正在关闭、重新打开和重新查找每次循环迭代的输出文件。您不需要这样做,这是浪费的开销。在循环运行的整个过程中保持文件打开,然后在完成后关闭它:

  ofstream ofile("temp.calc", ofstream::binary | ofstream::trunc);
  if (ofile.is_open()){
    for(vector<string>::iterator it = files.begin(); it != files.end(); ++it){
      ifile.open((*it).c_str(), ifstream::binary);
      if(ifile.is_open()){
        ...
        ofile.write(buffer,size);
        ...
      }
    }
  }
  ofile.close();
于 2014-11-21T03:47:34.050 回答