Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Rozdział 35 zadanie 1

Ostatnio zmodyfikowano 2016-09-25 21:32
Autor Wiadomość
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;
}
P-151827
OddajcieBoja
» 2016-09-19 19:57:03
W funkcji operacje_na_pliku w bloku instrukcji "while" umieść warunek kończący pętle, czyli:
C/C++
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 :)
P-151828
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ć
P-151830
karambaHZP
» 2016-09-19 20:50:21
C/C++
void pobierz_znak( ifstream & plik, char & p )
{
    plik >> p;
}
 jest zdecydowanie zbędna.

Wystarczy taki zabieg:
C/C++
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.
P-151835
igawar
» 2016-09-22 02:49:22
Czemu takie strasznie długie programy piszecie. Mój wygląda tak:

C/C++
#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;
        //else cout<<".";
    }
}

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.
P-151901
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.
P-151902
Monika90
» 2016-09-22 12:46:08
C/C++
plik.seekg( start );
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.

C/C++
plik.seekg( 2, ios::cur );
Tak można z plikami otworzonymi w trybie binarnym, ale nie tekstowym.

C/C++
while( !plik.eof() )
To też nie jest prawidłowe.
P-151909
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?
P-151911
« 1 » 2
  Strona 1 z 2 Następna strona