Dzielenie i łączenie plików

0

Mam program, który otwiera plik, wczytuje wiersz, losuje liczbę, jeśli jest ona równa 1 to zapisuje wiersz do plik1 a jeśli nie to do plik2. W ten sposób dzieli plik losowo na dwa. Kolejność tych wylosowanych liczb odkłada na vector po czym korzystając z tej kolejności odtwarza plik pierwotny z tych dwóch na które został podzielony. Wyskakuje mi jednak taki błąd: error: no matching function for call to 'getline(std::ofstream&, std::string&)
Oto kod:

#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    string wiersz;
    int a;
    vector<int> losy;
    ifstream plik("a.txt");
    ofstream plik1("plik1.txt");
    ofstream plik2("plik2.txt");
    ofstream plik3("plik3.txt");
    while(!plik.eof()){
       getline(plik,wiersz);
       a=rand()%2+1;
       losy.push_back(a);
       if(a==1) plik1<<wiersz<<endl;
       else plik2<<wiersz<<endl;
    }
    plik1.seekp(0);
    plik2.seekp(0);
    for(int i=0;i<losy.size();i++){
       if(losy[i]==1) getline(plik1,wiersz);
       else getline(plik2,wiersz);
       plik3<<wiersz;
    }
    plik.close(); plik1.close(); plik2.close(); plik3.close();
    return 0;
}

Błąd wyskakuje w tym miejscu if(losy[i]==1) getline(plik1,wiersz); Co jest nie tak i jak to naprawić?

0

Wykorzystujesz zły strumień. Ofstream służy do zapisu do pliku, a nie odczytu.

0

To jaki mam wykorzystać?

0

Albo zamykasz strumień plik1 i tworzysz nowy, ale tym razem ifstream, albo stumień plik1 deklarujesz jako;

fstream plik1;
plik1.open("nazwa_pliku",std::ios::in | std::ios::out) 

i wtedy można tym strumieniem odczytywać i zapisywać.

0

Mam teraz coś takiego:

#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    string wiersz;
    int a;
    vector<int> losy;
    ifstream plik("a.txt");
    fstream plik1("plik1.txt");
    fstream plik2("plik2.txt");
    ofstream plik3("plik3.txt");
    while(!plik.eof()){
       getline(plik,wiersz);
       a=rand()%2+1;
       losy.push_back(a);
       if(a==1) plik1<<wiersz<<endl;
       else plik2<<wiersz<<endl;
    }
    plik1.seekp(0);
    plik2.seekp(0);
    for(int i=0;i<losy.size();i++){
       if(losy[i]==1) getline(plik1,wiersz);
       else getline(plik2,wiersz);
       plik3<<wiersz;
    }
    plik.close(); plik1.close(); plik2.close(); plik3.close();
    return 0;
}

To działa, tylko że te pliki pomocnicze plik1 i plik 2 muszą być utworzone przeze mnie wcześniej nie tworzy ich program da się to jakoś zmienić by to program je tworzył, coś do nich zapisywał a potem to coś odczytywał?

0

fstream plik1("plik1.txt",ios::out);

0

Czyli to samo co ja proponowałem, tylko u mnie strumień może działać w obie strony.

0

Prawie to samo ale nie to samo, a prawie jak wiadomo stanowi dużą różnicę.
W twoim przykładzie jeżeli plik nie istnieje to się nie stworzy. W moim stworzy się, a właśnie o to pytał autor.
Nie wspominając już o nieścisłościach ma być tak:

std::fstream plik1;
plik1.open("nazwa_pliku",std::ios::in | std::ios::out);

lib tak:

fstream plik1;
plik1.open("nazwa_pliku",ios::in | ios::out);

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