odczytywanie z pliku za pomoca getline

Odpowiedz Nowy wątek
2013-04-28 22:21
0

witam, mam taki problem
o to kod , ktory napisalem:


#include<iostream>
#include<conio.h>
#include<fstream>

using namespace std;

int main()

{
    fstream plik;
    ofstream zapis;
    string napis,zapisz;
    int dlugosc;
   char abc,def ;
   abc = ' ' ;
   def = '\n'

plik.open ("e:/plik.txt", ios::in);
zapis.open ("e:/zapis22.txt",ios::out);
for(int i=0;i<4;i++){
getline (plik,napis,abc || def); //podwojenie drugi wyraz zapisze sie tylko
dlugosc=napis.length();
zapis<<napis;
zapis<<"\n";
zapis<<dlugosc;
zapis<<"\n";
}

plik.close();
zapis.close();
getch();
}

i teraz jest taka kwestia gdyby nie

 def

to by działało,
program odczytuje wyrazy z http://pobieranie.dlastudenta[...]rmatyka/informatyka_PR_II.pdf
http://maturzysta.dlastudenta[...]turalny_informatyka,6986.html
tu jest pliki " dane " z 2010

wyrazy odczytuje z tego pliku
jak widac 5 wyrazow w 1 linijce , i tu jest problem:
ogolnie poki co chce odczytac 5 wyrazow w linijce
4 odczytuje dobrze , ale 5 nie, poniewaz za nim nie ma spacji, nie chcac
dopisac recznie spacji, chcialem zrobic z LUB jako \n
pomysl jak to dobrze zrobic ??

Pozostało 580 znaków

2013-04-28 23:32
0

wczytuj sobie to do jakiegoś kontenera np vector stla


vector<string> vect;
string napis;

for(int i=0;i<5;i++){
    plik>>napis;
    vect.push_back(napis);
}

i tutaj masz w indeksach od vect[0] - vect[4] - 5 wyrazów pierwszej linii. Dorzucasz pętlę while(!plik.eof()) i masz wszystkie wyrazy wczytane. Z łatwością można w ten sposób operować na danych

edytowany 3x, ostatnio: damiannno, 2013-04-28 23:36
wywala mi blad w tym kodzie: #include<iostream> #include<conio.h> #include<fstream> using namespace std; int main() { fstream plik; ofstream zapis; string napis; int dlugosc; char abc,def ; abc = ' ' ; vector<string> vect; plik.open ("e:/plik.txt", ios::in); zapis.open ("e:/zapis22.txt",ios::out); for(int i=0;i<5;i++){ plik>>napis; vect.push_back(napis); } zapis<<napis; zapis<<"\n"; zapis<<dlugosc; zapis<<"\n"; plik.close(); zapis.close(); getch(); } - kejkun 2013-04-28 23:50

Pozostało 580 znaków

2013-04-28 23:53
0

Damiano odp. Ci w komentarzu, a moim sposobem nie da rady ?

Pozostało 580 znaków

2013-04-28 23:58
1

Daj nagłówek jeszcze
#include <vector>
z resztą poczekaj chwile napisze Ci to

Pozostało 580 znaków

2013-04-29 00:10
1

Tutaj masz wczytane wszystko z pliku dane.txt i wyswietlone u mnie działa sprawdź sb

#include<iostream>
#include<conio.h>
#include<fstream>
#include <vector>

using namespace std;

int main()

{
    fstream plik;
    ofstream zapis;
    string napis;
    vector<string> vect;

 plik.open ("anagram.txt", ios::in);
 zapis.open ("e:/zapis22.txt",ios::out);

 while(!plik.eof())
 {
    for(int i=0;i<5;i++)
    {
            plik>>napis;
            vect.push_back(napis);
    }
 }

 for(int i=0;i<vect.size();i++)
 {
         cout<<vect[i]<<" ";
         if((i+1)%5==0) cout<<endl;
 }
plik.close();
zapis.close();
getch();

}
edytowany 1x, ostatnio: damiannno, 2013-04-29 00:21
no racja wszystko sie wyswietla, ale ja mialem w sumie inny zamiar ? bo chcialem to do dokumentu tekstowego zapisac, i teraz jak v[0] -> 1 wyraz v[n] -> en-ty wyraz ? bo teraz wiesz chciałbym spr. dlugosc tych wyrazow w danej linijce. W Twoim sposobie troche sie nie znam :P - kejkun 2013-04-29 00:13
Tak dokladnie. Sprawdzaj sb po kolei w petli vect[i].length(). Chciałem Ci tylko pokazać możliwości stla - damiannno 2013-04-29 00:18

