Консультация № 175597
25.12.2009, 03:46
0.00 руб.
0 5 0
Здравствуйте, уважаемые эксперты.

Как записать текст В файл, не меняя его содержимого?

У меня есть функция, которая записывает текст в файл, но она удаляет прежнее содержание. А надо, чтобы только вставляла текст. Подскажите, как переделать функцию?

Код:

void writetofile(fstream &file, int from, char* buf)
{
file.seekg(from);
int len=strlen(buf);
len++;
char str[len];
strcpy(str, buf);
file << endl << str << endl;
}


Код:

int main()
{ ...

File.open(filename, ios::in | ios::out);
char text[]="Some text";
writetofile(File, 160, text);
File.close();

...
}


Пробовал также с помощью file.write(), но результат один и тот же. Мне видится только один способ - тупо копировать содержимое файла в буфер (strcat) и потом записать в файл. Но ведь есть же другой способ?

Обсуждение

Неизвестный
25.12.2009, 09:45
общий
Вариантов много: можно скопировать файл во временный, записать в исходный то, что что нужно, затем дописать из временного оставшийся кусок, заодно получится резервная копия.
Можно наоборот, скопировать кусок до места вставки во временный файл, затем записать вставляемый фрагмент, затем скопировать остальное, затем переименовать временный файл, правда тогда потеряется inode number оригинального файла и соответственно отвалятся хардлинки ( по другим именам останется старое содержимое, так как был создано новый файл).
Можно переместить кусками данные на размер вставляемого блока (от конца к началу), получить таким образом "дырку" и в нее записать что нужно, если место на диске не позволяет сделать полную резервную копию, правда это будет довольно медленно, если файл большой и вставку нужно произвести в начале.
Неизвестный
25.12.2009, 10:19
общий
После открытия файла просто надо указатель сдвинуть в конец. В win32api это функция fseek. В MFC что-то тоже должно быть такое.
давно
Посетитель
7438
7205
25.12.2009, 10:27
общий
Сандров Алекс:
Вы не поняли, не в конец надо писать, а в середину, раздвинув старое содержимое...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
25.12.2009, 10:39
общий
А, да, тогда никак. Файл сам "автоматически" раздвигаться не будет. Придётся двигать указатель, потом вычитывать оставшийся кусок текста, потом всё вместе записывать обратно.
Кстати, подумал, может стоит глянуть какие-нибудь open-source проекты по notepad-ам? Там могут быть уже готовые решения.
давно
Профессор
230118
3054
25.12.2009, 10:56
общий
Иванов Андрей Владимирович:
File.open(filename, ios::in | ios::app);
Форма ответа