odczytywanie z pliku za pomoca getline

odczytywanie z pliku za pomoca getline
KE
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 11 lat
  • Postów:43
0

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

Kopiuj
 
#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

Kopiuj
 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 ??

damiannno
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:68
0

wczytuj sobie to do jakiegoś kontenera np vector stla

Kopiuj
 
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
KE
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(); }
KE
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 11 lat
  • Postów:43
0

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

damiannno
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:68
1

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

damiannno
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:68
1

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

Kopiuj
#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
KE
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
damiannno
Tak dokladnie. Sprawdzaj sb po kolei w petli vect[i].length(). Chciałem Ci tylko pokazać możliwości stla
KE
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 11 lat
  • Postów:43
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:

Kopiuj
 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

Kopiuj
 vect[i].length()

jak mowisz,
a pod petla np.

Kopiuj
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
KO
porównanie pomyliło CI się z przypisaniem.
damiannno
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:68
1

No spoko mozesz i zrobić tak jak piszesz czyli

Kopiuj
 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
KE
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 :)
_13th_Dragon
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] ?
damiannno
Przepraszam już poprawiłem;) to był taki szybki pseudokodzik powiedzmy ;)
KO
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!.
KE
a czemu petla jest do kitu ??
KO
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 2 lata
  • Postów:519
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.

Kopiuj
#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
Zobacz pozostałe 2 komentarze
KE
jak Ty to zrobiles ?? jakim cudem czytales od razu hm po wyrazie ??? co to za magiczne " while(in " " in " ??
KO
Poczytaj o fstream i algoritm. Ta pętla wczytuje po protu dopóki ma coś na wejściu.
KE
o co dokładniej z tym sortowaniem ? Co robi to " sort " ? Twoje rozwiążanie jest na w ogole innym poziomie xD :D
KO
sortuje napis. Jak masz napis "sdea", to po sortowaniu masz "ades".
KE
dobra mniej wiecej czaje, w razie co jeszcze sie dopytam kiedy indziej, generalnie dzieki :D zawalisty przyklad mam od Ciebie :D :)
KE
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 11 lat
  • Postów:43
0

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

Kopiuj
#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
KO
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.
KE
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 ;/
_13th_Dragon
@kejkun, słusznie zaznaczyłeś post od @kopernik, ale czy go przeczytałeś?
KE
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()) i wtedy wyjscie to : a abcd i inne. odp. edytujac mam wyjscie, do pliku w postaci : pierwszych DOBRYCH wyrazow tj od abcd do burza

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.