Pozostało 580 znaków

2013-04-29 00:22
0

edit: teraz dopiero zrocilem uwage, ze z ost. linijka jest cos nie tak, tj nie powinno jej byc powtarza ost. wyraz.

dobra czyli tak:

 for(int i=0;i<5;i++)
    {
            plik>>napis;
            vect.push_back(napis);
    }

tutaj mam dokladnie 5 wyrazow, tj linie, tak ?
musze troche doksztalcic sie o tych wektorach w c++.

wstawie sobie tu w petle

 vect[i].length()

jak mowisz,
a pod petla np.

if (
vect[1].length() = vect[2].length() = vect[3].length() = vect[4].length() =vect[5].length() )
{ to zapisze 1 linijke } 

cos w tym stylu bym kombinował.
tyle, ze tutaj tez musialbym zmienic na jakas petle gdyz, nie bede ciagle 1 linijki wypisywał.
mniej wiecej dobrze kombinuje ? ?
dzieki, fajny pomysl miales :)

edytowany 3x, ostatnio: kejkun, 2013-04-29 00:33
porównanie pomyliło CI się z przypisaniem. - kopernik 2013-04-29 01:04

Pozostało 580 znaków

2013-04-29 00:35
1

No spoko mozesz i zrobić tak jak piszesz czyli

 for(int i=0;i<vect.size();i+=5)
 {     
       if(vect[i].length()==vect[i+1].length() == vect[i+2].length()==vect[i+3].length()==vect[i+4].length())
       {
         //zapisz 
       }

 }

ale pokombinowałbym jeszcze, żeby to było bardziej eleganckie;)

edytowany 1x, ostatnio: damiannno, 2013-04-29 00:43
w tamtym rozwiazaniu, trzeba z pliku zrodlowego skasowac ost. linijke, tak zeby tam nie było pustego znaku bo wtedy dopisuje caly czas ost. wyraz :P Ogolnie wielkie dzieki za pomoc :) - kejkun 2013-04-29 00:36
Powariowali ci rzymianie. Czy wiesz co to znaczy: vect[i].length==vect[i+1].length==vect[i+2].length==vect[i+3].length==vect[i+4] ? - _13th_Dragon 2013-04-29 00:39
Przepraszam już poprawiłem;) to był taki szybki pseudokodzik powiedzmy ;) - damiannno 2013-04-29 00:43
Tak tego nie sprawdzisz. To zawszę zwróci false. Musisz sprawdzać zerowy z pierwszym && pierwszy z drugim && tak dalej. C# chyba tak by sprawdził, ale C++ na pewno nie. Już nie mówiąc, że ta pętla nadaje się do działu WTF!. - kopernik 2013-04-29 01:06
a czemu petla jest do kitu ?? - kejkun 2013-04-29 09:32

Pozostało 580 znaków

2013-04-29 00:39

Kurcze matura z inf. jest coraz łatwiejsza. A żeby znaleźć anagramy, na początku sprawdzasz długość stringów. Jak jest ok, sortujesz, porównujesz i masz.

