Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Rekomendowane odpowiedzi

Opublikowano

Dobry!

Chciałem napisać program losujący kilka liczba i zapisywał je do pliku, coby można je było potem odczytać. Problemem jest to, że w tym pliku nie ma żadnych liczb są tylko znaczki:   . W konsoli wszystko się wyświetla normalnie, tak jak powinno. Oto mój kod:

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main(){
    srand(time(NULL));
    ofstream save("Random Numbers.txt");

    int randomNumber = (rand() % 5 + 1);
    cout << randomNumber << " ";
    save << randomNumber << " ";
    randomNumber = (rand() % 5 + 1);
    cout << randomNumber << " ";
    save << randomNumber << " ";
    for(int i = 0; i < 100; i++){
        randomNumber = (rand() % 5 + 1);
        cout << randomNumber << " ";
        save << randomNumber << " ";
    }

    save.close();
}

Gdy usunąłem z kodu całego fora, to normalnie były dwie liczby poprawnie wyświetlone zarówno w konsoli jak i w pliku. Gdy jest z forem to w konsoli jest wszystko poprawnie, a w pliku nawet tych dwóch pierwszych liczb nie ma. Jak to poprawnie zapisać do pliku?

Opublikowano

Kod działa poprawnie, musi być coś nie tak z plikiem. Spróbuj sprawdzić, czy obiekt save jest otwarty do zapisu. Użyj operatora !, możliwe że możesz nie mieć uprawnień do zapisu w danym miejscu albo jakiś inny proces wykorzystuje plik.

http://www.cplusplus.com/reference/ios/ios/operator_not/

Myślę, że close() nie jest istotne, skoro obiekt jest lokalny, to destruktor wykona metodę close(), chyba tak to działa.

Cytat
Note that any open file is automatically closed when the ofstream object is destroyed.

http://www.cplusplus.com/reference/fstream/ofstream/close/


