Wpis z mikrobloga

#cpp #programowanie

char znak[16];

// init

for (int i=0; i < 16; i++)

{

znak[i] = rand()%26 + 65;

if (znak[i] > 90 || znak[i] < 65) {znak[i] ='g'; } //chwilowe

}

cout << znak << endl;

strcat(znak,".txt");

ofstream outFile(znak);

cout << znak << endl;

`if (counter >= 10)

{

outFile.close();

for (int i = 0; i < 16; i++)

{

znak[i] = rand()%24 + 65;

if (znak[i] > 90 || znak[i] < 65) {znak[i] ='g'; } //chwilowe

}

// cout << znak << endl;

strcat(znak,".txt");

ofstream outFile(znak);

counter = 0;

}`

Mirki, co tu jest źle? Pierwszy kod wykonuje się na początku programu, drugi już później (kiedy counter będzie >= 10). Założenie jest takie, że ma mi tworzyć pliki txt o losowej nazwie złożonej z 16 dużych liter. Do plików "ręcznie" wpisuję cyferki, a gdy będzie ich odpowiednia ilość, chcę zamknąć plik txt, utworzyć następny i wpisywać do niego.

Otrzymuję 16 literowe ciągi dużych liter, potem 3 losowe znaki i .txt.
  • 19
@Noct: zrób sobie osobną funkcję do generowania stringów o losowej zawartości.

Błędnie uƶywasz

strcat
- wychodzisz poza zakres. W ogóle uƶywaj

std::array
zamiast c-tablic. (albo jeszcze lepiej

std::string
chyba, ƶe faktycznie 16 znaków ma zawsze być)

Dodatkowo:

https://wykop-code.appspot.com/

Nie uƶywaj

rand
(C++ ma ).

Nie uƶywaj wartości liczbowych do porównania z literami - C++ nie gwarantuje ASCII.
@Noct:

Mirki, co tu jest źle?


no właśnie może ty nam powiesz w czym masz problem ;).

tablica znak jest c-stringiem czyli powinna mieć 0 na końcu, czy na pewno tak jest? czy ma odpowiedni rozmiar żeby pomieścić 16 znaków + ".txt" + "\0"
@niedajerady:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

:P

@japer:

1. ma tworzyć plik tekstowy o nazwie [16 losowych dużych liter][.txt]

-tutaj możliwość wpisywania do pliku

2. ma zamykać poprzedni plik, tworzyć plik tekstowy o nazwie [16 losowych dużych liter][.txt]

-tutaj możliwość wpisywania do pliku

W skrócie - tworzy się plik, klikam guziczki, wszystkie się w nim zapisują. Gdy kliknę ich już 10,
@Noct: zapomniałeś o terminatorze stringa. Ostatni znak w stringu musi mieć wartość 0 + strcat też ci rozwala zmienną. Więc weź sobie nie żałuj i ustaw wielkość tablicy na 21, a za pętlą zakończ string poleceniem: znak[16] = '\0';
@inflo: @inplaz: @KrzaQ2:

Faktycznie, zapomniałem o powiększeniu zmiennej tak, aby pomieściła jeszcze 4 znaki więcej.

Teraz mam

strcat(znak,".txt");

znak[20] = '\0';

ofstream outFile(znak);

Tworzy ładnie pliki, w odpowiednim czasie, jednak tylko pierwszy z nich jest wypełniany.
@Noct: funkcja strcat sama dodaje \0 na końcu. ważne żeby twój napis był zakończony tym znakiem przed wywołaniem strcat. czyli:

znak[16] = '\0';

strcat(znak,".txt");

ofstream outFile(znak);
@inplaz: To już zrobione. Teraz zostaje rozwiązać problem pustych plików (oprócz pierwszego), tworzone są normalne .txt z dobrą nazwą, jednak mają rozmiar 0B...
@Noct: to pokaż kod odpowiedzialny za zapis.

ale wnioskując po tym kodzie który podałeś to dalej zapisujesz do pierwszego pliku.

w drugiej części twojego kodu masz:

ofstream outFile(znak); w linii 31

nie jest to jednak ta sama zmienna co:

ofstream outFile(znak); w linii 13

drugi outFile jest tworzony w if'ie i taki ma zasięg (w tym czasie "przysłania" poprzedni outFIile), jeśli coś zapisujesz do outFile poza if'em to korzystasz ze zmiennej
@Noct: zamiast

ofstream outFile(znak);

w if'ie wstaw

outFile.open(znak);

lub

outFile = ofstream(znak);

ale wcześniej nie zapomnij jeszcze zamknąć poprzedniego pliku.
@inplaz: Świetnie, działa.

Ostatnia rzecz: pętla główna programu to while(true), ktora wykonuje się cały czas, aż do momentu:

if(sf::Keyboard::isKeyPressed(sf::Keyboard::Tilde))

{cout<

Wciskając tyldę, program zatrzymuje się poprawnie, poprawnie zamyka ostatni plik, wszystko inne jest ok, oprócz tego, że potem wywala komunikat ""Aplikacja" przestała działać poprawnie".

próbowałem zamiast return(null) wrzucać break (po while(true) jest juz tylko return 0 i koniec aplikacji), to samo.