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.
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 :/
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
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)
hugo [ v4 ]
ej zaglądnijcie przy okazji do tego wątku:
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... :/
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...)
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]
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.
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.
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]
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??
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 :)
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.