Премини към съдържанието

Препоръчан отговор


Искам да попитам, как мога да записвам в средата на файл без да губя съдържанието след това.

Моят код:

#include <iostream>
#include <cstring>
#include <fstream>

using namespace std;

int main()
{
    char tmp[256];
    char tmp2[] = "AddedLine";
    fstream file("test.txt");
    while(!(file.eof()))
    {
        file >> tmp;
        if((strcmp(tmp,"test"))==0)
        {
            file << tmp2; 
        }
    }
    return 0;
}
text.txt:

red
blue
green
test
black
 

 

Редактирано от RandomGuy (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

току що, RandomGuy написа:

Искам да попитам, как мога да записвам в средата на файл без да губя съдържанието след това.

Файлът не е контейнер с произволен запис - примерно като масив. От гледна точка на fstream съдържанието му се чете и съхранява последователно и не може да набуташ нещо в средата. Трябва ти да си осигуриш начин да запазиш това съдържание - примерно изчиташ си го и го дозаписваш след твоята добавка.

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 6 минути, RandomGuy написа:

Искам да попитам, как мога да записвам в средата на файл без да губя съдържанието след това.

....

 

От това, което си спомням за стандартните функции можете да пишете отначалото или да добавите в края

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
току що, capnemo написа:

От това, което си спомням за стандартните функции можете да пишете отначалото или да добавите в края

И отначало не може. Тоест може да се пише в средата, но се изтрива старото - и със низове е неприятно, щото трябва да си бройкаш байтовете. Двоичен е по-добре.

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 2 минути, flare написа:

И отначало не може. Тоест може да се пише в средата, но се изтрива старото - и със низове е неприятно, щото трябва да си бройкаш байтовете. Двоичен е по-добре.

Имах предвид че отваряйки със "стандартни" флагове файла започваш да пишеш отначалото :) (поне на С беше нещо такова)


Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 1 минута, flare написа:

И отначало не може. Тоест може да се пише в средата, но се изтрива старото - и със низове е неприятно, щото трябва да си бройкаш байтовете. Двоичен е по-добре.

Не мога двоичен в условието ми трябва да е html файл.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 54 минути, capnemo написа:

От това, което си спомням за стандартните функции можете да пишете отначалото или да добавите в края

Двоичните файлове могат да се отварят с произволен достъп, но при запис преди края, този запис се осъществява върху следващите елементи, като ги заменя със себе си.

преди 49 минути, RandomGuy написа:

Не мога двоичен в условието ми трябва да е html файл.

Дали файла е двоичен зависи от това, като какъв го отваряш, а не от това, какво му е разширението. Хтмл файла като го отвориш като двоичен, можеш да го четеш и да записваш в него с произволен достъп.

преди 58 минути, capnemo написа:

Имах предвид че отваряйки със "стандартни" флагове файла започваш да пишеш отначалото :) (поне на С беше нещо такова)

Като го отваряш за писане в началото, файла се отваря дори и да не съществува, а ако съществува, се изтрива предварително съдържанието му.

Ако го отваряш с произволен достъп за четене и писане има два варианта (като изключим варианта добавяне в края)

При единия вариант, файла трябва да съществува и не се изтрива автоматично при отваряне. При другия вариант, файлът не е задължително да съществува, но при отваряне задължително се изтрива

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 1 час, RandomGuy написа:

Не мога двоичен в условието ми трябва да е html файл.

Аз не говорих за твоя случай а общо, за достъп в средата на файла. За текстов ти казах, как се прави.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 2 минути, flare написа:

Аз не говорих за твоя случай а общо, за достъп в средата на файла. За текстов ти казах, как се прави.

И хтмл и текстов, като се отворят като двоични, може да се чете и да се записва на произволни места.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
току що, Реджеп Иведик написа:

И хтмл и текстов, като се отворят като двоични, може да се чете и да се записва на произволни места.

И това е пълна простотия в общия случай. Особено в днешно време, където кодировки с променлив брой байтове за символ са стандарт...

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
току що, Реджеп Иведик написа:

Само няма инсърт, всичко е оувър райт

Еми точно това казвам че няма да работи в общия случай - обикновено се иска подмяна с различен по дължина текст. Пък и да не е. Ако искаш в UTF8 да подмениш нула с българско "а" 'сичко отива на кино.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

За да промениш текстов файл, правиш нов с някакво временно име. Четеш стария и записваш в новия като променяш това което трябва да смениш. След като прочетеш и запишеш целия файл, изтриваш старият файл и преименуваш новия с името с първоначалното име.

За да работят двоичните файлове правилно, трябва всеки запис да е с еднаква дължина. На практика всеки запис е елемент на масив, само че във файл а не в паметта. Днешно време повече се използват някакви методи за сериализация и те обикновено не са с фиксирана дължина на записа.

Редактирано от plamenbm86 (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 9 минути, plamenbm86 написа:

За да промениш текстов файл, правиш нов с някакво временно име. Четеш стария и записваш в новия като променяш това което трябва да смениш. След като прочетеш и запишеш целия файл, изтриваш старият файл и преименуваш новия с името с първоначалното име.

това не е сигурно, че ще работи при всички права.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Това е вариант с пестене на памет. Приемаме, че имаш пълни права над директорията където е файла.  Другият вариант е да се прочете целия файл в паметта и просто да се презапише изцяло.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход


×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.