• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak dopisać tekst wewnątrz pliku txt w C++

VPS Starter Arubacloud
0 głosów
485 wizyt
pytanie zadane 23 czerwca 2022 w C i C++ przez onest Początkujący (250 p.)
edycja 23 czerwca 2022 przez onest
Dzień dobry.

Powszechnie wiadomo jak prosto nadpisać plik. Wystarczy do tego bowiem komenda: file.open("przykladowy.txt",ios::app);

Tekst ten jednak doda się na końcu pliku. Załóżmy, że wewnątrz naszego pliku txt widnieje napis "Ala ma kota".

Kiedy dodam cokolwiek za pomocą: file << jakis_string; to wnętrze pliku zmieni się na "Ala ma kota jakis_string".

Czy istnieje *prosty* sposób abym napisał coś wewnątrz pliku np. "Ala ma jakis_string kota"? W dodatku w miarę optymalny. Wiem, że można po prostu zapisać całą zawartość pliku w jakiejś zmiennej i napisać już zmienionego stringa, jednak załóżmy że nasz plik txt ma kilka tysięcy linijek. To byłoby okropne zapisywać tak duży tekst -_-
 Zresztą sądze, iż są na to lepsze metody.

2 odpowiedzi

+2 głosów
odpowiedź 24 czerwca 2022 przez onest Początkujący (250 p.)

Znalazłem odpowiedź na moje pytanie.
Wnętrze pliku txt: [01234]
// te klamry nie są wewnątrz pliku jak coś
 

#include <iostream>
#include <fstream> 
using namespace std;

int main()
{
    fstream file("text2.txt");
          //Tellp nie jest konieczny, sluzy tylko do zobrazowania
          cout << "Tellp: " << file.tellp() << endl; // Wskaznik na samym poczatku
        file.seekp(2); // Przesuwa  wskaznik
          cout << "Tellp: " << file.tellp() << endl; // Wskaznik po przesunieciu
        file << "y";
    file.close();
}

Wynik: w pliku jest teraz: [01y34]
Mooożna też ustawić wskaznik na koniec i przesunąć go od konca. Czyli jeśli w naszym pliku istnieje [01234], to:
 

#include <iostream>
#include <fstream> 
using namespace std;

int main()
{
    fstream file("text2.txt");
        file.seekp(-2,ios_base::end);
        file << "y";
    file.close();
}

Teraz będzie wyglądał tak: [012y4.]

[-2] czyli ta liczba na początku oznacza, o ile ma być przesunięty wskaźnik od końca. Gdybyśmy dali na plusie to wiadomo, że poszedłby do przodu.

Oczywiście te funkcje mają pewną wadę, mianowicie zastępują wskazaną liczbę zamiast upchać naszą zawartość, ale dla mnie to nie problem. Powiem nawet że właśnie chciałem przy okazji usunąć zawartość w środku i zamienić ją inną, tak więc dla mnie funkcja wymarzona. Dwie pieczenie na jednym ogniu.

 

1
komentarz 25 czerwca 2022 przez VBService Ekspert (251,210 p.)

Możesz też np. tak

[ on-line ]

#include <iostream>
#include <fstream>
#include <sstream>

using namespace std;

int main()
{
    ifstream file_in("data.json"); 

    stringstream buffer;
    buffer << file_in.rdbuf();
    string contents = buffer.str();

    file_in.close();
    
    contents.pop_back();
    contents.pop_back();
    
    cout << contents << endl;
    contents += ",'lorem4.4'}}";
    cout << contents;
    
    // możesz nadpisać ofstream file_out("data.json");
    ofstream file_out("data_new.json"); // dla demonstracji inna nazwa
    file_out << contents;
    file_out.close();

    return 0;
}

 

przykładowy:  data.json

{{'lorem1.1','lorem1.2'},{'lorem 2.1','lorem2.2', lorem2.3'},{'lorem3.1','lorem3.2'},{'lorem4.1','lorem4.2','lorem4.3'}}

 

0 głosów
odpowiedź 23 czerwca 2022 przez tangarr Mędrzec (154,780 p.)
Niestety nie da się dopisać danych w środku pliku. Jedyne co możesz zrobić to zmienić dane na inne.
Zamiast tego możesz stworzyć nowy plik. Zapisać do niego początek oryginalnego pliku, potem nowy tekst a na koniec resztę z oryginalnego pliku.
Dla optymalizacji dane z pliku możesz wczytywać linia po linii lub przy użyciu bufora o stałym rozmiarze.

Podobne pytania

0 głosów
3 odpowiedzi 1,897 wizyt
pytanie zadane 18 października 2018 w Java przez Virius Początkujący (490 p.)
0 głosów
1 odpowiedź 136 wizyt
0 głosów
2 odpowiedzi 347 wizyt
pytanie zadane 22 lipca 2015 w PHP przez DL TD Nałogowiec (36,710 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...