Skocz do zawartości

Witaj!

Zaloguj lub Zarejestruj się aby uzyskać pełny dostęp do forum.

Zdjęcie
- - - - -

C++ i getline()


  • Zaloguj się, aby dodać odpowiedź
3 odpowiedzi w tym temacie

#1 Brazol

Brazol
  • 174 postów
  • SkądStolica

Napisano 23 marca 2009 - 16:10

Witam,
Chcę napisać prosty program generujący plik txt. Natknąłem się na problem którego nie potrafię rozwiązać. Zamieszczam kod:

#include fstream
#include string
#include iostream

using namespace std;

int main()
{
	char b[50];
	int i,s1,j;
	ofstream f("test2.txt");

	for (i=0;i<3;i++)
	{
		cout << "Podaj pierwszy string: ";
		cin.getline(b,50);
		
		cout << "Podaj numer: ";
		cin >> s1;
		
		for(j=s1;j<=10;j++)
		{
			f << j << " = " << b << "\n";
		}
		f << "\n";
	}
	f.close();
}

Problem następujący (mam nadzieje że nie okaże się że nie widzę jakiegoś oczywistego błędu :P ): pierwsza pętla for wykonuje się 3 razy (to dziala :P) ale TYLKO za pierwszym razem wykonują się w niej dwa pierwsze polecenia... tj. za pierwszym raze prosi o podanie stringa, wczytuje go prosi o podanie numeru, wczytuje, wypisuje do pliku co trzeba i.. i prosi o podanie numeru.. dlaczego??? Czy może mi ktoś pomóc? Sprawdzić czy u niego też tak jest albo wykazać błąd :)

Plik txt tworzy sie tak jak chcę oprócz tego że podany jest tylko jeden string...

Będę wdzięczny za pomoc
Pozdrawiam Brazol

#2 genshi.wa

genshi.wa
  • 67 postów

Napisano 23 marca 2009 - 16:47

Witam. Na końcu pętli umieść*coś*takiego:
	cin.ignore(1024, '\n');
Pozdrawiam.

#3 Brazol

Brazol
  • 174 postów
  • SkądStolica

Napisano 23 marca 2009 - 17:19

Działa :) dzięki! A możesz w skrócie wyjaśnić poco to i co ta linijka robi? :)

Ps. Czy jest szansa żeby tak napisany program wyświetlał w pliku txt polskie znaki? Bo w takiej postaci nie wyświetla :)

---- Dodano 23-03-2009 o godzinie 20:33 ----
Nadal niewiem jak to zrobić pod TextMatem (jak ktoś wie to byłbym wdzięczny za pomoc) ale pod xCode udało mi się częściowo. Otóż zmieniłem w pliku main.cpp Text Encodeing na Central European (Mac OS) (jak zmieniałem na Cental European (ISO Latin 2) - co gdzieś ktoś polecał to nic nia dawało). Natomiast zmiana na Mac OS dała tyle że polskie litery napisane w kodzie wyświetlają się ładnie w pliku txt. Ale nadal polskie znaki prowadzone przez urzytkownika przez getline() s ą w pliku txt krzaczkami... Jakieś pomysły jak to rozwiązać?

#4 genshi.wa

genshi.wa
  • 67 postów

Napisano 24 marca 2009 - 17:07

Witam.

Jesli chodzi o wyświetlanie, to musisz używać string w formace utf czyli wstring zamiast string.
Powinieneś użyć string zamiast char[]. Jesli używasz C++ używaj string jest dużo proszte i lepsze no i bezpieczniejsze.
Natomiast jesli już chcesz używać char[], to uzywaj wchar_t zamiast char.

Zobacz że pobierasz do tablicy o 50 znakach 50 elementów. A gdzie miejsce na '\0',. To jet początek do napisania exploita do twojej apliakcji :)



Tylko pamiętaj że jesli checsz używać wstring, to nie zapiszesz tego poprzez fstream do pliku, po prostu tego nie obsługuje.

Aha jesli uzywasz wstring bądź wchar_t to string jesli przypisujesz to dajesz L"jakiś*tekst" - musi być duża litera L przed napisem.


Jesli chodzi o twoje pytanie do czego słuzy kod z cin.ignore(), to poprostu ignoruje ileś tam (tutaj 1024) znaków naciśniecia enter. Czyli ignoruje entery w buforze. A dlatego że zawsze operacje na tekstach są*buforowane ( no możesz inaczej ustawić, ale tak jest częsciej lepiej). MOżesz także czyścić bufor. Ale widze, że jesteś dopiero na drodze poznania C++.


Proponuję ci zacząć lepiej czytać jakiś*kurs o C++.
Jesli umiesz angielski, to polecam ci Thinking in C++ B. Eckelsa. Tu masz link:
Bruce Eckel's MindView, Inc: Thinking in C++ 2nd Edition by Bruce Eckel

Jeśli tylko polski (nie chce mi się szukać :P ), to masz coś*pierwszego lepszego:
Kurs C++ - spis zagadnień - programowanie w języku C++ (Marcin Nabiałek)



Pozdrawiam.




Użytkownicy przeglądający ten temat: 1

0 użytkowników, 1 gości, 0 anonimowych