konwersja pliku txt

0

Cześć Wam,

mam problem z programem, który ma na celu konwersje pliku txt w którym dane zapisane są w następujący sposób (linijka pod linijka):
1
sdf
sdf
sdf
sdf
sdf
2
qqq
qqq
qqq
qq
qq

natomiast chciałbym żeby w drugim nowo utwożonym pliku dane były zapisane tak jak poniżej czyli rozdzielone znakiem |
1|sdf|sdf|sdf|sdf|sdf|
2|qqq|qqq|qqq|qq|qq|

Poniżej załączam kod, niestety nie wiem jak ugryźć temat rozdzielenia danych od nowej linii, bo na ten moment wszystkie dane są zapisane w jednym wierszu.

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

using namespace std;

int main () {

    ifstream old_file("stary_plik.txt");
    ofstream new_file("nowy_plik.txt");

    string buf;

    while(getline(old_file, buf))
       new_file << buf + '|'; //tu jest problem

    old_file.close();
    new_file.close();

    return 0;
}
0

Czemu wynik ma być nie taki:

1|sdf|sdf|sdf|sdf|sdf|2|qqq|qqq|qqq|
qq|qq|
1
#include <fstream>
#include <vector>
using namespace std;

int main ()
{
    ifstream fin("stary_plik.txt");
    ofstream fout("nowy_plik.txt");
    for(int ch,count=0;(ch=fin.get())!=EOF;fout.put(ch)) if((ch=='\n')&&(++count>=6)) { ch='|'; count=0; }
    return 0;
}
0

@Borek1948: Czy jest tych wpisów dla danej osoby zawsze 5? Czy może po prostu zaczynają się zawsze liczbą całkowitą?

1

Prawie działa: https://godbolt.org/z/b7dT7jfeP

std::ostream& transform(std::istream& in, std::ostream& out)
{
    int x;
    std::string s;

    if (in >> x) {
        out << x;
        while (in >> x) {
            out << '\n' << x; 
        }
    }
    
    while (!in.eof()) {
        in.clear();
        if (in >> s) 
        {
            out << '|' << s;
        }
        while (in >> x) {
            out << '\n' << x; 
        }
    }


    return out;
}

"Prawie" bo są warunki brzegowe (co najmniej dwa), które fałszuje wyniki, ale wątpię, by początkujący był w stanie je wydłubać.

0

@MarekR22:

"Prawie" bo są warunki brzegowe (co najmniej dwa), które fałszuje wyniki

wejście

1
sdf
sdf
sdf
2
qqq
qqq
qqq rtyrty <- to masz na myśli ? bo w sumie tu jest spacja i powinno to być wyświetlone jako jedna kolumna
qq
qq
lll
3
hghj
4
iii

wyjście

1|sdf|sdf|sdf
2|qqq|qqq|qqq|rtyrty|qq|qq|lll
3|hghj
4|iii
0

@MarekR22:

nie, coś bardziej zmyślnego, chociaż w sumie to też można by było wziąć pod uwagę

wejście

1
sdf
sdf
sdf
2
qqq
qqq
qqq
qq
qq
3433 33 3423 2342 abc <- co jeżeli zamiast danych tekstowych będą dane liczbowe ?

wyjście

1|sdf|sdf|sdf
2|qqq|qqq|qqq|qq|qq
3433
33
3423
2342|abc
0

Po kiego zmyślacie czego autor tematu chce skoro wszystko jasne:

Borek1948 w komentarzu napisał(a):

program jest swego rodzaju ksiazka adresowa, której napisałem dwie wersje. Pierwsza zapisywała numer identyfikacyjny osoby, a pod nim kolejne dane, natomiast druga wersja programu była nieco ulepszona i zapisywała dane osoby w jednym wierszu czyli: numer identyfikacyjny i kolejno reszta danych rozdzielone znakiem |. Obecnie pracuje nad programem który umożliwi mi automatyczną konwersję danych zapisanych w pierwszy sposób tak żeby mogły być odczytane przez drugą wersję programu. Mam nadzieję, że wytłumaczyłem dość zrozumiale :) — Borek1948 2021-05-17 20:11

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