当尝试读取C++中的文件时,我的文件会附加一个奇怪的字符序列
When trying to read a file in C++ my file gets appended a weird character sequence
我在用 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::istringstream
将std::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();
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 挂起和取消挂起一个文件DLL
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- C++试图读取一个文件并输出到另一个文本文件
- 如何从另一个文件继承私有成员变量和公共函数
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 如何打开并写入一个名称取自C++中字符串的文件
- 构建一个由C和C++文件组成的库
- c++多进程编写一个唯一的文件
- 如何使用CLion在Mac上创建一个新的.txt文件
- 如何将class.cpp和class.hpp编译为一个.o文件
- 写入文件会产生一个空文件或根本没有文件
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 生成一个生成文件,该生成文件使用Automake在一个步骤中编译和链接所有源文件
- 为什么我的 heap.h 文件给我一个LNK2001错误?
- Pantheios 不使用 MFC 应用程序写入一个文件(一个 exe + 两个 DLL)
- 在C++中一次读取一个文件一个int
- 输入/输出文件(一个字母的大写)
- 如何使用两个预编译的头文件.一个用于托管代码,另一个用于非托管代码.xxx.PCH不是一个有效的预编译头文件