当尝试读取C++中的文件时,我的文件会附加一个奇怪的字符序列

When trying to read a file in C++ my file gets appended a weird character sequence

本文关键字:文件 一个 字符 C++ 读取 我的      更新时间:2023-10-16

我在用 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 自己并且它有效,但如果我将这两者结合起来,一切都会搞砸。

以下是导致问题的文件包含的内容:扩展3.计算

a = 3 + 4;n

扩展4.计算

b = 3 * 4;n

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

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

std::istringstreamstd::string作为输入。 你传递它一个char*。 因此,将创建一个临时std::string,它期望char*以 null 终止,而您的代码不会强制执行该 null。 我建议您显式创建一个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();