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

Tworzenie pliku o nazwie zmiennej + rozszerzenia

Object Storage Arubacloud
0 głosów
620 wizyt
pytanie zadane 23 października 2016 w C i C++ przez czujek22 Dyskutant (7,670 p.)

Mam następujący problem:

Stworzyłem program, który wyswietla dni miesiąca, następnie uzytkownik wybiera dzień i tworzy notatke, podczas czego ta notatka się zapisuje do pliku o nazwie tego dnia tygodnia.

Zrobiłem tak, że nazwa pliku zależy od wyboru właśnie, jednak jak dodać rozszerzenie .txt plikowi?

Drugi problem to taki, że pisząc notatke potem w pliku nie ma pierwszego słowa a reszta zdania jest i nie wiem co jest tego przyczyną.

#include <iostream>
#include <fstream>

using namespace std;

int dzien[31];
string wybor;
string notatka;
string linia;

int main()
{
    for(int i=0;i<=30;i++)
    {
    cout << i+1<<" pazdziernik " << endl;
    }
    cout<<endl<<"Wybierz dzien miesiaca dla swoich notatek: ";
    cin>>wybor;

    cout<<"Twoja notatka(pisz w jednej linii): ";
    cin>>notatka;

    fstream plik;
    plik.open(wybor.c_str(), ios::out);

    getline(cin, notatka);

    plik<<notatka<<endl;

    plik.close();


    return 0;
}

 

komentarz 23 października 2016 przez czujek22 Dyskutant (7,670 p.)

chodzi oczywiscie o ten moment

plik.open(wybor.c_str(), ios::out);

 

2 odpowiedzi

+1 głos
odpowiedź 23 października 2016 przez Jacek0325 Obywatel (1,040 p.)
wybrane 23 października 2016 przez czujek22
 
Najlepsza

Jeśli chodzi o przyczynę braku pierwszego słowa w pliku:

Strumień wejścia cin wykonuje się w Twoim kodzie w linii 21,

cin>>notatka;

a potem ponownie w linii 26:

getline(cin, notatka);

Co prawda ten drugi cin nie czeka już na Enter, ale "bierze" te słowa, których nie wziął pierwszy cin - a pierwszy bierze treść do pierwszej spacji, bo tak to działa bez użycia getline. Oznacza to, że drugi cin pobiera wszystko wpisane po pierwszej spacji, a ponieważ jest wewnątrz getline, to pobiera całą dalszą część linii (razem z następnymi spacjami) i zapisuje to do zmiennej notatka (podmienia więc to pierwsze słowo, które wcześniej zapisał tam pierwszy cin).

Proponuję więc zrobić z tych dwóch linijek jedną, stosując getline. Dodatkowo, aby program czekał w tym miejscu na Enter, trzeba "wyczyścić" poprzedni strumień (cin>>wybor), a więc przed getline wpisać cin.ignore(); U mnie przynajmniej to zdaje egzamin.

komentarz 23 października 2016 przez czujek22 Dyskutant (7,670 p.)

Czyli mam przeniesc ten getline w miejsce cin>>notatka?

cout<<"Twoja notatka(pisz w jednej linii): ";
    cin.ignore();
    getline(cin, notatka);

 

komentarz 23 października 2016 przez Jacek0325 Obywatel (1,040 p.)
edycja 23 października 2016 przez Jacek0325

Tak.

EDIT: zauważ też, że tablica dzien[31] i zmienna linia nie są wykorzystywane w programie (choć być może będziesz chciał ich użyć przy jego rozbudowie).

+1 głos
odpowiedź 23 października 2016 przez Myśliwy Gaduła (3,080 p.)
edycja 23 października 2016 przez Myśliwy

Nie ma pierwszego słowa, bo najpierw czytasz słowo i zapisujesz je do notatka (21 linijka), a później czytasz całą linie - usunięcie

cin>>notatka;

chyba załatwi problem.

Żeby do wyboru dodać rozszerzenie .txt zrób:

wybor+=".txt";

a następnie twórz plik.

komentarz 23 października 2016 przez Myśliwy Gaduła (3,080 p.)

Oczywiście jeszcze, żeby wpisać coś w strumień cin bez wkładania do zmiennej, jest metoda

cin.get();
komentarz 23 października 2016 przez Myśliwy Gaduła (3,080 p.)
Do tego cin.get() działa tak, że jeśli wcześniej został wciśnięty enter, to gdy program napotka tę metodę, stwierdzi, że została już wykonana, więc można przeliczyć ile razy trzeba wcisnąć enter do tego momentu i tyle razy +1 wstawić tą metodę (jeśli tych enterów nie było za duzo ;) )
komentarz 23 października 2016 przez Myśliwy Gaduła (3,080 p.)

ma być coś w tym stylu

    cout<<"Twoja notatka(pisz w jednej linii): ";
    cin.get();
    getline(cin, notatka);

 

Podobne pytania

+3 głosów
4 odpowiedzi 1,709 wizyt
pytanie zadane 30 czerwca 2015 w C i C++ przez Phobos Użytkownik (720 p.)
0 głosów
1 odpowiedź 356 wizyt
pytanie zadane 3 grudnia 2020 w C i C++ przez Mateusz1223 Bywalec (2,440 p.)
+1 głos
1 odpowiedź 182 wizyt
pytanie zadane 17 września 2020 w C i C++ przez Mavimix Dyskutant (8,390 p.)

92,555 zapytań

141,402 odpowiedzi

319,544 komentarzy

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

...