Ĺadny brzuch
Kod ma za zadanie modyfikować zawartość pliku poprzez:
1. Zmianę nazwy orginalnego pliku na inną (z dopiskiem "__TEMP")
2. Utworzenie nowego pliku o nazwie takiej samej jak oryginalna.
3. Kopiowanie w locie (linia po linii) zawartości z pliku "__TEMP" do pliku nowoutorzonego (z pewnymi modyfikacjami)
4. Usunięcie pliku tymczasowego (ten z dopiskiem "__TEMP")
string plik_content; ifstream i_plik; ofstream o_plik; // Otwieram i zmieniam nazwę. MoveFile("plik.txt", "plik.txt_TEMP"); i_plik.open("plik.txt_TEMP"); o_plik.open("plik.txt", ios::trunc); if(i_plik && o_plik) { // Pętla która odczytująco-zapisująca while(i_plik) { getline(i_plik, plik_content); // ... o_plik << plik_content << endl; } } // Zamykam. i_plik.close(); o_plik.close(); // Usuwam pliki tymaczasowe. DeleteFile("plik.txt_TEMP");
Kod nieco uprościłem. Wcześniej znajdował się w pętli while i miał za zadanie wykonać się dla kilkudziesięciu plików. Efekt był taki, że pierwszy plik przekopiował dobrze (z "plik.txt__TEMP" do "plik.txt") zaś cała reszta to czyste pliki o nazwie taka jak orginalna. Czy możliwe jest, że przyczyną problemu jest to, że zanim MoveFile() zdąży zmienić nazwę pliku to metoda open("plik.txt", ios::trunc) czyści plik i w efekcie MoveFile operuje już na czystym pliku ? Jak powinno wyglądać to poprawnie ?
Użytkownik nupagadi edytował ten post 04 kwiecień 2009, 10:03
Czy jest możliwe, aby program wykonał następną instrukcję (otworzył plik), nie czekając na wynik poprzedniej (MoveFile)? Zajrzyj czasem do dokumentacji. MoveFile i DeleteFile zwracają wartości, które określają czy operacje powiodły się, więc program musi zaczekać, aż cała operacja przesuwania lub usuwania zostanie zakończona.
Kod wygląda poprawnie. Zamieść ten kod, który Twoim zdaniem działa źle, a nie inny. Zanim to zrobisz, skorzystaj z debugera i przetestuj kod wykonując go instrukcja po instrukcji (np. wykonaj MoveFile i sprawdź plik został dobrze przesunięty, potem wykonaj kopiowanie i sprawdź zawartości itd.).
Użytkownik Kozack edytował ten post 04 kwiecień 2009, 14:09
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
1. Zmianę nazwy orginalnego pliku na inną (z dopiskiem "__TEMP")
2. Utworzenie nowego pliku o nazwie takiej samej jak oryginalna.
3. Kopiowanie w locie (linia po linii) zawartości z pliku "__TEMP" do pliku nowoutorzonego (z pewnymi modyfikacjami)
4. Usunięcie pliku tymczasowego (ten z dopiskiem "__TEMP")
string plik_content; ifstream i_plik; ofstream o_plik; // Otwieram i zmieniam nazwę. MoveFile("plik.txt", "plik.txt_TEMP"); i_plik.open("plik.txt_TEMP"); o_plik.open("plik.txt", ios::trunc); if(i_plik && o_plik) { // Pętla która odczytująco-zapisująca while(i_plik) { getline(i_plik, plik_content); // ... o_plik << plik_content << endl; } } // Zamykam. i_plik.close(); o_plik.close(); // Usuwam pliki tymaczasowe. DeleteFile("plik.txt_TEMP");
Kod nieco uprościłem. Wcześniej znajdował się w pętli while i miał za zadanie wykonać się dla kilkudziesięciu plików. Efekt był taki, że pierwszy plik przekopiował dobrze (z "plik.txt__TEMP" do "plik.txt") zaś cała reszta to czyste pliki o nazwie taka jak orginalna. Czy możliwe jest, że przyczyną problemu jest to, że zanim MoveFile() zdąży zmienić nazwę pliku to metoda open("plik.txt", ios::trunc) czyści plik i w efekcie MoveFile operuje już na czystym pliku ? Jak powinno wyglądać to poprawnie ?
Użytkownik nupagadi edytował ten post 04 kwiecień 2009, 10:03
Czy jest możliwe, aby program wykonał następną instrukcję (otworzył plik), nie czekając na wynik poprzedniej (MoveFile)? Zajrzyj czasem do dokumentacji. MoveFile i DeleteFile zwracają wartości, które określają czy operacje powiodły się, więc program musi zaczekać, aż cała operacja przesuwania lub usuwania zostanie zakończona.
Kod wygląda poprawnie. Zamieść ten kod, który Twoim zdaniem działa źle, a nie inny. Zanim to zrobisz, skorzystaj z debugera i przetestuj kod wykonując go instrukcja po instrukcji (np. wykonaj MoveFile i sprawdź plik został dobrze przesunięty, potem wykonaj kopiowanie i sprawdź zawartości itd.).
Użytkownik Kozack edytował ten post 04 kwiecień 2009, 14:09