Pomoc w zadaniu (poruszanie się po pliku w trybie do odczytu)

0

Witam, mógłby mi ktoś pomoc z tym zadaniem:

//Napisz program, który odczytuje co trzeci znak z pliku.
//Przetestuj poprawność działania programu na bardzo krótkim pliku tekstowym, wypisując co trzeci odczytany znak na ekranie.
#include <iostream>
#include <fstream>
#include <string>

bool odczytajPlik(std::string sNazwaPliku)
{
    std::ifstream plik;
    plik.open(sNazwaPliku.c_str());
    if(!plik.good())
        return false;

    plik.seekg(0);
    while(!plik.eof)
    {
        char znak;
        plik >> znak;
        std::cout << znak;
        plik.seekg(3, std::ios::cur);
    }
    return true;
}

int main()
{
    if(!odczytajPlik("plik.txt"))
        std::cout << "Nie odczytano pliku!" << std::endl;
    return 0;
}
 

Program szaleje, kiedy go odpalam. Co jest przyczyną? Poza tym kiedy zwyczajnie pobieram każdy znak, to podwaja dwa ostatnie znaki. Jak to naprawić? :)

0

Jeśli chodzi o podwajanie to masz zły warunek while. eof ustawi sie dopiero jak spróbujesz czytać będąc za końcem pliku a nie jak do niego dojdziesz, w efekcie odczytasz ostatni znak z pliku, wypiszesz go, sprawdzisz warunek, będzie OK, spróbujesz czytać będąc już na końcu pliku, ustawi sie eof, ale jesteś już w pętli więc wypiszesz poprzednio wczytany znak.

0
bool odczytajPlik(std::string sNazwaPliku)
{
    std::ifstream plik;
    plik.open(sNazwaPliku.c_str());
    if(!plik.good())
        return false;

    std::string str((std::istreambuf_iterator<char>(plik)),
                 std::istreambuf_iterator<char>());

    size_t len = str.length() ;

    for (size_t i = 0 ; i < len ; i++)
    {
	    if ( (i + 1) % 3 == 0) std::cout << str[i] << std::endl ; 
    }

    return true;
}
0

Ok, więc co tu trzeba zrobić, bo inny warunek również nie pomaga, np.

while(plik.good())
0

@Wylte

while(plik>>znak){
}
0

A, no tak. W ogóle zapomniałem, że można zrobić coś takiego. Tylko nie jestem pewien co do wyświetlanego wyniku. W pliku znajduje się tekst: "C++ jest bardzo fajny.", a program wyświetla "Cjbza." Nie powinien wyświetlać: "Cjtroj."? Chyba, że źle coś liczę.

 #include <iostream>
#include <fstream>
#include <string>

bool odczytajPlik(std::string sNazwaPliku)
{
    std::ifstream plik;
    plik.open(sNazwaPliku.c_str());
    if(!plik.good())
        return false;

    char znak;
    while(plik >> znak)
    {
        std::cout << znak;
        plik.seekg(3, std::ios::cur);
    }
    return true;
}

int main()
{
    if(!odczytajPlik("plik.txt"))
        std::cout << "Nie odczytano pliku!" << std::endl;
    return 0;
}
0

plik>>znak pomija białe znaki.
użyj while(plik.get(znak))

0

Ok, wszystko działa. Dzięki! :)

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