text — при попытке прочитать файл в C ++ к моему файлу добавляется странная последовательность символов

У меня действительно странная проблема с программой, которую я создаю на 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

expresion4.calc

b = 3 * 4;\n

Это все, что у них внутри, и все же, когда я проверяю содержимое буфера с помощью gdb, после \ n будет \ 200 \ 001.

Я мог бы действительно использовать помощь, ребята, большое спасибо.

-1

Решение

std::istringstream занимает std::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();
0

Другие решения


По вопросам рекламы [email protected]