Wątek przeniesiony 2015-02-18 13:12 z C/C++ przez ŁF.

Odczyt z pliku i porównanie stringów

2015-02-18 00:27
0

Witam,

moim zadaniem było napisanie programu, który pobiera z pliku dwa ciągi liczb, oddzielone przecinkiem i zapisuje do zmiennej string, te które występują w obu ciągach. Niestety mój program nie spełnia swojego zadania, a ja nie potrafię zlokalizować błędu. W momencie gdy chcę wyświetlić zawartość zmiennej z powtarzającymi się cyframi, nic się nie pokazuje. Czy wiecie jak sobie z tym poradzić?

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int main()
{

    fstream plik;
    plik.open("liczby.txt", ios::in | ios::out);

    if(plik.good())
    {
        string c1;
        string c2;
        string c3;

        getline(plik,c1,',');
        getline(plik,c2);

        cout<<c1<<endl;
        cout<<c2<<endl;

        for(int i=0; i<c1.length();i++)
        c3[i]==0;

        for(int j=0; j<c2.length(); j++)
        {
            for(int i=0; i<c1.length(); i++)
            {

            if(c1[i]==c2[j])
            c3[i]==c1[i];

            }
        }}

        for(int i=0; i<c3.length(); i++)

        if(c3[i>0]) cout<<c3[i]<<endl;

    return 0;   
}
edytowany 2x, ostatnio: maggy24, 2015-02-18 00:29

Pozostało 580 znaków

2015-02-18 00:37
0

Nie

if (c3[i > 0])

tylko

if (c3[i] > 0)

Swoją drogą Twój algorytm też jest bardzo dziwny, ale pewnie to odkryjesz jak wypiszesz te liczby.

edytowany 1x, ostatnio: twonek, 2015-02-18 00:38

Pozostało 580 znaków

2015-02-18 00:39
0

Dziękuję za zwrócenie uwagi na ten błąd, jednak jego poprawa nie rozwiązała problemu. Nadal nic się nie wyświetla.
Rzeczywiście, trochę to zamotane :) Pewnie dało się to zrobić prościej i szybciej, ale to jedyne co w tym momencie przyszło mi do głowy.

edytowany 1x, ostatnio: maggy24, 2015-02-18 00:41

Pozostało 580 znaków

2015-02-18 00:55
0
string c3;
....
for(int i=0; i<c1.length();i++)
    c3[i]==0;

1) == to porównanie, nie przypisanie, tak samo w pętli masz porównanie zamiast przypisania
2) c3 jest pustym stringiem, gdyby to były przypisania to w najlepszym przypadku program by padł

Pozostało 580 znaków

2015-02-18 01:03
0

Poprawiłam błędy, jednak program nadal nie chce działać. Dziękuję za Twoje chęci, ale dopiero zaczynam naukę programowania i nadal nie rozumiem w czym tkwi problem.

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int main()
{

    fstream plik;
    plik.open("liczby.txt", ios::in | ios::out);

    if(plik.good())
    {
        string c1;
        string c2;
        string c3;

        getline(plik,c1,',');
        getline(plik,c2);

        cout<<c1<<endl;
        cout<<c2<<endl;

        for(int i=0; i<c1.length();i++)
        c3[i]=0;

        for(int j=0; j<c2.length(); j++)
        {
            for(int i=0; i<c1.length(); i++)
            {

            if(c1[i]==c2[j])
            c3[i]=c1[i];

            }
        }

        for(int i=0; i<c3.length(); i++)
        {
            if(c3[i]>0) cout<<c3[i]<<endl;

        }

    }

    return 0;   
}
```c
edytowany 1x, ostatnio: maggy24, 2015-02-18 01:03

Pozostało 580 znaków

2015-02-18 01:19
1

2) c3 jest pustym stringiem, gdyby to były przypisania to w najlepszym przypadku program by padł

Dodaj:

c3.resize(c1.size());

po wczytaniu c1

Pozostało 580 znaków

2015-02-18 01:29
0

Wszystko działa jak należy :) Baaardzo dziękuję za pomoc. Mógłbyś mi jeszcze pokrótce wyjaśnić dlaczego to taka konieczna operacja. Chyba, że już opadły Ci ręce i straciłeś cierpliwość...

edytowany 2x, ostatnio: maggy24, 2015-02-18 01:30

Pozostało 580 znaków

2015-02-18 01:43
2

Jak deklarujesz string w ten sposób

string c3;

to on jest pusty. Czyli operacje

c3[i] = 0;

są niepoprawne i w najlepszym przypadku program powinien się wywalić. Niestety się nie wywalił, więc nawet nie wiesz że był błąd.

c3.resize(c1.size());

zmienia długość stringa c3 na taką samą jak c1, w tym przypadku alokując pamięć. Po tym c[3] = 0 już są poprawne (aczkolwiek zbędne, bo resize() samo wypełnia zerami) bo już masz tę tablicę zaalokowaną.

Pozostało 580 znaków

2015-02-18 01:49
0

Jeszcze raz dziękuję. Teraz wszystko jest już jasne!

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0