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

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


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

    Моят код:

    #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 написа:

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

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

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


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

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

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


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

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

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

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

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

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

    Вход

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

    Вход


    ×

    Информация

    Този сайт използва бисквитки (cookies), за най-доброто потребителско изживяване. С използването му, вие приемате нашите Условия за ползване.