Pomagam w projektach dotyczących programowania (C++/C/Java/C#/inne). Jak masz jakiś problem, napisz do mnie, wspólnie poszukamy rozwiązania ;).

Opublikowano

Najlepszym rozwiązaniem jest określenie długości wiersza po przez drugą pętle for w taki sposób.

for(int i = 0; i < 10; i++){
        for(int i = 0; i <10; i++)
        {
        	randomNumber = (rand() % 5 + 1);
        	cout << randomNumber << " ";
        	save << randomNumber << " ";
		}
		save << endl;
		cout << endl;
    }

Oczywiście możesz to dowolnie zmienić i nie musi być to koniecznie macierz 10 na 10. Wtedy nie ma problemu z zapisem sprawdziłem u siebie i działa.

Opublikowano

@LesterossPlik jest otwarty do zapisu. Mam uprawnienia do zapisu w tym miejscu. Nic nie używa tego pliku. close() może istotne, może w szkole zwracali uwagę by ZAWSZE zamykać, to zamykam :D. I ostatnie: W jaki sposób tutaj użyć operatora !, do czego?

@janek095Na początku chciałem tylko wylosować, zapisać do pliku i z niego sczytać, aby zobaczyć czy wszystko poprawnie działa, ale w dalszych planach miałem zamiar zrobić dokładnie to co napisałeś :D.

Posprawdzałem jeszcze kilka rzeczy i mam nowe wnioski :D Otóż:

for(int i = 0; i < 50; i++){}

nie działa, ale:

for(int i = 0; i < 49; i++){

to już działa. Spróbowałem też ręcznie zapisać te 50 razy i wtedy też się psuje (przy 49 wszystko działa poprawnie). Gdy na samym początku dodałem coś do tego pliku (save << "Losowanie liczb";) To nawet dla tych 100 działało wszystko poprawnie. Prawdopodobnie z tym tekstem po prostu to zostawię jak się nie uda inaczej :/ Ale mimo wszystko jestem bardzo ciekawy dlaczego tak się dzieje :35_thinking: I liczę na waszą pomoc również w wyjaśnieniu tego :D.

Opublikowano

Nie wszedłeś w ten link co podałem? Tldr: operator ! Pokazuje, czy plik został poprawnie wczytany i czy nie wystąpił błąd.  Bardzo dziwne, że kod który napisałeś na początku nie działa, skoro poprawnie go skompilowałem i nie miałem żadnych problemów z jego działaniem. Czym go kompilujesz? Gdzie go uruchamiasz? Może to problem z samym plikiem źródłowym?

Może jeszcze próbuj odświeżać strumień poprzez metodę flush lub coś w tym stylu. 


Pomagam w projektach dotyczących programowania (C++/C/Java/C#/inne). Jak masz jakiś problem, napisz do mnie, wspólnie poszukamy rozwiązania ;).

Opublikowano

Przyznaje się, nie wszedłem. W Code::Blocks działam, kompilator GNU GCC Compiler. O flush nie słyszałem.

for(int i = 0; i < 100; i++){
        randomNumber = (rand() % 5 + 1);
        cout << randomNumber << " " << flush;
        save << randomNumber << " " << flush;
    }

Też nie działa.
I w pliku jest jednak 5 różnych znaczków (jak 5 różnych cyfr do losowania) tylko bardzo podobne i się pomyliłem. Jak ustawiłem na 6 różych liczb, to jest 6 znaczków.

EDIT: użyłem też tego operatora ! i nie ma błędu

ifstream is("Random Numbers.txt");
    if(!is){
        cerr << "Error opening 'Random Numbers.txt'\n";
    }

 

Opublikowano

W tym samym kompilatorze na tym samym środowisku działam, każdy wariant programu, o którym piszesz mi działa. Nie ma żadnego problemu z kodem programu. Spróbuj może skasować plik, do którego zapisujesz i odpalić program od nowa. Sprawdź jakie kodowanie ma plik, do którego zapisujesz (UTF-8? WINDOWS-1250 itp), i nie wiem, czy to ma jakiekolwiek znaczenie, ale kodowanie pliku kodu źródłowego. Co używasz do wyświetlenia liczb? Nie wiem, bo sam kod jest poprawny i działa poprawnie.


Pomagam w projektach dotyczących programowania (C++/C/Java/C#/inne). Jak masz jakiś problem, napisz do mnie, wspólnie poszukamy rozwiązania ;).

Opublikowano

Próbowałem kasować plik, zmieniałem też jego nazwę, ale nic nie dało.

Kodowanie zobaczę jutro, bo już teraz wyłączyłem komputer.

"Co używasz do wyświetlania liczb?" Chodzi o program którym otwieram plik, gdzie zapisuje liczby? Jeśli o to chodzi to zwykły notatnik.

Opublikowano

Notatnik windowsowy czyta pliki kodowaniem unicode chyba, że uda mu się rozpoznać inne. Znak 0x2030 (zero i spacja w ANSI) pasuje do Twojego problemu: https://unicode-table.com/en/#2030

Co do close(), w szkole pewnie nie nauczą Cię co to jest RAII i czytania dokumentacji, którą polecił @Lesteross (swoją drogą en.cppreference.com jest lepsze).

 

YOU MUST DIE

- Ganon, Koridai

  • PGS zmienił(a) tytuł na Zapisywanie pseudolosowych liczb do pliku
Opublikowano

Kodowanie w Code::Blocks mam UTF-8, Notatnik - UNICODE
W notatniku były znaczki, odpaliłem w Notepad++ (kodowanie - ANSI w późniejszych próbach zmieniło się na UTF-8 :35_thinking:) i W Notepad++ wszystko się wyświetlało jak powinno. Później nawet w zwykłym notatniku zaczęło się wyświetlać jak powinno. Czarna magia, ale działa :D. Ustawiłem  domyślne otwieranie plików *.txt na Notepada++ i tak zostawię i działa i jest git :D Wielkie dzięki za pomoc :D


@mirraseqYup, nigdy nie słyszałem o czymś takim RAII, a do dokumentacji odwoływałem się programując w Javie kilka lat temu. W C++ faktycznie nie wspominał mi nikt o tym i nie praktykowałem tego. Dzięki za rady ;).

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...