• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

odczyt i zapis z pliku do pliku

VPS Starter Arubacloud
0 głosów
1,528 wizyt
pytanie zadane 14 maja 2016 w C i C++ przez Evelek Nałogowiec (28,960 p.)

Chcę odczytać dane z jednego pliku tekstowego a następnie te same dane zapisać do innego pliku. Mój kod wygląda tak:

#include <iostream>
#include <cstdlib>
#include <fstream>

using namespace std;

int main()
{
    fstream plik;
    plik.open("111.txt", ios::in);

    string dane;

    while(!plik.eof())
    {
        plik >> dane;
            plik2.open("222.txt", ios::out || ios::app);
            {
                plik2 << dane << endl;
            }
            plik2.close();
    }
    plik.close();

    return 0;
}

Pojawia się błąd: : 'plik2' was not declared in this scope|

Dlaczego to nie działa i co to za błąd?

2 odpowiedzi

0 głosów
odpowiedź 14 maja 2016 przez Radfler VIP (101,030 p.)
Nie zdefiniowałeś zmiennej plik2....
komentarz 14 maja 2016 przez Evelek Nałogowiec (28,960 p.)

Poprawiłem na:

#include <iostream>
#include <cstdlib>
#include <fstream>

using namespace std;

int main()
{
    fstream plik;
    plik.open("111.txt", ios::in);

    string dane;

    while(!plik.eof())
    {
        plik >> dane;
            fstream plik2;
            plik2.open("222.txt", ios::app);
            {
                plik2 << dane << endl;
            }
            plik2.close();
    }
    plik.close();

    return 0;
}

Konwertuje mi ale nie przepisuje liczb z pliku 111.txt do 222.txt.

Dlaczego?

komentarz 14 maja 2016 przez Radfler VIP (101,030 p.)

A plik 111.txt na pewno istnieje? Poza tym użyj takiej pętli:

while(plik >> dane) { ... }

 

komentarz 15 maja 2016 przez draghan VIP (106,230 p.)
edycja 15 maja 2016 przez draghan

Konwertuje mi ale nie przepisuje liczb z pliku 111.txt do 222.txt.

Dlaczego?

Zrób jakąkolwiek diagnostykę w swoim programie. Sprawdzaj poprawność plików, wypisuj komunikaty.

Nie podoba mi się otwieranie i zamykanie pliku wyjściowego co iterację. Można przecież otworzyć plik przed pętlą, zrobić swoje i go zamknąć.

#include <fstream>
#include <streambuf> // do metody "deserowej"
#include <string>

int main()
{
    std::ifstream input("we.txt");
    std::ofstream output("wy.txt");
    std::string data;

    if(!input.good() || !output.good())
    {
        return 1;
    }
    else
    {
        /*
        Poniższy sposób ma jedną wadę - do pliku wyjściowego dwa razy
        zostanie zapisana ostatnia wartość. Dlaczego?
        while(!input.eof())
        {
            input >> data;
            output << data << "\n";
        }
        */

        /*
        Takie proste przepisywanie z użyciem wejścia/wyjścia formatowanego:
        */
        while(input >> data)
        {
            output << data << "\n";
        }

        /*
        Lub na deser ciekawy sposób, podpatrzony na SO, wykorzystujący
        iterator dla bufora strumienia.
        Ma tę zaletę, że nie burzy struktury pliku, bo wczytuje
        wszystkie znaki z pliku wejściowego, łącznie z białymi.

        data = std::string( (std::istreambuf_iterator<char>(input)),
                                         std::istreambuf_iterator<char>() );
        output << data;
        */
        return 0;
    }
}

 

komentarz 15 maja 2016 przez Evelek Nałogowiec (28,960 p.)
Super ten twój sposób! I przejrzyście wygląda. Dziękuje za rozpisanie tego. Wszystko zrozumiałem.

Masz rację, ostatni wiersz jest zawsze dwa razy wpisywany, dlaczego tak się dzieje to nie mam pojęcia, ale zauważyłem gdy mi się liczby o jedną nie zgadzały.
komentarz 15 maja 2016 przez draghan VIP (106,230 p.)
Ostatnia wartość ląduje w pliku wyjściowym dwa razy dlatego, że flaga eof jest podnoszona nie wtedy, kiedy przeczytasz wszystko w pliku, tylko wtedy, kiedy przeczytasz wszystko i spróbujesz wczytać jeszcze coś. Stąd pętla na końcu wykonuje się o raz więcej, niż potrzeba.

EDIT: zmieniłem jeszcze 8. linię, czyli sposób otwarcia pliku, bo mi się w nocy zaplątało niepotrzebnie ios::app.
komentarz 15 maja 2016 przez Evelek Nałogowiec (28,960 p.)
Dzięki raz jeszcze. Zaraz potestuje ten program cały.

Przy okazji, pytałem też o to: http://forum.pasja-informatyki.pl/141008/odczyt-i-zapis-kilka-metod

Bo wolę używać jednej i stałej metody, która jest poprawna, a widzę po prostu, że co programista to nową metodę wprowadza i trochę mi się już zaczyna to mieszać.
0 głosów
odpowiedź 14 maja 2016 przez Fenix Nałogowiec (26,750 p.)
Zamiast plik >> dane, użyj getline( plik, dane ) + brak zdefinowania plik2 użyj fstream plik2;
komentarz 14 maja 2016 przez Evelek Nałogowiec (28,960 p.)
Nie pomogło. Poza tym wolę stosować swoją metodę.

Podobne pytania

0 głosów
2 odpowiedzi 596 wizyt
pytanie zadane 28 lipca 2016 w PHP przez rucin96 Użytkownik (500 p.)
0 głosów
2 odpowiedzi 237 wizyt
pytanie zadane 24 maja 2016 w C i C++ przez Kacperos_89 Początkujący (400 p.)
0 głosów
1 odpowiedź 2,352 wizyt
pytanie zadane 12 października 2016 w PHP przez Ditrix Mądrala (5,650 p.)

92,830 zapytań

141,771 odpowiedzi

320,817 komentarzy

62,159 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...