• 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++

Object Storage Arubacloud
0 głosów
515 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 (253,340 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,860 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,913 wizyt
pytanie zadane 18 października 2018 w Java przez Virius Początkujący (490 p.)
0 głosów
1 odpowiedź 140 wizyt
0 głosów
2 odpowiedzi 362 wizyt
pytanie zadane 22 lipca 2015 w PHP przez DL TD Nałogowiec (36,710 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...