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

Warunek przy odczycie z pliku tekstowego

+2 głosów
1,005 wizyt
pytanie zadane 4 kwietnia 2015 w C i C++ przez Prime_Bull Obywatel (1,820 p.)

Witam. Doszedłem wczoraj do filmiku o operacjach na plikach i chciałem zmodyfikować delikatnie kod napisany przez Pana Mirosława. Otóż program ma działać na takiej zasadzie, że pobiera linie z pliku tekstowego. Jeśli prawdą jest, że linia składa się tylko z cyfr, to konwertuj na typ int, w przeciwnym wypadku nie zmieniaj typu i zachowaj stringiem. Zrobiłem coś takiego:

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>

using namespace std;

int main()
{
   string linia;
   string literki[100];
   int liczby[100];
   int dlugosc;

   fstream file;

   file.open("abc.txt", ios::in);

   if(file.good()==false)
   {
       cout << "Nie mozna otworzyc pliku!";
   }

   int licznik=0;

   while(!file.eof())
   {
       getline(file, linia);
       dlugosc=linia.length();
       for (int i=0; i<=linia[dlugosc-1]; i++)
       {
            if(linia[i]=='0' || linia[i]=='1' || linia[i]=='2' ||
                linia[i]=='3' || linia[i]=='4' || linia[i]=='5' ||
                linia[i]=='6' || linia[i]=='7' || linia[i]=='8' || linia[i]=='9')
            {
                liczby[licznik]=atoi(linia.c_str());
            }
            else
            {
                literki[licznik]=linia;
            }
        }
       licznik++;
   }

   for (int i=0; i<licznik; i++)
   {
        cout << liczby[i] << endl << cyfry[i] << endl;
   }

   file.close();

   return 0;
}

W sumie to zorientowałem się, że już ten warunek jest zły, bo konwertuje linie po sprawdzeniu tylko pierwszego znaku lini. Może jakiś kompletnie inny sposób? Z góry dzięki za pomoc. Pozdrawiam.

4 odpowiedzi

+3 głosów
odpowiedź 4 kwietnia 2015 przez Qhoros Mądrala (7,110 p.)
wybrane 4 kwietnia 2015 przez Prime_Bull
 
Najlepsza
Możesz sprawdzać warunek fałszywy, tzn. zrobić coś na zasadzie

if(sprawdzaj())
....

gdzie sprawdzaj() sprawdza czy w ciągu jest litera, a nie cyfra. Jeżeli jest litera to funkcja zwraca false. Jeżeli pętla przejdzie do końca, ma zwracać true.

bool sprawdzaj()
{
    for ....
       if.....
          return false;

  return true;
}

Jeżeli masz pytanie - zapraszam na priv. Mogę na szybko wytłumaczyć/podesłać przykład.

Pozdrawiam ;))
komentarz 4 kwietnia 2015 przez Prime_Bull Obywatel (1,820 p.)

Zrobiłem to w osobnej funkcji, ale i tak najważniejszy jest ten warunek w funkcji sprawdzaj, którego nie wiem jak napisać. Bardzo możliwe, że będzie działać funkcja std::isdigit, którą podał elaen. Narazie program wygląda tak:

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>

using namespace std;

bool sprawdzaj(int dlugosc, string linia);

int main()
{
   string linia;
   int dlugosc;

   fstream file;

   file.open("abc.txt", ios::in);

   if(file.good()==false)
   {
       cout << "Nie mozna otworzyc pliku!";
   }

   while(!file.eof())
   {
       getline(file, linia);
       dlugosc=linia.length();
       if(sprawdzaj(dlugosc, linia))
       {
            cout << linia << endl;
       }
       else
            cout << atoi(linia.c_str()) << endl;
   }

   file.close();

   return 0;
}

bool sprawdzaj(int dlugosc, string linia)
{
    for (int i=0; i<=linia[dlugosc-1]; i++)
    {
        if(linia[i]=='0' || linia[i]=='1' || linia[i]=='2' ||
            linia[i]=='3' || linia[i]=='4' || linia[i]=='5' ||
            linia[i]=='6' || linia[i]=='7' || linia[i]=='8' || linia[i]=='9')
        {
            return false;
        }
    }
    return true;
}

 

komentarz 4 kwietnia 2015 przez Qhoros Mądrala (7,110 p.)

