C++ kopiowanie pliku z zapętleniem

0

Proszę Was o pomoc bo odbiło mi by się brać za to o 3 w nocy ;/ Chciałem sobie zrobić na własny użytek (nie komercha ani do szkoły) program formatujący mi pewien szablonowy tekst w konkretny sposób. I robiąc to w nocy za bardzo się zamotałem i nawet czytanie zbliżonych tematów na waszym forum nie rozjaśnia mojego zaćmienia. Program kompiluje się ale nie robi tego co chcę :( poniżej wklejam treść i skasuję to co chyba zbędne...

może tak co on robi w założeniu:
1.obrabia plik dane.txt i zapisuje swój wynik do pomoc.txt
2.obrabia pomoc.txt i zapisuje część tego pliku do wynik.txt a resztę do pomoc2.txt
3.przekopiowuje pomoc2.txt do pomoc.txt (pomoc2 jest mniejszym plikiem niż pomoc)
4.trzeba zapętlić krok 2 i 3 aż plik pomoc.txt będzie pusty.
i wykrzaczam się na kroku 3-4 ale nie bardzo wiem gdzie. Strumienie nigdy nie były moją mocną stroną a teraz zachciało mi się eksperymentować z plikami. CopyFile też mi nie zdawało pożądanego rezultatu chyba że źle stosowałem.

#include <fstream>
#include <iomanip>

using namespace std;

int main(){
	const int size = 20000;
	
	char nameFile[size];
	char nameFile2[size];
	char nameFile3[size];
	char nameFile4[size];
		
	strcpy(nameFile,"dane.txt"); //nazwa pliku wejściowego
	strcpy(nameFile2,"wynik.txt");//plik wynikowy
	strcpy(nameFile3,"pomoc.txt");//plik pomocniczy
	strcpy(nameFile4,"pomoc2.txt");//plik pomocniczy
	
	ifstream wejscie(nameFile);
	ofstream wyjscie(nameFile3, ios::out);
	
	//tufragment który działa - pracując na dane.txt zapisuje wynik do pomoc.txt
	
	wejscie.close();
	wyjscie.close();
	
	//i teraz coś psuję :| nie wiem czy poprawnie zapętlam to - chcę by stworzyć pętlę póki 
	//plik pomoc.txt nie jest pusty ale w pętli będę na nim pracował i go nadpisywał otwierając i zamykając
	
	wejscie.open(nameFile); //nie miałem lepszego pomysłu więc złapałem cokolwiek
	while(!wejscie){
	wejscie.close();

	ifstream wejscie2(nameFile3);//wejscie po lekkiej obrobce
	ofstream wyjscie2a(nameFile2, ios::app);//wyjscie koncowe
	ofstream wyjscie2b(nameFile4, ios::out);//wyjscie z etapem czesciowym

	//tu fragment który się poprawnie wykonuje aktualizując wynik.txt a niewykorzystane dane zapisuje w pomoc2.txt	
	
	wejscie2.close();
	wyjscie2b.close();
	wyjscie2a.close();
	//zamykam aby wszystkie pliki mi się ponadpisywały

	//i teraz pies pogrzebany

	//teraz fragment kontroli :
	system("pause");
	if(!wejscie2)
		printf("lipa0\n");
	if(!wyjscie2b)
		printf("lipa-1\n");
	//skoro zamknąłem strumienie to chyba powinno mi wypisać oba printfy a wypisuje "lipa0"

	//chce przekopiowac file4 do file 3 (pomoc2.txt do pomoc.txt)
	wejscie2.open(nameFile4, 'r');
	wyjscie2b.open(nameFile3, 'w');
	//również etap kontrolny:
	if(!wejscie2)
		printf("lipa1\n");
	if(!wyjscie2b)
		printf("lipa2\n");
	//i nie powinien mi nic wypisać tylko je poprawnie otworzyć, natomiast wypisuje mi "lipa1"
	
	//teraz przekopiowanie plików ale skoro źle otworzył to w drugim obrocie pętli zeruje mi te pliki :(
	char buff;
	while (!wejscie2.eof()){
	   wejscie2 >> buff;
	   wyjscie2b << buff;
	 }
	wejscie2.close();
	wyjscie2b.close();
	wejscie.open(nameFile3);//a to rzekomo aby zapętlić względem nameFile3 czyli pomoc.txt
	}
	return 0;
}

Może wystarczy że się wyśpię i jutro sam zobaczę rozwiązanie ;) ale obawiam się że nie dlatego zwracam się do was o pomoc najlepiej językiem dla laika bym nie musiał odpalać googli by zrozumieć waszą odpowiedź :D

