Odczyt i Zapis do pliku

0

Witam
Na lekcjach mam akutalnie obsługę pliku w c++
Chciałbym napisać program który wczyta zawartość pliku liczby.txt (w pliku są liczby np od 1 do 10) pokaże je na ekranie i zapisze do pliku. Programik odczytuje dobrze, jeśli nie ma pliku informuje o tym. Przy zapisywaniu jest problem. Jeśli są liczby od 1 do 10 to pierwszej nie zapisze a ostatnią dwa razy. I nie mam pojęcia jak zmienić kod programu by działał poprawnie. Zwracam się zatem do Was o pomoc.
Kod programu (OS - Linux):
[code]#include<iostream>
#include<fstream>
#include<cstdlib>
using namespace std;
int main()
{
ifstream odczyt;
int a;
odczyt.open("liczby.txt");
cout <<"odczytywanie z pliku:\n";
ofstream zapis;
zapis.open("zapis.txt");
while (!odczyt.good() )
{
cout <<"blad w odczytywaniu pliku\n";
exit(0);
}
odczyt >>skipws >> a;
while (odczyt.good())
{
cout <<a <<endl;
odczyt >>a;
zapis <<a<<" ";
}
odczyt.close();
zapis.close();
return 0;
}[/code]Co do exit(0) to nie czepiać się prosze.
Pozdrawiam

0

Hmm, sprawdziłem i wszystkie znaki czyta i wypisuje poprawnie gdy poprawisz linijkę w której ustawiasz aby pomijał białe znaki, popraw ją na:

odczyt>>skipws;
0

Zapis jest jak najbardziej poprawny, ale odczyt nie jest. Teraz próbuję to na win i odczytuje tak, ze na pierwszym miejscu gdzie powinno być 1 jest jakaś liczba kilku znakowa i nie pokazuje ostatniej. Normalnie słabi mnie mnie ta bezradność...

0

Hmm, w pierwszym poście pisałeś że odczyt jest poprawny, a zapisz coś szwankuje.
Pokaż może jak wyglądają te pliki z liczbami bo może u Ciebie wygląda to trochę inaczej?

Po drugie z tego co kojarzę, to jeśli w pliku są zapisane jakieś liczby, to separatorami między nimi są właśnie białe znaki. Ja tylko poprawiłem Twój program jak zaproponowałem wcześniej, a plik wygląda tak:
13 45 9 80 458 98 3 23 44 67
I w pliku wyjściowym otrzymuje dokładnie te same liczby (nawet jeśli przed pierwszą liczbą są spacje tabulacje itp, a także nawet jeśli całkowicie wykomentuję linijkę odczyt>>skipws

Aha, ja to testowałem w DevCpp

0
pietrekder napisał(a)

Hmm, w pierwszym poście pisałeś że odczyt jest poprawny, a zapisz coś szwankuje.
Dokładnie, ale po przerobieniu na takie jak napisałeś w Twoim pierwszym poście dzieje się właśnie tak, że odczyt szwankuje. Teraz mam taki kod i właśnie odczyt jest bezsensu. Nie wiem co robić już :/

#include<iostream>
#include<fstream>
#include<cstdlib>
using namespace std;
int main()
{
ifstream odczyt;
int a;
odczyt.open("liczby.txt");
cout <<"odczytywanie z pliku:\n";
ofstream zapis;
zapis.open("zapis.txt");
while (!odczyt.good() )
{
cout <<"blad w odczytywaniu pliku\n";
exit(0);
}
odczyt >>skipws;
while (odczyt.good())
{
cout <<a <<endl;
odczyt >>a;
zapis <<a<<" ";
}
odczyt.close();
zapis.close();
return 0;
}
0

Hmm, skopiowałem cały kod który tu pokazałeś i u mnie działa wszystko ok, pokaż jak wygląda u Ciebie ten plik tekstowy z liczbami.

0

plik liczby.txt: 1 2 3 4 5 6 7 8 9 10
plik zapis.txt: 1 2 3 4 5 6 7 8 9 10
a odczyt wygląda tak: user image
Wcześniej jeszcze na pierwszym miejscu była jakaś liczba kilku cyfrowa

0

Czyli dane w plikach są odczytywane i zapisywane poprawnie. Natomiast w pętli while gdzie masz zrobiony odczyt kolejnych liczb, musisz sobie zmienić kolejność. Bo najpierw wyświetlasz wartość zmiennej 'a', dopiero później odczytujesz z pliku jakąś wartość, popraw tą pętle tak:

    while (odczyt.good())
    {
        odczyt>>a;
        cout<<a<<endl;
        zapis<<a<<" ";
    }

Teraz już chyba wszystko powinno być ok.

0

jej ale sie cieszę :D wreszcie moge dalej się uczyć ;D Dziękuję Ci serdecznie :D
Jakby ktoś potrzebował to tu jest cały kod programu po poprawkach, działający oczywiście :)#include<iostream>
#include<fstream>
#include<cstdlib>
using namespace std;
int main()
{
ifstream odczyt;
int a;
odczyt.open("liczby.txt");
cout <<"odczytywanie z pliku:\n";
ofstream zapis;
zapis.open("zapis.txt");
while (!odczyt.good() )
{
cout <<"blad w odczytywaniu pliku\n";
exit(0);
}
odczyt >>skipws;
while (odczyt.good())
{
odczyt>>a;
cout<<a<<endl;
zapis<<a<<" ";
}
odczyt.close();
zapis.close();
return 0;
}

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