Sama funkcja isdigit nic nie da. Musi być obwarowana warunkami. Tak jak mówiłem w tym przypadku chodzi o sprawdzanie warunku fałszywego. W Twoim przypadku warunkiem prawdziwym (dalsze działanie programu) jest ciąg składający się z samych cyfr. Zatem warunkiem fałszywym jest obecność choć jednej litery w tym ciągu. Twoim zadaniem NIE jest zatem sprawdzanie cyfr (wtedy mamy do czynienia ze sprawdzaniem pierwszego indeksu) lecz liter. Podaję przykład pisany na szybko. Zmień sobie wywoływany argument z 's1' na 's2' i 's3'. W razie pytań zapraszam do dalszej dyskusji.

#include <iostream>
#include <string>

using namespace std;

bool sprawdzaj(string s1)
{
	for (int i = 0; i < s1.length() - 1; i++)
		if (!isdigit(s1[i]))
			return false;
	return true;
}

int main()
{
	string s1 = "avc212", s2 = "0123", s3 = "123123r5";
	
	if (sprawdzaj(s1))
		cout << "Same cyfry\n\n";
	else
		cout << "Jest litera... Blad ;(\n\n";
	
	system("PAUSE");
	return 0;
}

Pozdrawiam. :)

komentarz 4 kwietnia 2015 przez Prime_Bull Obywatel (1,820 p.)

Ok ;) Wdrożyłem ten kod do całego programu i działa! Dzięki wielkie. Oto kod:

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
#include <cctype>

using namespace std;

bool sprawdzaj(string linia);

int main()
{
   string linia;

   fstream file;

   file.open("abc.txt", ios::in);

   if(file.good()==false)
   {
       cout << "Nie mozna otworzyc pliku!";
   }

   while(!file.eof())
   {
       getline(file, linia);
       if (sprawdzaj(linia))
         cout << atoi(linia.c_str()) << "\n";
       else
         cout << linia << "\n";
   }

   file.close();

   return 0;
}

bool sprawdzaj(string linia)
{
    for (int i=0; i<=linia.length()-1; i++)
        if(!isdigit(linia[i]))
            return false;
    return true;
}

 

komentarz 4 kwietnia 2015 przez Qhoros Mądrala (7,110 p.)
Po to tu jesteśmy. :) Powodzenia w dalszej pracy.
+1 głos
odpowiedź 4 kwietnia 2015 przez elaen Gaduła (4,760 p.)

Hej, myśle że mógłbyś użyć do tego np tej funkcji std::isdigit sprawdź pod tym linkiem http://en.cppreference.com/w/cpp/string/byte/isdigit . Funkcja zwróci TRUE jeżeli będzie to 0-9 w innym przypadku false :) mam nadzieje że coś pomogłem

+1 głos
odpowiedź 4 kwietnia 2015 przez hit02 Nałogowiec (33,970 p.)
edycja 4 kwietnia 2015 przez hit02

Napisałem taki warunek i działa.smiley Oczywiście musiałem go trochę zmienić, aby się kompilował i dawał jakąś informację, czy działa.

bool isDigit(string line)
{
	for(unsigned int i = 0; i < line.length(); i++)
	{
		if(line[i] < '0' || line[i] > '9')
			return false;
	}
	return true;
}
komentarz 4 kwietnia 2015 przez Prime_Bull Obywatel (1,820 p.)
Ta funkcja jest nawet lepsza, niż to co napisałem wyżej, bo nie trzeba koszystać z dodatkowej funkcji isdigit z biblioteki <cctype>. Dzięki wielkie również!
0 głosów
odpowiedź 4 kwietnia 2015 przez hit02 Nałogowiec (33,970 p.)
Mi się to nie kompiluje. Nie inicjalizujesz tablicy cyfry[].
komentarz 4 kwietnia 2015 przez Prime_Bull Obywatel (1,820 p.)
Ten kod może nie działać, bo wczoraj w nim troche namieszałem a dzisiaj już go nawet nie kompilowałem...

Podobne pytania

0 głosów
2 odpowiedzi 432 wizyt
0 głosów
2 odpowiedzi 417 wizyt
pytanie zadane 24 marca 2016 w C i C++ przez szymi666 Bywalec (2,020 p.)
+1 głos
3 odpowiedzi 1,195 wizyt

93,772 zapytań

142,731 odpowiedzi

323,383 komentarzy

63,375 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...