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

Cloud VPS
0 głosów
389 wizyt
pytanie zadane 30 stycznia 2024 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 2024 przez adrian17 Mentor (354,720 p.)
edycja 30 stycznia 2024 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 2024 przez Oscar Nałogowiec (29,360 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 2024 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 2024 przez j23 Mędrzec (195,240 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 2024 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 2024 przez j23 Mędrzec (195,240 p.)
std::fstream baza_danych(imie + ".txt", ios::out | ios::app);

 

komentarz 31 stycznia 2024 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 2024 przez j23 Mędrzec (195,240 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ź 393 wizyt
pytanie zadane 28 lutego 2016 w C i C++ przez Pixel040 Gaduła (3,100 p.)
0 głosów
0 odpowiedzi 119 wizyt
pytanie zadane 31 lipca 2020 w C i C++ przez Nascisz Nowicjusz (160 p.)
0 głosów
2 odpowiedzi 316 wizyt
pytanie zadane 11 lipca 2018 w C i C++ przez Nowacx02 Obywatel (1,060 p.)

93,487 zapytań

142,423 odpowiedzi

322,773 komentarzy

62,908 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

Kursy INF.02 i INF.03
...