[C++] Dopisywanie do pliku

0

Witam, mam problem ze zrobieniem programu, który by dopisał do istniejącego pliku dane z innego pliku, ale nie na końcu, tylko w środku, mam za zadanie stworzyć dziennik, więc chcę, aby pierwszy plik wyglądał tak:

Nr	Nazwisko         Imie		J.Polski	Matematyka	Wychowanie-Fizyczne	Informatyka	Fizyka
1	
2	
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

I do niego chcę dopisać nazwiska i imiona w danych "kolumnach", próbowałem wczytać cały pierwszy plik i zapisać go do tablicy, dopisać do tej tablicy imiona i nazwisko, ale coś mi nie wychodzi i plik zostaje taki jaki był, tutaj kod programu (wszystko w int main, ponieważ to tylko do nauki tej części):

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()
{
    setlocale(LC_ALL,"");
    string imie[30], nazwisko[30], tablica[30][10];
    ifstream uczniowieWejscie;
    fstream uczniowie1klasa;
    fstream uczniowie2klasa;
    fstream uczniowie3klasa;
    fstream uczniowie4klasa;
    uczniowieWejscie.open("Dane\\uczniowieout.txt", ios::in);
    uczniowie1klasa.open("Dane\\dziennik klasa 1.txt", ios::in | ios::out);
    //uczniowie2klasa.open("Dane\\dziennik klasa 2.txt", ios::in | ios::out);
    //uczniowie3klasa.open("Dane\\dziennik klasa 3.txt", ios::in | ios::out);
    //uczniowie4klasa.open("Dane\\dziennik klasa 4.txt", ios::in | ios::out);
    if (uczniowieWejscie.good())
    {
        if (uczniowie1klasa.good())
        {
            for (int i=0;i<30;i++)
                for (int j=0;j<10;j++)
                    uczniowie1klasa>>tablica[i][j];
            for (int i=0;i<24;i++)
            {
                uczniowieWejscie>>nazwisko[i];
                uczniowieWejscie>>imie[i];
            }
            for (int i=1;i<30;i++)
            {
                    tablica[i][1]=nazwisko[i];
                    tablica[i][2]=imie[i];
            }
            for (int i=0;i<30;i++)
                for (int j=0;j<10;j++)
                    uczniowie1klasa<<tablica[i][j];
        }
    }
}

0

Możesz zapisywać całość od nowa lub używać funkcji seekp, seekg, tellp, tellg do porusznia kursorem po pliku.
Nie zapisało się nic, ponieważ próbujesz wczytać więcej danych niż zawiera plik - program po cichu pomija błędy przy wczytywaniu, ale nie wykonuje operacji zapisu na pliku, gdzie osiągnął EOF (cokolwiek za ostatnim bajtem pliku) i ma już ustawioną flagę, np. funkcja good() zwróci false.
Podzielenie streamów do zapisu i do odczytu może częściowo rozwiązać problem, ale narzuca szczególną uwagę przy zarządzaniu - zapis do pliku wpływa na późniejsze odczyty.
Dodatkowa uwagi:

  1. streamy pomijają białe znaki, więc pętla:
            for (int i=0;i<30;i++)
                for (int j=0;j<10;j++)
                    uczniowie1klasa>>tablica[i][j];

tak na prawdę wczyta 300 wyrazów. Przykładowy plik z pytania ma w tej interpretacji ich tylko 32: 8 nazw kolumn i 24 pozycje.
W wyniku pętli tablica[4][0] będzie miała pusty string, a np. tablica[2][2] będzie miała string "13".
2) Pętle

            for (int i=0;i<24;i++)
            {
                uczniowieWejscie>>nazwisko[i];
                uczniowieWejscie>>imie[i];
            }
            for (int i=1;i<30;i++)
            {
                    tablica[i][1]=nazwisko[i];
                    tablica[i][2]=imie[i];
            }

są tak skonstruowane, że pierwsze 2 wyrazy z pliku są wczytane do nazwisko[0], imie[0], ale w kolejnej pętli zaczynasz iterację od elementów nazwisko[1], imie[1], pomijając wcześniej wczytane wartości.
3) Streamy tak pisane do pliku sprawią, że znikną wszystkie białe znaki, więc należy samodzielnie zadbać o spacje i końce linii.

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