Uczę się C++ i po przeczytaniu 1 działu książki jest ćwiczenie " Napisz program wyświetlający w konsoli trzy linijki tekstu i oczekując na dowolny klawisz po każdej z nich"
I wyszło mi takie coś:
#include
#include
using namespace std;
int main()
{
cout << " Pierwsza linijka tekstu " ;
getch();
cout << " Druga linijka tekstu " ;
getch();
cout << "trzecia linijka tekstu: " ;
getch();
return 0;
}
Wszystko pięknie tylko że tekst pojawia się w jednej linijce . Co źle zrobiłem?
Niech na razie używa to co dali mu w książce Potem sam zacznie używać czego innego
Są dwa sposoby na przeniesienie do nowej linii
Pierwszy sposób: jest to użycie \n, czyli znaku nowej linii (New Line). Stosuje się go tylko w cudzysłowach, czyli: jeśli chcesz w stawić linię po jakimś tekście itp. To wpisujesz:
cout<<"Pierwszy tekst\nDrugi tekst";
Co spowoduje wyświetlenie na ekranie:
Pierwszy tekst
Drugi tekst
Drugi sposób: jest to użycie endl, czyli zakończenia linii (End Line). Robi dokładnie to samo, lecz inaczej się go stosuje. Nie wstawia się go w cudzysłowach ale po za nimi. Używa go się w następujący sposób:
cout<<"Pierwszy tekst"<
Wyświetli dokładnie to samo co wyżej. Różni się tylko kodem
@up, “\n” i std::endl to nie jest dokładnie to samo. std::endl to znak nowej linii dla danego systemu(Windows -"\r\n", Linux - “\n”, Mac Os - “\n\r” albo “\r” nie pamiętam już), “\n” to tylko znak nowej linii.
Heh, ciekawostka, postanowiłem sprawdzić jak to jest na linux’ie z tym endl i \n.
Aby to sprawdzić napisałem sobie mikro programik:
#include
#include
#include
using namespace std;
int main()
{
fstream f;
f.open("./tt.dat",ios::out|ios::binary); //otwieramy plik
f<
f.close(); //zamykamy plik
f.open("./tt.dat",ios::in|ios::binary); // otwieramy ponownie
while(true)
{
char ch;
f.read(&ch,1); // wczytujemy znak
if(!f) break; // koniec jeżeli odczyt się nie udał
cout<
}
f.close(); // zamykamy plik
return 0;
}
Odpalcie pod unix’em to się zdziwicie. Fiolek , gwarantuję kompletne zaskoczenie! :lol: Jeżeli ktoś ma Mac Os to bardzo proszę to wyprobować i dać znać co wyszło.
Czemu wynik miałby wywoływać zdziwienie? U mnie (GNU/Linux, GCC 4.3) wynik to 0xA, czyli 10, czyli znak nowej linii (Line Feed) w ASCII. I to wynik ten sam niezależnie od ustawionego trybu ios::binary.
Natomiast co do \r i \n to jest to zagadnienie wyjaśnione w Symfonii C++, różne systemy mają różne “końce linii” w plikach tekstowych. W edytorze który używam (Kate) jest do wybory nowa linia w stylu UNIX, Mac i Windows, sprawdzę co Kate wstawia w każdym ustawieniu.
Jeszcze dodam implementację std::endl w GCC 4.3 (niezbyt piękny kod, ale można się połapać co robi i jest odpowiednikiem tego co napisał 13tySmok)
W Symfonii autor pisze, że przy używaniu trybu tekstowego dla strumieni (czyli bez ios::binary) \n jest w Windows zamieniany na \r\n przy zapisie i na odwrót przy odczycie. To już sobie trzeba sprawdzić samemu, to jest pewnie zachowanie zależne od implementacji. Na Mac OS zapewne \n jest zamieniane na \r w trybie tekstowym (jeżeli w Windows jest zamieniane to w Mac OS chyba też powinno być). Ma ktoś dokument standardu C++ i może to sprawdzić?
PS. W ogóle wie ktoś skąd wziąć oficjalną dokumentację C++? Kiedyś szukałem i z tego co pamiętam to kosztuje $18. Czyli nie jest dostępna bezpłatnie?