У меня есть внутренний файл, который может быть добавлен только после добавления каждого добавочного символа \n
. Но теоретически возможно, что добавление к файлу не выполняется, и оно становится поврежденным. Вот почему каждый раз при открытии файла я хочу найти его последнюю действительную, после последней EOL, позицию. Этот код будет делать:Как удалить содержимое файла после последнего EOL?
// Not using ios::app instead of ios::ate | ios::out because it will
// put print pointer to the EOF every time before writing.
fstream file(name.c_str(), ios::binary | ios::ate | ios::out | ios::in);
if(!file.is_open()) {
cerr << "Error in oppening file " << name << endl;
exit(EXIT_FAILURE);
} else {
while(0 != file.tellp()) //if file is not empty
{
file.seekg(-1, ios_base::cur);
if(0 == file.tellg() || file.get() == '\n') {
break;
}
file.seekg(-1, ios_base::cur);
}
file.seekp(of.tellg());
}
//{1}
//Use file for appending to...
Но это не будет работать хорошо, если длина части, которая должна быть добавлена в файл ниже, чем длина части, начиная с последнего символа EOL в файле. Поэтому в позиции {1}
я хочу удалить содержимое файла, начиная с file.tellp() до конца.
Как я могу это сделать?
'ftruncate' - это только Unix. И он не принимает поток или 'ФАЙЛ * 'как аргумент. –
Это не идеал (как я уже сказал, я не знаю ни одного C++). Я не понимал, что это только команда POSIX. В Windows, похоже, вам нужно использовать '_chsize_s' для достижения того же. –
Под Windows соответствующей функцией будет 'SetEndOfFile'. Оба требуют, чтобы дескриптор системы работал (а не 'filebuf', а не' FILE * ', поэтому ни C++, ни C). –