#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
using namespace std;
bool anagram(string a,string b,string c,string d,string e){
    sort(a.begin(),a.end());
    sort(b.begin(),b.end());
    sort(c.begin(),c.end());
    sort(d.begin(),d.end());
    sort(e.begin(),e.end());
    return a==b && b==c && c==d && d==e;
}
int main(){
    string a,b,c,d,e;
    ifstream in("anagram.txt");
    ofstream out("odp_4a.txt");
    ofstream out1("odp_4b.txt");
    while(in>>a>>b>>c>>d>>e){
        if(a.size()==b.size() && b.size()==c.size() && c.size()==d.size() && d.size()==e.size()){
            out<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e<<"\n";
            if(anagram(a,b,c,d,e)){
                out1<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e<<"\n";
            }
        }
    }
    in.close();
    out.close();
    out1.close();
    return 0;
}
edytowany 3x, ostatnio: kopernik, 2013-04-29 00:50
Pokaż pozostałe 2 komentarze
jak Ty to zrobiles ?? jakim cudem czytales od razu hm po wyrazie ??? co to za magiczne " while(in " " in " ?? - kejkun 2013-04-29 00:49
Poczytaj o fstream i algoritm. Ta pętla wczytuje po protu dopóki ma coś na wejściu. - kopernik 2013-04-29 00:54
o co dokładniej z tym sortowaniem ? Co robi to " sort " ? Twoje rozwiążanie jest na w ogole innym poziomie xD :D - kejkun 2013-04-29 00:55
sortuje napis. Jak masz napis "sdea", to po sortowaniu masz "ades". - kopernik 2013-04-29 00:56
dobra mniej wiecej czaje, w razie co jeszcze sie dopytam kiedy indziej, generalnie dzieki :D zawalisty przyklad mam od Ciebie :D :) - kejkun 2013-04-29 00:58

Pozostało 580 znaków

2013-04-29 01:35
0

zwraca 1 dobry wyraz , tylko 1 wyraz w linii , jak naprawic ??

#include<iostream>
#include<conio.h>
#include<fstream>
#include <vector>

using namespace std;

int main()

{
    fstream plik;
    ofstream zapis;
    string napis;
    vector<string> vect;

 plik.open ("e:/plik.txt", ios::in);
 zapis.open ("e:/zapis22.txt",ios::out);

 while(!plik.eof())
 {

            plik>>napis;
            vect.push_back(napis);

    }

          for( int i=0;i<vect.size();i+=5){

       if(vect[i].length()==vect[i+1].length()   && vect[i+1].length() == vect[i+2].length() &&vect[i+2].length()==vect[i+3].length() &&vect[i+3].length()==vect[i+4].length())
       {

            zapis<<"\n";

         zapis<<vect[i];

       }

 }

plik.close();
zapis.close();
getch();

}
edytowany 5x, ostatnio: kejkun, 2013-04-29 09:46
Jak już tak chcesz, to na początku wczytaj wszystko do vectora(co jest stratą miejsca). I nie możesz tego tak sprawdzać, jak zaproponował @damiannno, bo to zawszę, zwróci false. - kopernik 2013-04-29 01:47
no dla treningu chcialem sprobowac dokonczyc tym 2 sposobem, nie moge uzyc " if(vect[i].length()==vect[i+1].length() == vect[i+2].length()==vect[i+3].length()==vect[i+4].length()) " ?? to co zamiast tego ;x ? bo to akurAT wynikalo z mojego pomyslu ;/ rozumiem, ze wrzucenie wszystkiego do vectora osiagne poprzez skasowanie " for(int i=0;i<5;i++) { " ? program sie włącza, ale nic sie do pliku nie zapisuje ;/ - kejkun 2013-04-29 09:21
@kejkun, słusznie zaznaczyłeś post od @kopernik, ale czy go przeczytałeś? - _13th_Dragon 2013-04-29 09:27
tak, ale teraz dopiero zauwazylem, ze 1 nowy komentarz na dole :P znaczy ktory post ?? od kopernik czy Daimano ? zmienilem na : if(vect[i].length()==vect[i+1].length() && vect[i+1].length() == vect[i+2].length() &&vect[i+2].length()==vect[i+3].length() &&vect[i+3].length()==vect[i+4].length())<br /> i wtedy wyjscie to : a abcd i inne. odp. edytujac mam wyjscie, do pliku w postaci : pierwszych DOBRYCH wyrazow tj od abcd do burza - kejkun 2013-04-29 09:29

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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