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

Dwa pytania a propos obsługi plików w C++

Object Storage Arubacloud
0 głosów
121 wizyt
pytanie zadane 30 stycznia w C i C++ przez Mick_SQ6IYV Obywatel (1,020 p.)

Witam wszystkich!

Mam dwa pytania dotyczące obsługi plików w C++ oraz 7 odcinku kursu pana Zelenta.

1) We wspomnianym odcinku, w tworzonych programach, plik jest otwierany albo do odczytu danych z pliku albo do zapisu w nim danych. Dokonujemy tego odpowiedni za pomocą argumentów ios::in lub ios::out. A jak zrobić, żeby w tym samym pliku dokonywać zarówno odczytu jak i zapisu? Wpisujemy oba argumenty czy może jakiś inny (trzeci)? A może zostawiamy to miejsce puste?

2) W tychże samych programach podajemy z góry ustaloną nazwę pliku. A gdyby chcieć, aby użytkownik sam podał swoją nazwę pliku, np.:

int main
{
	// jakaś część programu 

	Cout << „Podaj nazwę pliku:”;
	Cin >> nazwa_wlasna;
	
// jakaś część programu
	
	Plik.open(„nazwa_wlasna.txt”, ios::out); 
	
// jakaś część programu

}

Czy coś takiego można zrobić i jeśli tak, to jak?

Pozdrawiam!

2 odpowiedzi

+1 głos
odpowiedź 30 stycznia przez adrian17 Ekspert (344,860 p.)
edycja 30 stycznia przez adrian17

1 -> możesz przekazać in | out. Natomiast w praktyce to jest zazwyczaj niepotrzebne (podobnie jak wołanie open()), bo klasy mają same wszystko odpowiednio ustawione. No i inna sprawa, że takie otwieranie pliku jest raczej dość rzadkie.

int main() {
  ifstream f1("plik1.txt"); // in
  ofstream f2("plik2.txt"); // out
  fstream f3("plik3.txt"); // in | out

2 -> jasne, po prostu wczytaj nazwę pliku do stringa.

string filename;
cin >> filename;

 

komentarz 31 stycznia przez Oscar Nałogowiec (29,320 p.)
Tak jak pokazano - lepiej "kierunek" pliku określać używająć odpowiedniej klasy niż określająć tryb otwarcia. W pierwszym wypadku, gdy coś napiszemy źle dostaniemy błąd kompilacji a w tym drugim dopiero po uruchomieniu wystąpi błąd wykonania - a zawsze im błąd zostanie wykryty wcześniej, tym prościej go namierzyć i usunąć.
–1 głos
odpowiedź 30 stycznia przez Mick_SQ6IYV Obywatel (1,020 p.)

Spróbowałem z tą nazwą własną pliku użytkownika i nie wychodzi. Owszem, program wpisuje do pliku imię użytkownika tyle razy, ile ma lat; ale cały czas plik ma nazwę imie.txt; a nie na przykład Jan.txt, Zenon.txt, Anna.txt czy inaczej.

#include <iostream>
#include <fstream>

using namespace std;

string imie;
int wiek;

int main(int argc, char** argv)
{
	cout << "Podaj swoje imie: ";
	cin >> imie;
	cout << "Powiedz ile masz lat? ";
	cin >> wiek;
	fstream baza_danych;
	baza_danych.open("imie.txt", ios::out | ios::app);
	
	for (int i=1; i<=wiek; i++)
	{
		baza_danych << i << ". " << imie << endl;
	}
	baza_danych << endl << endl;
	baza_danych.close();
	cout << endl << endl << "Skonczylem prace!";
	return 0;
}

 

komentarz 30 stycznia przez j23 Mędrzec (194,920 p.)

ale cały czas plik ma nazwę imie.txt

A dlaczego miałby mieć inną nazwę, skoro w strumień dostaje "imie.txt"?

Tutaj dyskusje prowadzi się w komentarzach.

komentarz 30 stycznia przez Mick_SQ6IYV Obywatel (1,020 p.)

Dobra, to jak zrobić, żeby np. użytkownik wprowadzał swoje imię i do pliku, który ma nazwę od imienia użytkownika, były zapisywane konkretne dane?

 

Co do prowadzenia dyskusji - zagapiłem się. Dawno mnie tu nie było... frown

komentarz 31 stycznia przez j23 Mędrzec (194,920 p.)
std::fstream baza_danych(imie + ".txt", ios::out | ios::app);

 

komentarz 31 stycznia przez Mick_SQ6IYV Obywatel (1,020 p.)

@j23, 

Też o tym pomyślałem później, ale to nie działa. Kompilator ciągle wyrzuca błąd w stylu:

[Error] no matching function for call to 'std::basic_fstream<char>::open(std::basic_string<char>, std::_Ios_Openmode)'

wskazując jednocześnie, że to w tej linii jest problem; to znaczy tam, gdzie zostało użyta konkatenacja napisów.

1
komentarz 31 stycznia przez j23 Mędrzec (194,920 p.)

Używasz starego kompilatora lub nie ustawiłeś w opcjach projektu flagi kompilatora -std=c++14 (lub wyżej).

Od biedy możesz dać:

(imie + ".txt").c_str()

Choć lepiej przełączyć kompilator na współczesny C++ i nie tkwić w prehistorii.

Podobne pytania

0 głosów
1 odpowiedź 282 wizyt
pytanie zadane 28 lutego 2016 w C i C++ przez Pixel040 Gaduła (3,100 p.)
0 głosów
0 odpowiedzi 72 wizyt
pytanie zadane 31 lipca 2020 w C i C++ przez Nascisz Nowicjusz (160 p.)
0 głosów
2 odpowiedzi 130 wizyt
pytanie zadane 11 lipca 2018 w C i C++ przez Nowacx02 Obywatel (1,060 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,964 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!

...