odczytywanie z pliku za pomoca getline

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.pl/matura/2010/informatyka/informatyka_PR_II.pdf
http://maturzysta.dlastudenta.pl/artykul/Egzamin_maturalny_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 ??

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

0

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

1

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

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();
  
}
 
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 :)

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;)

1

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;
}
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();

}

 

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