Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Elo.
Chce zrobić tak aby mieć w zmiennej nazwe pliku jaką ma program tworzyć lecz nie mogę do tego dojść
string filename = "ala"; ofstream file; file.open(filename); file <<"test"<< endl; file.close();
Jakieś pomysły?
Offline
To jest cały twój program? Jaki to język? Widać, że zdefiniowałeś zmienną filename z nazwą pliku, czyli to o co pytasz. Może powiesz do czego chcesz dojść. Polecam najpierw przeczytać http://rtfm.killfile.pl/ . Bo ten post to jakaś masakra.
Offline
Jak dobrze widzę C++? No to co za problem? Robisz np tak:
#include <iostream> #include <string> #include <fstream> void zapiszPlik(std::string fileName) { std::ofstream file; file.open(fileName.c_str()); file <<"test"<< std::endl; file.close(); } int main() { std::string fileName; std::cout << "Podaj nazwe pliku" << "\n"; std::cin >> fileName; zapiszPlik(fileName); return 0; }
Offline
Huk napisał(-a):
Jak dobrze widzę C++? No to co za problem? Robisz np tak:
Kod:
#include <iostream> #include <string> #include <fstream> void zapiszPlik(std::string fileName) { std::ofstream file; file.open(fileName.c_str()); file <<"test"<< std::endl; file.close(); } int main() { std::string fileName; std::cout << "Podaj nazwe pliku" << "\n"; std::cin >> fileName; zapiszPlik(fileName); return 0; }
Wielkie thx.
Dlaczego nie mogę zrobić tak samo z liczbą tzn zamiast string fileName dać int liczba ?
dostaje podczas kompilacji
: error: request for member ‘c_str’ in ‘name’, which is of non-class type ‘int’
pozdro
Offline
Ehh nie żebym się czepiał czy coś - ale fakt że takie pytania zadajesz, oznacza że nie do końca rozumiesz podstawy języka - do nauki BARDZO polecam książkę "Symfonia C++", Grębosza (wersja dla C99 do znalezienia w formie pdf, gdzieś na necie) tam masz wyjaśnione wszystko step-by-step, do tego normalnym językiem ;]
Co do pytania - nie możesz dać int, float czy double - ponieważ funkcja open() wygląda tak jak to opisano tutaj:
http://www.cplusplus.com/reference/iostream/ofstream/open/
void open ( const char * filename, ios_base::openmode mode = ios_base::out );
Jak widać jako argument przyjmuje "const char *" a Ty chcesz mu tam dać int, występuje niezgodność typów, stąd kompilator ładnie wypluwa error, przy stringu się nie pluje ponieważ funkcja c_str() konwertuje nam std::string na "char *".
Edit:
Jeszcze trzeba dodać że funkcja c_str() jest tylko dostępna dla std::string, a nie dla int czy double (a przydała by się czasami) stąd dokładny błąd który otrzymujesz - ale tak czy siak, nie możesz użyć czystego int, float czy double dla funkcji open();
Ostatnio edytowany przez Huk (2010-10-23 15:45:18)
Offline
No a moge dodac np do nazwy pliku liczbe ?
Offline
Jeżeli skompilujesz kod który wcześniej podałem to możesz podać nazwę w stylu: "plik1.txt" czy "plik123972931973.txt" czy jaką tam chcesz i oczywiście zadziała.
Jeżeli chcesz połączyć nawę pliku wraz z jakąś liczbą wewnątrz programu to jest z tym więcej zachodu. "Czysty" std::string chyba nie daje żadnej możliwości dodania cyferki, ale można to zrobić np tak:
#include <iostream> #include <string> #include <fstream> #include <sstream> void zapiszPlik(std::string fileName) { std::ofstream file; file.open(fileName.c_str()); file <<"test"<< std::endl; file.close(); } int main() { std::string fileName; int x=10.0f; std::cout << "Podaj nazwe pliku" << "\n"; std::cin >> fileName; std::stringstream ss; ss << x; fileName+=ss.str(); zapiszPlik(fileName); return 0; }
Ostatnio edytowany przez Huk (2010-10-24 08:46:37)
Offline
#include <iostream> #include <string> #include <fstream> #include <sstream> void zapiszPlik(std::string fileName) { std::ofstream file; file.open(fileName.c_str()); file <<"@echo ON"<< std::endl; file <<nazwa;//tu wywala błąd file.close(); } int main() { std::string fileName="shut"; std::string nazwa ; int x,z,y,t; std::string e= ".txt"; std::string kroa= "."; //std::cout << "Podaj nazwe pliku" << "\n"; //std::cin >> fileName; for (x=1;x<=10;x++) { for (z=1;z<=3;z++) { for (y=1;y<=3;y++) { for (t=1;t<=3;t++) { std::string sIPa; std::string sIPb; std::string sIPc; std::string sIPd; std::ostringstream a; std::ostringstream b; std::ostringstream c; std::ostringstream d; a << x; sIPa = a.str(); b << z; sIPb = b.str(); c << y; sIPc = c.str(); d << t; sIPd = d.str(); nazwa = sIPa + kroa + sIPb + kroa + sIPc + kroa + sIPd; fileName+=nazwa; fileName+=e; zapiszPlik(fileName); fileName="shut"; } } } } return 0; }
chodzi tutaj o to by zmienna(nazwa) była zapisywana do pliku niestety jest z nią problem, może wiecie jak to rozwiązać
Ostatnio edytowany przez kondi06 (2011-02-05 16:19:39)
Offline
kamikaze napisał(-a):
http://www.google.pl/search?q=c%2B%2B+zapis+do+pliku
szukałem w ten sposób i nic mi to nie dało bo według tego wszystko powinno działać
Offline
No dobra, fakt tam nie znajdziesz rozwiązania swojego problemu. Powinieneś raczej wpisać C++ postawy lub programowanie podstawy.
void zapiszPlik(std::string fileName) { std::ofstream file; file.open(fileName.c_str()); file <<"@echo ON"<< std::endl; file <<nazwa;//tu wywala błąd file.close(); }
Tu masz problem, wywala błąd. Powinieneś go przeczytać, jeśli go nie rozumiesz wkleić. No ale bez tego widać co jest źle. Funkcja zapiszPlik nic nie wie o zmiennej nazwa. Zmienna nazwa jest zdefiniowana w funkcji main. Jeśli chcesz jej użyć w tej funkcji musisz ją przekazać w argumencie lub zdefiniować ją jako globalną na początku po dyrektywach #include .
Offline
#include <iostream> #include <string> #include <fstream> #include <sstream> void zapiszPlik(std::string fileName) { //std::ofstream file; //file.open(fileName.c_str()); //file <<"@echo ON"<< std::endl; //file <<nazwa; // file.close(); } int main() { std::string fileName="shut"; std::string nazwa ; int x,z,y,t; std::string e= ".txt"; std::string kroa= "."; //std::cout << "Podaj nazwe pliku" << "\n"; //std::cin >> fileName; for (x=1;x<=2;x++) { for (z=1;z<=2;z++) { for (y=1;y<=2;y++) { for (t=1;t<=2;t++) { std::string sIPa; std::string sIPb; std::string sIPc; std::string sIPd; std::ostringstream a; std::ostringstream b; std::ostringstream c; std::ostringstream d; a << x; sIPa = a.str(); b << z; sIPb = b.str(); c << y; sIPc = c.str(); d << t; sIPd = d.str(); nazwa = sIPa + kroa + sIPb + kroa + sIPc + kroa + sIPd; fileName+=nazwa; fileName+=e; // zapiszPlik(fileName); std::ofstream file; file.open(fileName.c_str()); file <<"@echo ON"<< std::endl; file <<nazwa <<std::endl; file >> wbc; file.close(); fileName="shut"; } } } } return 0; }
poprawiłem działa lecz zmienna(nazwa) nie jest wpisywana do pliku, co może być źle
Ostatnio edytowany przez kondi06 (2011-02-05 17:24:27)
Offline
Poprawiaj dalej, to się nawet nie kompiluje.
Offline
http://pl.wikibooks.org/wiki/C++
większość kodu jest zupełnie nie potrzebna
rady:
-czytaj komunikaty błędów
-używaj 'using namespace std;' -- nie bedziesz musiał za każdym razem pisać std::
Offline
#include <iostream> #include <string> #include <fstream> #include <sstream> void zapiszPlik(std::string fileName) { //std::ofstream file; //file.open(fileName.c_str()); //file <<"@echo ON"<< std::endl; //file <<nazwa; // file.close(); } int main() { std::string fileName="shut"; std::string nazwa ; std::string wbc ; int x,z,y,t; std::string e= ".txt"; std::string kroa= "."; //std::cout << "Podaj nazwe pliku" << "\n"; //std::cin >> fileName; for (x=1;x<=2;x++) { for (z=1;z<=2;z++) { for (y=1;y<=2;y++) { for (t=1;t<=2;t++) { std::string sIPa; std::string sIPb; std::string sIPc; std::string sIPd; std::ostringstream a; std::ostringstream b; std::ostringstream c; std::ostringstream d; a << x; sIPa = a.str(); b << z; sIPb = b.str(); c << y; sIPc = c.str(); d << t; sIPd = d.str(); nazwa = sIPa + kroa + sIPb + kroa + sIPc + kroa + sIPd; fileName+=nazwa; fileName+=e; // zapiszPlik(fileName); std::ofstream file; file.open(fileName.c_str()); file <<"@echo ON"<< std::endl; file << nazwa <<std::endl;// tu jest strumień danych który nie działa file.close(); fileName="shut"; } } } } return 0; }
mnie to kompiluje tylko zmienna(nazwa) nie jest dostarczona do pliku..
a co do "using namespace std" to nie za bardzo wiem jak tego użyć..jeżeli już potrzebuje wdrążyć zmienną do pliku ...
Ostatnio edytowany przez kondi06 (2011-02-05 20:10:40)
Offline
Co do nazwy będącej liczbą to polecam:
#include <iostream> #include <string> #include <fstream> #include <stdio.h> void zapiszPlik(const char* fileName) { std::ofstream file; file.open(fileName); file <<"test"<< std::endl; file.close(); } int main() { int intin; std::cout << "Podaj nazwe pliku" << "\n"; std::cin >> intin; char buf[100]; sprintf(buf, "%d", intin); zapiszPlik(buf); return 0; }
Ciut prostsze niż Huk'a ;)
Offline
nie chodzi o nazwę tylko o zapisywanie zmiennej nazwa do pliku..strumień nie działa,i tyle
Offline
No teraz tak bo dałeś nową wersję, poprzednia się nie kompiluje. Na podstawie czego wnioskujesz że zmienna nazwa nie jest zapisywana? U mnie to odpalam i się zapisuje.
Offline
możesz dać screena , ja to odpalam i po otwarciu pliku w którym powinno być napisane:
@echo on
x.z.y.t
jest tylko:
@echo on
zmienna nazwa jest to składanka stringów i liczb fora prze konwertowanych na string..
tak dla jasności x,z,y,t są to dowolne liczby i w każdym pliku są inne..
Ostatnio edytowany przez kondi06 (2011-02-05 20:23:29)
Offline
Ja mam w plikach:
@echo ON
1.1.1.1
@echo ON
1.1.1.2
itd.
Offline
g++ (GCC) 4.1.2
Ostatnio edytowany przez kamikaze (2011-02-05 20:31:32)
Offline
ja przed chwilą zainstalowałem c++bulider i działa poprawnie a w dev c++ ,niestety nie...no cóż myślałem że to ja popełniam błąd..dzięki za pomoc
Offline
Nie wiem czy to znacie ale w linuxie można się pobawić strumieniami z bash'a wiec odpala sie tak:
cat in.txt |./a.out > out.txt
Wygodne i przyjemne a w *.cpp pisze się normalnie cout i cin.
Polecam :)
Ostatnio edytowany przez P@blo (2011-02-06 21:36:06)
Offline