Shadow7 Temat założony przez niniejszego użytkownika |
Rozdział 35 zadanie 1 » 2016-09-19 18:57:50 Witam, mam problem z tym zadaniem - wczytuje się co 3 literka, ale ostania ulega podwojeniu - nie wiem z jakiej okazji. Zawartość pliku txt : Slshoeapsderoqpwd Output : Shadoww
Bardzo proszę o jakieś wskazówki / porady co jest nie tak ...
#include <iostream> #include <string> #include <fstream>
using namespace std;
void pobierz_znak(ifstream& plik, char& p) { plik >> p; }
void operacje_na_pliku(ifstream& plik) { char p; int pos; plik.seekg(0, ios::beg); pos = plik.tellg();
while (!plik.eof() && plik.good()) { pobierz_znak(plik, p); cout << p < " "; plik.seekg(2, ios::cur); } }
bool open(string nazwa) { ifstream plik; plik.open(nazwa.c_str()); if (!plik.good()) { return false; } else { operacje_na_pliku(plik); } plik.close(); return true; }
int main() { string nazwa; cout << "Nazwa pliku : "; getline(cin, nazwa); if (!open(nazwa)) { cout << "\n Nie dam rady otworzyc pliku..." << endl; }
return 0; } |
|
OddajcieBoja |
» 2016-09-19 19:57:03 W funkcji operacje_na_pliku w bloku instrukcji "while" umieść warunek kończący pętle, czyli: while( !plik.eof() && plik.good() ) { pobierz_znak( plik, p ); plik.seekg( 2, ios::cur ); if( plik.fail() ) break; cout << p < " "; }
I następnym razem umieść tekst w znaczniki cpp, ułatwia to czytanie :) |
|
Shadow7 Temat założony przez niniejszego użytkownika |
» 2016-09-19 20:06:21 Taaak, nie chciało się robić obsługi wyjątków i takie są tego skutki... Fail powstał po sprawdzeniu warunku haha. Dzięki - taka głupota, a można wiele czasu stracić |
|
karambaHZP |
» 2016-09-19 20:50:21 void pobierz_znak( ifstream & plik, char & p ) { plik >> p; } |
jest zdecydowanie zbędna. Wystarczy taki zabieg: while( plik >> p ) { plik.seekg( 2, ios::cur ); cout << p < " "; } Jeśli koniecznie chcesz zatrzymać funkcję pobierz_znak, zmodyfikuj ją, aby zawracała wartość bool w zależności do powodzenia wczytywania i umieść ją w warunku pętli, analogicznie do przytoczonego przykładu. |
|
igawar |
» 2016-09-22 02:49:22 Czemu takie strasznie długie programy piszecie. Mój wygląda tak: #include<iostream> #include<fstream> using namespace std; int main() { ifstream plik( "zad35a.txt" ); if( !plik.good() ) return 0; int start = 0; char znak; while( !plik.eof() ) { plik.seekg( start ); plik.get( znak ); ++start; if( start % 3 == 0 ) cout << znak; } }
i wykonuje to co jest zadane. Jeśli usunie się // to dodatkowo wypisze kropki w miejsce znaków innych niż co trzeci a to pozwala łatwo sprawdzić czy dobrze działa. |
|
karambaHZP |
» 2016-09-22 07:01:17 Czemu takie strasznie długie programy piszecie. |
Bo dobrą praktyką jest dzielenie kodu na moduły mające jedną odpowiedzialność. Rozumiem, że kod składający się z kilkunastu linii łatwo ogarnąć w głównej funkcji, jednak jestem za ćwiczeniem dzielenia kodu. |
|
Monika90 |
» 2016-09-22 12:46:08 Ta instrukcja ma niezdefiniowane zachowanie. Argumentem seekg(pos_type) może być tylko wartość zwrócona przez tellg(), nie może to być jakaś dowolna liczba. plik.seekg( 2, ios::cur );
Tak można z plikami otworzonymi w trybie binarnym, ale nie tekstowym. To też nie jest prawidłowe. |
|
igawar |
» 2016-09-22 13:39:45 Monika napisała. while( !plik.eof() ) "To też nie jest prawidłowe." To jak się badać koniec pliku? |
|
« 1 » 2 |