GRY-Online.pl --> Archiwum Forum

C++ - operacje na pliku

06.06.2004
19:43
smile
[1]

Cainoor [ Mów mi wuju ]

C++ - operacje na pliku

Witam. Mam problem takiej natury. Posiadam plik tekstowy. Chce go otworzyc i dopisać coś, nadpisując ostatni znak.

Przykład:
"to jest plik tekstowy
a to jest ten znak"

a po operacji:
"to jest plik tekstowy
a to jest ten znadopisałem coś"

uzywam ofstream i probowalem kombinowac z otwieraniem ios:out plus takie dodatki jak ios:ate, lub ios:app i przesuwac funkcja plik.seekp(-1), ale nie nie działa.

Proszę o rade.

06.06.2004
20:05
[2]

vien [ łowca pip ]

ale chcesz dopisać czy zastąpić coś?

to ja skozystam z watku
musze zrobic programik liczacy kwadrat danej liczy
myslicie ze to bedzie dzialac?

/* program do liczenia kwadratu */
include<stdio.h>

main ()


int lp, kw;

printf("liczba z ktorej chcesz otrzymać kwadrat i sześcian to:/t");

scanf("%d", &lp);

kw=lp*lp;

printf("kwadrat liczby:","lp");

printf("wynosi","kw");

return 0;



wiem ze to banal jest ale nie mam kompilatora zeby sprawdzic :/

06.06.2004
20:08
smile
[3]

aka [ Chor��y ]

Cainoor -> sprobuj tak plik.seekp(-1, ios::end);

Vein -> printf("kwadrat liczby:","lp");

printf("wynosi","kw");

te instrukcje radzilbym zmienic na : printf(("kwadrat liczby: %d wynosi %d",lp,kw);

pozdro
aka

06.06.2004
22:03
[4]

legrooch [ Legend ]

Cainoor ==> napewno w dobrym momencie nadpisujesz?
Możę plik jest chroniony jeszcze (otwarty). Pamiętaj, że otwierając plik dziedziczy on taki stan. Następnie dochodzi do nadpisania i zapisania pliku. Ta druga część to tak jakby drugi osobny plik, który chcesz zapisać na pierwszym(nadal otwartym)

06.06.2004
22:04
[5]

hugo [ v4 ]

ej zaglądnijcie przy okazji do tego wątku:

07.06.2004
00:47
[6]

Cainoor [ Mów mi wuju ]

aka ---> Właśnie mam taki problem, że mi ta operacja seekp() w ogóle nie działa :/

Fragment kodu jest następujący:

ofstream plik(NazwaPliku.c_str(), ios::out | ios::app );
if(!plik)

ShowMessage("Nie mozna pisac do pliku");
return;
›//plik prawidlowo otwarty
plik.seekp(-1);

po czyms takim wywoluje funkcje innej klasy. Zapisuje mi na koncu pliku, ale nie cofa wskaznika o jedna pozycje, a tym samym nie nadpisuje ostatniego znaku.

gdy robie tak:

ofstream plik(NazwaPliku.c_str(), ios::out);
if(!plik)

ShowMessage("Nie mozna pisac do pliku");
return;
›//plik prawidlowo otwarty
plik.seekp(-1, ios::end);

to mam nowy plik tylko ze wstawionym fragmentem.

legrooch ---> Troche jasniej :)

Chce otworzyc plik, ustawic kursor i wykonać operacje zapisania do pliku. Niby takie proste, ale... :/

07.06.2004
08:40
[7]

legrooch [ Legend ]

1. otwórz plik
2. wczytaj tekst
3. zamknij plik
4. edytuj wczytany
5. stwórz taki sam plik, dołóż tekst i zapisz go. (słabo będzie działać dla dużej ilości znaków...)

07.06.2004
09:33
[8]

Cainoor [ Mów mi wuju ]

legrooch ---> Jak zamknę plik to tym samym zamykam strumien, który będę edytował. Nie moge potem zmieniać jego zawartości, bo po zamknięciu następuje przepisanie z bufora fizycznie do pliku tego co w nim jest i jego wyczyszczenie.

Problem jest takiej natury, że nie mogę otworzyć pliku tak, aby dodał coś w połowie. Mogę albo stworzyć nowy, albo dopisać na końcu (a jak używam ios::app to wskaźnik zawsze pokazuje koniec pliku przy zapisie i nawet jak cofne, to potem i tak zapisuje jakbym nie cofal wskaznika w ogole).

Jak robilem to ios:ate to zamiast dopisywać na końcu tworzył plik od poczatku. Mam Buildera 6.0.

Wypowiedź została zmodyfikowana przez jej autora [2004-06-07 09:34:29]

07.06.2004
10:46
[9]

legrooch [ Legend ]

Widzisz, Visual C++ trochę się różni, ale nie w koncepcji myślenia. A nie możesz tego zrobić na jakimś tymczasowym pliku? szybkie stwórz, kopiuj treść, edytuj, zapisz jako oryginał?
Ewentualnie jakaś inna funkcja musi być mniej problematyczna. Polataj po newsgrupach i forum Borlanda. Może to Ci pomoże.

07.06.2004
11:37
smile
[10]

aka [ Chor��y ]

Cainoor --> tak dziala:

ofstream plik("text.txt", ios::out | ios::ate );
plik.seekp(-1, ios::end);
plik<<"abc";
plik.close();

doszedlem do wniosku, ze jak dasz tryb ios::app to wtedy nie dziala seekp bo zaklada ze dopisujesz po kolei na koncu bez skakania po pliku.

pozdro.

07.06.2004
19:51
smile
[11]

Cainoor [ Mów mi wuju ]

legrooch ---> Właśnie będę musiał użyć temporary file, a nie miałem na to ochoty :/

aka ---> Widzisz, to nie takie proste :) Jak napisałem w poprzednim moim poście: gdy otiweram plik:

ofstream plik("text.txt", ios::out | ios::ate );

to on zamiast mi ustawic wskaznik na koncu po prostu, od nowa tworzy plik o tej samej nazwie! Tak jakbym uzywal ios::trunc, a tego nie robie :/

[edit]
moze z tym ate nie napisalem, ale jest tak jak mowie.

app dziala jak powinna, ale ate nie :/

Wypowiedź została zmodyfikowana przez jej autora [2004-06-07 19:52:05]

07.06.2004
20:02
[12]

Cainoor [ Mów mi wuju ]

wpadlem na taki pomysl, ze moze przed otwarciem musze zresetowac wszystkie flagi (ate, app itp), ktos pamieta jaka funckja to robi??

07.06.2004
20:17
[13]

aka [ Chor��y ]

Taki program:

#include <fstream.h>

int main(int argc, char* argv[])

ofstream plik("text.txt", ios::out | ios::ate );
plik.seekp(-1, ios::end);
plik<<"abc";
plik.close();
return 0;


Kompilowalem pod visual c++ 6.
Plik text.txt istnieje przed uruchomieniem a po jest zmodyfikowany wlasnie tak jak chcesz, zatem moze cos innego robisz nie tak.

powodzenia :)

07.06.2004
20:20
smile
[14]

Cainoor [ Mów mi wuju ]

kurde, dokladnie tak samo robie u mnie i nie chce ta cholera dzialac.

wydaje mi sie, ze nawet w tym seekp juz nie musisz dawac ios:end ale to jest bez znaczenia.

Dzieki za rady, bede kombinowal dalej.

© 2000-2024 GRY-OnLine S.A.