chciałbym to dziś skończyć bo niedziela zajęta a od poniedziałku studia i pewnie nie będzie już czasu, więc jak dziś nie zrobię to pewnie rzucę to w czorty aż do wielkanocy a szkoda by było bo nockę na to straciłem :/ ale z góry dziękuję za każdego posta z sugestią/wyjaśnieniem :)

0

Według mnie:

        wyjscie2b.close();
        wyjscie2a.close();
        //zamykam aby wszystkie pliki mi się ponadpisywały
 
        //i teraz pies pogrzebany
 
        //teraz fragment kontroli :
        system("pause");
        if(!wejscie2)
                printf("lipa0\n");
        if(!wyjscie2b)
                printf("lipa-1\n"); 

Dlaczego oczekujesz, że !wejscie2 zwróci TRUE? Powinieneś raczej użyć !wejscie2.is_open(). Zwraca Ci !TRUE bo obiekt wejscie2 istnieje i nie jest NULL.

W momencie wejscie2.close() plik już nie jest powiązany z Twoją zmienną.

void close ( );
Close file
Closes the file currently associated with the object, disassociating it from the stream. Any pending output sequence is written to the physical file.

Źródło:
http://www.cplusplus.com/reference/iostream/ofstream/close/

Przy otwieraniu poniżej to samo robisz.

0

zastosowałem się do sugestii i ok widzę że pliki w odpowiednich momentach są zamknięte bądź otwarte .... zatem chyba problem tkwi w tym fragmencie :

	wejscie2.open(nameFile4, 'r');
	wyjscie2b.open(nameFile3, 'w');
	//pliki są poprawnie otwarte
	char buff;
	while (!wejscie2.eof()){
	   wejscie2 >> buff;
	   wyjscie2b << buff;
	 }
	wejscie2.close();
	wyjscie2b.close();

i w tym momencie on nie wchodzi do pętli while mimo że plik nameFile4 nie jest pusty

	char buff;
	while (!wejscie2.tellg()){
	   wejscie2 >> buff;
	   wyjscie2b << buff;
	 }

wchodzi ale nie wychodzi z pętli while :(

1.jak mogę poprawnie przekopiować plik nameFile4 do nameFile3 (to są zwykłe pliki tekstowe)?? :(

znacząca większość tego programu siedzi w pętli która też działa dla mnie odwrotnie niż powinna :(

	ifstream wejscie(nameFile, 'r');
	ofstream wyjscie(nameFile3, ios::out);
	//...	
	wejscie.close();
	wyjscie.close();
		
	printf("nameFile3 zapisany\n"); system("pause");
	wejscie.open(nameFile3);
	if(wejscie.is_open())
		printf("nameFile3 - otawrty\n"); system("pause");
	while(!wejscie.eof()){
		wejscie.close();
	//...

to nie wchodzi do while a jeśli w warunku napiszę wejscie.eof() to wchodzi do pętli - w moim rozumieniu powinno być dokładnie odwrotnie :(
2.czemu dzieje się odwrotnie niż powinno lub czemu jestem w błędzie myśląc że powinno się dziać odwrotnie?

0
  1. Zakładam, że chcesz skopiować cały plik. Możesz użyć CopyFile() zamiast samodzielnie kopiować strumień.
 CopyFile(nameFile4, nameFile3, false); // false - nadpisze plik gdy istnieje
  1. Czy plik na pewno nie jest pusty? Jeżeli coś jest w pliku w momencie otwarcia to nie powinno się tak dziać.

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